{{tag>nginx gentoo linux}} # nginx で proxy 経由のアクセスの リアル IP を取得する reverse proxy が置いてある環境では、放っておいたらバックエンドの nginx のログではアクセス元の IP が全部 reverse proxy の IP になってしまいますよね。これをなんとかしましょう、というおはなしです。 フロント(reverse proxy)もバックエンドも nginx を使用する前提です。 ## フロント(reverse proxy)の設定 nginx.conf に、こんな設定を入れます。 ``` location / { proxy_pass http://backend/ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; : : ``` ### proxy_set_header バックエンドに投げるリクエストのヘッダに `X-Forwarded-For` を追加して、そこにアクセス元のリアル IP を詰めるようにする設定です。 ## バックエンドの設定 フロントが `X-Forwarded-For` に詰めてくれたリアル IP を、ログの表示に使っている `$remote_addr` に使用するような設定を入れます。 この設定は nginx が http\_realip\_module 付きで make されている必要があります。gentoo ならこんな感じです。 ``` # USE=realip emerge -av nginx ``` さてバックエンド側の nginx.conf にこんな設定を入れます。 ``` http { set_real_ip_from rev.proxy.ip.addr/32; real_ip_header X-Forwarded-For; : : ``` この項目は `http` `server` `location` のどこにでも置けるようです。[Module ngx_http_realip_module](http://nginx.org/en/docs/http/ngx_http_realip_module.html) ### set_real_ip_from 英語の説明もイマイチよくわからない((置き換え用のリアル IP を送ってくると信用できる IP を設定する???))のですが、ここにはフロントの IP アドレスを設定します。要は、いままでバックエンド側のログに表示されていたアクセス元の IP ですね。 ### real_ip_header これは、先にフロント側で設定しておいた `X-Forwarded-For` ですね。リアル IP が入っているリクエストヘッダの名前を指定します。 ## 反映させる フロントとバックエンドの両方で、nginx の設定を反映させます。 ``` # nginx -t # systemctl restart nginx ```