晴耕雨読

working in the fields on fine days and reading books on rainy days

Nginxでリバースプロキシ

Nginxを使って、同一サーバ内でリバースプロキシをするための設定について説明します。 ここでは、80番ポートへのアクセスを3131番ポートに繋ぐ方法を説明します。

まず、設定ファイル nginx.conf を修正して、upstream にフォワード先を指定します。 そして、location の中に proxy_pass を指定します。

/etc/nginx/nginx.conf

http {
    ...

    upstream myapp {
        server 127.0.0.1:3131;
    }

    server {
        listen  80 default_server;

        location / {
            proxy_pass http://myapp;
        }
    }
}

nginxの設定をしたら、サービスを起動させて、ssコマンドで 80 と 3131 が LISTEN になっていることを確認します。

~]# systemctl restart nginx

~]# ss -talpn
State   Recv-Q  Send-Q  Local Address:Port  Peer Address:Port  Process
LISTEN  0       128           0.0.0.0:80         0.0.0.0:*      users:(("nginx",pid=2416,fd=8),("nginx",pid=2415,fd=8))
LISTEN  0       128                 *:3131             *:*      users:(("httpd",pid=2223,fd=4),("httpd",pid=1765,fd=4),("httpd",pid=1764,fd=4),...)

Apache側のアクセスログを開いておきます。

~]# tail -f /var/log/httpd/access_log

curlでNginxのリバースプロキシにアクセスします。

~]$ curl 127.0.0.1/

SELinuxが有効な場合

SELinuxが有効になっている場合、Nginxプロセスは httpd_t タイプに紐づけられており、デフォルトでは別ホストやポートへのネットワーク接続ができません。 Nginxをプロキシサーバとして動かす際は、ブール値 httpd_can_network_relay を On にするだけで、SELinuxで許可されるようになります。

~]# setsebool -P httpd_can_network_relay 1

その他SELinux関連で問題がある場合は、sealertコマンドでアクセス拒否の有無を確認します。

~]# sealert -l "*"

以下のような出力・提案があれば、指示通りに従ってSELinuxのアクセス許可を実施します。

SELinux により、nginx による name_connect アクセスが、tcp_socket port 3131 で拒否されました。

...省略...

*****  プラグイン catchall_boolean (24.7 信頼性) による示唆********************************

allow httpd to can network relay をする場合
このようにします: 'httpd_can_network_relay' boolean を有効にして、 これを SELinux で有効にします。

そして、以下を実行します: 
setsebool -P httpd_can_network_relay 1

以上です。

参考文献