Irohabook
0
2061

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

となっていたらリバースプロキシはうまくいく。

httpd_can_network_connect

これが off になっていたらうまくいかない。これを on にするのが、最初に書いた

sudo setsebool -P httpd_can_network_connect 1

である。

httpd_can_network_connect ...

Allow HTTPD scripts and modules to connect to the network.

SELinux Booleans

そもそもアプリケーションは 127.0.0.1:8080 に応答しているか

ここからは nginx が動作しないで焦っている人に向けたもう一つの重要な確認。そもそも nginx が正常かどうかを確かめるために

curl -i http://127.0.0.1:8080

でアプリケーションが応答するか、つまり html を返すか確認しないといけない。これでなにも返らなかったら nginx の設定に誤りがあるかもしれない。

「アプリケーションが正常にレスポンスするのに、外部のアドレスからはアクセスできない」という問題が今回とりあげた selinux である。

次の記事

NGINX