地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

Nginxのディレクティブ

覚えにくく理解しにくい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サーバに渡すパラメータの値の指定

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 ヘッダを挿入することができない。