![CentOS の Nginx でリバースプロキシが動作しないときは httpd_can_network_connect を確認する](/image/2019/08/httpd.png)
CentOS の Nginx でリバースプロキシが動作しないときは httpd_can_network_connect を確認する
CentOS 7 の nginx でリバースプロキシが効かないときは
sudo setsebool -P httpd_can_network_connect 1
を試すとうまくいくかもしれない。これは selinux がアプリケーションに http 通信を許可するための操作である。
以下は憶測が入っているため正確さに欠ける。
httpd_can_network_connect
nginx でリバースプロキシを使うときは
listen 80;
server_name 123.456.789.135;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_pass http://127.0.0.1:8080;
}
などとする。アドレス 123.456.789.135 に http 通信があったら、それを 127.0.0.1:8080 に流すはずだ。しかし一部のマシンはデフォルトで阻止しているらしい。これは
getsebool -a | grep httpd
で httpd の設定を見るとわかる。
httpd_can_network_connect --> on
となっていたらリバースプロキシはうまくいく。
![](/image/2019/08/httpd.png)
これが off になっていたらうまくいかない。これを on にするのが、最初に書いた
sudo setsebool -P httpd_can_network_connect 1
である。
httpd_can_network_connect ...
Allow HTTPD scripts and modules to connect to the network.
そもそもアプリケーションは 127.0.0.1:8080 に応答しているか
ここからは nginx が動作しないで焦っている人に向けたもう一つの重要な確認。そもそも nginx が正常かどうかを確かめるために
curl -i http://127.0.0.1:8080
でアプリケーションが応答するか、つまり html を返すか確認しないといけない。これでなにも返らなかったら nginx の設定に誤りがあるかもしれない。
「アプリケーションが正常にレスポンスするのに、外部のアドレスからはアクセスできない」という問題が今回とりあげた selinux である。