Apache httpdとtomcatの連携で泥沼にはまった話
とあるBIパッケージソフトをAWSのEC2上でサービスすることになりアプリのインストールやら環境構築してるときの話。
構成としては以下のような感じ。
クライアント - (インターネット) - ALB - EC2
クライアントからはHTTPSで通信、ALBでSSL終端し、ALBとEC2はHTTPで通信させる、ALBのリスナーとターゲットの設定さえ間違えなければ問題はおきないだろうなって思ってた。
けどここで問題が発生。BIアプリでログイン後にリダイレクト処理が発生して、その時にリダイレクト先がHTTPになっており、リダイレクト後にALBでHTTPSに対してHTTPで通信してくんなボケって弾かれてしまう。
そのBIアプリはtomcatのみで動いていて、最初はtomcatの設定でどうにかならんか調べてたけど解決策がみつからず。一応、正式ではないからサポートはしないけど技術的にはApacheと連携させてSSL通信させることは可能だよってドキュメントが出てたので、んじゃApache httpdでリバプロの設定してHTTPを全部HTTPSに変えてしまおうと考える。
んでドキュメントに則ってtomcatのserver.xmlやらApache httpdのhttpd.confを編集して見たけどな~~んか動かない。
どうしてどうしてで数日経ったんだけど結論としてはtomcatのserver.xmlのconnectorタグの内容が間違ってた。
まじで何やねん俺の数日返してくれって思った。
というわけでserver.xmlについてやったこと。以下がデフォルトだとコメントアウトされていたので有効にする。
<Connector protocol="AJP/1.3"
port="8009" ←なぜかここが8109になってた
redirectPort="8443"
secretRequired="false" />
有効になっていたそのアプリデフォルトのポートをコメントアウトする。
<!--
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
-->
apacheのhttpd.confにしたこと。
まずはListenポートの変更。
#Listen 80
Listen 8080
tomcatとのつなぎの設定。まずはProxyのモジュールの有効化。
LoadModule proxy_module modules/mod_proxy.so ←コメントアウトを外す
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so ←コメントアウトを外す
LoadModule headers_module modules/mod_headers.so ←コメントアウトを外す
ついでにこれから作るconfが読み込まれるようにhttpd.confの任意の場所に以下追加。
Include conf/extra/これから作るファイル.conf
んで上記のこれから作るファイル.confを作る。
<Location /hogehoge>
ProxyPass ajp://localhost:8009/hogehoge
ProxyPassReverse ajp://localhost:8009/hogehoge
Header edit Location ^http:// https://
</Location>
ここで8009指定しておきながらtomcatのserver.xmlで8109で待ち受ける設定なっており、それに気づかず…ってところ。あっちを8009に修正したらちゃんと疎通できた。
そして元々の要望だったHTTPにリダイレクトされちゃうのを強制的にHTTPSに書き換えるというのも併せて設定。
このやり方がベストプラクティスなのかは知らん。
apache側のエラーログで「接続を拒否されました~~」的なログが出ていたのでどう考えてもtomcatへの接続で問題起きてるよな~~Windowsのファイアウォールか?localhostなのに?とか思いながらチェックしてたらふと気づいたという感じでした。これに何日かかったよ。
実機確認せずに思い出しながら書いてるのでどこか間違えてるかも。
在宅だったので間違いに気づいた時に机バンバンしちゃったし、気づいて修正してうまく動いたら立ち上がってガッツポーズしちゃったし。
中小企業の情シスってこういう技術的なところはアウトソースしてプロマネ的な動きすることが多そうだと勝手に感じてるだけどやってること駆け出しのインフラエンジニアで笑う。
この記事が気に入ったらサポートをしてみませんか?