nginxのリバースプロキシで正しいIPアドレスを設定する

リバースプロキシとかLBとかを挟むと当然アクセスIPアドレスがlocalhostになってしまうので、正しいアクセス元のグローバルIPアドレスを設定する必要があります。普通はX-Forwarded-ForというhttpヘッダにグローバルIPを渡して後方のwebサーバーでそれを拾うという段取りになります。

nginxの設定

nginxの方の設定ではserverのプロキシのヘッダに設定してあげます。$proxy_add_x_forwarded_forでグルーバルIPが拾えるのでそれをそのままX-Forwarded-Forにセットします。

server{
    server_name    example.com;
    return 301 https://$host$request_uri;

    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; ←これ追加

    access_log  /var/log/httpd/front_webserver_nginx-access_log;

    location / {
        proxy_pass    http://localhost:8080/;
        proxy_redirect off;
    }

    location /foobar/ {
        proxy_pass    http://localhost:8081/foobar/;
        proxy_redirect off;
    }
}

再起動忘れずに。

# systemctl restart nginx.service

Apacheの設定

今度はヘッダのX-Forwarded-Forを受けてあげます。ここでの用途は通常、アクセスログやIP制限などになるかと思います。
ログフォーマットはこんな感じにしておく。

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-Forwarded-For}i\"" combined_proxy

combined_proxyにしておいた方がわかりやすくて無難かと。
ログの方では、

CustomLog /var/log/httpd/localhost-access_log combined_proxy

とかにしておく。Errorログには触れてませんが、Errorログも同じようにしておけばいいです。
ErrorLogFormat Directive

再起動を忘れずに。

# systemctl restart httpd.service

PHPとかアプリケーション側で取得する

さて先のX-Forwarded-Forはアプリケーション側でどうやって取得するのかというと、普通にヘッダから取り出せばいいだけです。


Apache デバッグ

Last update: 2018.11.07 (水)