nginxのメモ(proxyとreal_ip)

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ファイルを書かないので、残しておきたいと思う。

短いですが以上です。

タイトルとURLをコピーしました