nginxについてのメモ(主にproxyとreal_ip)
更新履歴
- 2023/5: 変数の調査について書き忘れていたので、追記した。
構成
リバースプロキシ <--> nginx <--> webapp
という構成で、真ん中にあるnginxのconfファイルの例を残しておきたい。リバースプロキシでhttpsは終端しているので、nginxでは、httpを扱えばいい。nginxもリバースプロキシとして動作している。
また、nginxのreal_ip
モジュールを使って、クライアントのIPアドレス(正確にはリバースプロキシへアクセスしたIPアドレス)を取得できるようにする。
nginxはDockerイメージを利用して、環境変数を埋め込んだdefault.conf.template
などのテンプレートファイルをnginxコンテナの/etc/nginx/templates/
に配置することでconfファイルを展開している。
設定例
以下に設定例を記録する。適宜コメントで効果をメモしている。
set_real_ip_from a-reverse-proxy; # ホスト名で指定している
real_ip_header X-Forwarded-For; # リバースプロキシはX-Forwarded-ForにクライアントIPアドレスを記録する
real_ip_recursive off; # 手前にあるリバースプロキシは1つなのでoffにする
upstream backend {
server webapp:8080; # webappは8080で待ち受けている
}
server {
listen 80;
server_name ${NGINX_HOST}; # テンプレートを使って埋め込み
error_log /var/log/nginx/error.log warn;
access_log /var/log/nginx/access.log combined;
# locationは必要に応じて変更する
location / {
# webappが簡単に取得できるように設定している
# X-Real-Ipとは役割が違うことに注意する
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1; # デフォルトは1.0
# 以下はコピペ(出所不明)
# 慣例に従っている
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# ホスト名をそのまま渡すため。指定しないとホスト名がbackendという扱いになる
proxy_set_header Host $http_host;
# リダイレクト時にLocationなどを書き換えをしない
proxy_redirect off;
proxy_pass http://backend;
}
}
変数の値のチェックなど
変数の調査などは、レスポンスのヘッダに埋め込むか、ログに出力するのが一般的だと思う。レスポンスに埋め込むのならこのような感じで:
location / {
# ...
add_header X-header-proxy_add_x_forwarded_for $proxy_add_x_forwarded_for;
add_header X-header-remote_addr $remote_addr;
add_header X-header-document_uri $document_uri;
add_header X-header-realip_remote_addr $realip_remote_addr;
add_header X-header-proxy_host $proxy_host;
add_header X-header-http_host $http_host;
}
などとする。もちろん本番環境ではしない。実際に目で見た方が仕組みがわかりやすい。既存のヘッダと衝突しないようにする。
おわり
locationが/
だけなことはないので調整は必ず必要になる。
あまり頻繁にnginxのconfファイルを書かないので、残しておきたいと思う。
短いですが以上です。