nginx: ラウンドロビンやIPハッシュによるロードバランシング


前提


ドキュメント


ロードバランサ

フロントエンドで受けたリクエストを複数あるバックエンドにロードバランシングして流す。

ディレクティブ

フロントエンドのnginx.conf

http {
  # HTTPヘッダの調整: サーバ郡の構成、ログ書式により異なる
  proxy_set_header X-Forwarded-For $remote_addr;
  proxy_set_header X-Forwarded-Host $http_host;

  server {
    location / {
      proxy_pass http://backend;
    }
  }

  upstream backend {
    server back-end-abc;
    server back-end-xyz;
  }
}

ロードバランシングのタイプ

serverディレクティブのパラメータ


HTTPヘッダの調整

例: クライアント => ロードバランサ => フロントエンド => バックエンド

転送先サーバは、そのままでは本来のクライアントIPアドレスを得られないので、HTTPヘッダを調整して伝える。

HTTPヘッダ

その他、Hostヘッダなどを直接変える場合もあり、サーバ構成やログ形式により異なる。

proxy_set_headerディレクティブ: 転送元でヘッダを設定

# 転送先ホストで値が有効(現ホストのヘッダ変数は書き換わらない)
proxy_set_header X-Forwarded-For $remote_addr; # 先頭のサーバなら
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 中途のサーバなら
proxy_set_header X-Forwarded-Host $http_host;

変数の値

real_ip_headerディレクティブ: $remote_addrを書き換える

# 例: 現在のX-Forwarded-Forの値が「偽装IP1, クライアントIP, サーバ1, サーバ2」のとき、
# $remote_addrにクライアントIPを設定できる
set_real_ip_from サーバ;
real_ip_header X-Forwarded-For;
real_ip_recursive on;