覚えにくく理解しにくいNginxのディレクティブの話。
ディレクティブの書式
・ディレクティブ名 値; ・ディレクティブ名 値 { }
ディレクトブ
- http {}
httpサーバとしての設定
- server {}
バーチャルホストの設定。http内で使用
グローバル
- user
ワーカプロセスを実行するユーザ名とグループ名
- worker_processes
起動されるワーカプロセス数
- error_log
エラーが出力されるログファイル Dockerで起動する場合は標準出力
- pid
メインプロセスのプロセスIDが書き込まれるファイル
- worker_connections
ワーカプロセスが同時にオープン可能なコネクションの最大数
設定ファイル
- core
プロセス制御、設定ファイル制御
- event
イベント処理
Webサーバ設定
- listen
IPとポートを指定
- server_name
サーバ名を指定する
- root
ドキュメントルートを指定する
- charset
Content-typeを指定する
リバースプロキシ
- proxy_pass URI
プロキシ先の指定(location内で使用)
- proxy_set_header フィールド値
プロキシ先に送らレルリクエストヘッダフィールドの再定義、または追加。 (http,server,location内で使用)
- proxy_pass_header フィールド
プロキシ先からクライアントへの通過を許可するヘッダフィールドの指定 (http,server,location内で使用)
FastCGIサーバの指定。location内で使用
- fastcgi_param パラメータ値
FastCGIサーバに渡すパラメータの値の指定
Nginx変数
- $http_host
リクエストヘッダのHTTP_HOSTの値
- $host
リクエストヘッダのポート番号を除いたHTTP_HOSTの値
- $proxy_host
proxy_passディレクティブに書かれたプロキシされるサーバ名とポート番号
X-Fowarded-For
- remote_addr
アクセス元のIP。基本的に直前のIPを保持している
- X-Fowarded-For
HTTPヘッダの一つ、ロードバランサやプロキシを経由する時に送信元を判別するために利用
- X-Real-IP
ロードバランサやプロキシを経由する時に送信元を判別するために利用 X-Fowwarded-Forと違って複数の値が設定されることはない
server { listen 80; listen [::]:80; set_real_ip_from 10.10.0.0/16; # 信頼できるアドレス空間を指定。 real_ip_header X-Forwarded-For; # remote_addrを書き換え。 real_ip_recursive on; # 必要であれば。 location / { proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Host $http_host; proxy_set_header Connection ""; proxy_set_header X-Real-IP $remote_addr; # x-real-ipにクライアントIPを設定。APIへ渡す。 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # X-Forwarded-For に直前のProxy(=ELB)を追加 } }
HTTP で便利に使える X-Forwarded-For だが、HTTPS では利用できない。HTTPS では通信がエンドトゥーエンドで暗号化されるため、途中に挟まるプロキシ等が X-Forwarded-For ヘッダを挿入することができない。