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お高いから、色んな開発環境のインスタンスを振分けしているため

【参考リンク】
SELinuxのポリシー
CentOS 7: SELinuxの使い方 - Narrow Escape

詳解 Tomcat

詳解 Tomcat

サーバ構築の実際がわかる Apache[実践]運用/管理 (Software Design plus)

サーバ構築の実際がわかる Apache[実践]運用/管理 (Software Design plus)

  • 作者:鶴長 鎮一
  • 発売日: 2012/03/23
  • メディア: 単行本(ソフトカバー)
せんとくん問題どうしたらええんやろか( ¨)