Apache2.4でのtomcat連携で内部ELBを使うと「too long」のエラーが出る
インフラエンジニアの伊藤です。
AWSのサーバー構成で、Webサーバでアクセスを受けて、後ろにあるアプリケーションサーバーに対してリクエストをプロキシする
という構成はよくあると思います。
その際に、やっぱり可用性を考慮すると、各サーバは冗長化するほうがいいですよね。
ってことはこんな構成。
WebサーバとしてApacheを使っていて、アプリケーションサーバはtomcatを使う
こんな構成もよくあると思います。
で、Apacheがtomcatに投げるときにハマったので、その解決策を残しておきたいと思います。
ProxyPassの設定でハマった
Apacheのバーチャルホストに、受けたリクエストをtomcatに流す記載をします。
ProxyPass / ajp://internal-elb-xxxxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com:8009/
ProxyPassを使って、アクセスが来たものをajpの8009ポートにリクエストを投げています。
「internal-elb-~~」と書かれているのは、内部ELBになります。
ただし、この状態でApacheのシンタックスチェックをすると以下のようにエラーが出力されます。
# httpd -t ProxyPass worker hostname (internal-elb-xxxxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com) too long
ProxyPassに投げるホスト名が長すぎる…
そんなこと言われたって、内部ELBのホスト名ってこんな感じなるし、IPアドレスも固定じゃないし、どうすりゃいいねん!!
となってしまいました。
Rewriteルールで対応
今回の構成では、ProxyPassでtomcatに向けてそのまま投げてくれたらOKなので、
下記のルールに変更しました。
RewriteEngine on RewriteRule ^/(.*)$ ajp://internal-elb-xxxxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com:8009/$1 [P,L]
rewriteルールを使います。
rewriteとして、全てに来たらajpに対して投げる、というようなルールです。
これで無事ApacheのリクエストをTomcat(内部ELB)に投げてくれるようになりました。
この記事がお役に立てば【 いいね 】のご協力をお願いいたします!