ApacheとTomcatのajp通信がうまくいかない

事象

CentOS7環境下で、Apache HTTP Server(以下httpd)とTomcatAJP通信で接続をさせたい。
しかしながら、500エラーばかりが返ってくる。
httpdのログを確認すると、以下の様なメッセージが出力されていた。

[proxy:error] Permission denied: AH00957: AJP: attempt to connect to 127.0.0.1:8010 (localhost) failed
[proxy_ajp:error] AH00896: failed to make connection to backend: localhost 

原因

SE Linuxが有効化されており、httpdTomcat間のAJP通信が遮断される設定だったため。

対応方法

httpd_can_network_connectを許可する。

一時的対応
setsebool httpd_can_network_connect=true 
恒久的対応
setsebool -P httpd_can_network_connect=true

tips

SE Linuxが有効化どうか確認方法
getenforce 

www.atmarkit.co.jp

SE Linuxのポリシー確認方法
getsebool -a
getsebool  ポリシー名

同じタイミングで他にもやらかしてたこと

Tomcatのポート番号が重複

内容

同一LinuxTomcatを複数台立てていた。
それぞれにajp通信の設定を行っていたが、どちらも8009で設定していた。
そのため、そもそも後から立てたサーバーのTomcatが起動してなかった。

対応方法

(server.xml)

<Connector protocol="AJP/1.3"port="8010"

httpdのポートフォワード指定方法が重複

内容

複数台のコンテキストパス名が同じところを指していた
(proxy_ajp.conf)

#Tomcat1号機
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/

#Tomcat2号機
ProxyPass / ajp://localhost:8010/
ProxyPassReverse / ajp://localhost:8010/
対応方法

色々やり方あるであろうが、今回はコンテキストパスを書くことにした
(proxy_ajp.conf)

#Tomcat1号機
ProxyPass /hoge ajp://localhost:8009/hoge
ProxyPassReverse /hoge ajp://localhost:8009/hoge

#Tomcat2号機
ProxyPass /hogehoge ajp://localhost:8010/hogehoge
ProxyPassReverse /hogehoge ajp://localhost:8010/hogehoge

TomcatのsecretRequired属性がtrueのまま

内容

httpdのproxy_ajp.xmlの設定は上述のままである。
しかし、TomcatのConnectorタグの属性にsecretRequiredを定義していない。
Tomcat9.0.31よりsecretRequiredのデフォルト値はtrueであり、httpdおよびTomcatにシークレットキーを指定する必要がある。

対応方法

このサイトの説明が綺麗であった
qiita.com

httpdのIP(lproxy_ajp)のaddress指定方法が不適切

内容

(正直ここは結果論であまり理解しきれていない)
Apacheのproxy_ajp.xmlではlocalhostと定義していた。
そのため、TomcatのConnectorのaddress属性も127.0.0.1と指定していた。
しかしながら、この方法では弾かれてしまった。

対応方法

IPv4指定ではなく、IPv6指定に変更したらうまくいった(っぽい)
(server.xml)

<Connector protocol="AJP/1.3"address="::1"

ELBの設定が歯抜け

内容

利用している環境は、端末 -> ELB -> EC2(httpd & Tomcat) な環境であり、基本httpsでアクセスしている。
そのため、アクセスする際にhttpsで対応する必要がある。
しかし、誤ってhttpでアクセスを行っていた。
ELBのデフォルトターゲットグループには開発環境の親玉鯖を設定している。
結果、エラーをひたすら返却していたのは設定いじっているサーバーではなく、親玉鯖であった。。

対応方法
  • httpsでアクセスすると共に、
  • httpでアクセスする際のELBの設定も正しく設定する

 (httpのデフォルトターゲットグループを触るには、ELBの設定いじるのが怖いため[※1])

※1
ELBお高いから、色んな開発環境のインスタンスを振分けしているため