nginxでReverse Proxyを設定する

nginxのリバプロ設定方法をメモしておきます。

環境情報

  • nginx version: nginx/1.15.12

参考情報

upstreamコンテキストを作成

Module ngx_http_upstream_module

  • server ディレクティブで、バックエンドのサーバを指定
    • 複数指定する場合は、ラウンドロビンでForwardされる
    • サーバ毎に重みや、接続試行回数をパラメータで指定できる
  • keepalive_timeout ディレクティブで、バックエンドサーバとkeepaliveを設定可能
upstream web-server {
    server  172.31.40.222;
    keepalive_timeout       60s;
}

locationコンテキストにて、proxy_passを指定

Module ngx_http_proxy_module - Proxy_pass

  • proxy_pass ディレクティブにて、Forward先となるサーバーを指定
    • upstreamコンテキストで作成したサーバ郡を指定できる
location / {
    proxy_pass http://web-server;
}

serverコンテキストにて、リバプロ用設定を実施

Module ngx_http_proxy_module

  • proxy_set_header にて、バックエンドサーバに渡すリクエストヘッダを定義
  • 上で keepalive_timeout にてkeepaliveの通信を有効としており、HTTP 1.1より利用できるものなので、 proxy_http_version にて利用するHTTPのバージョンを指定
  • バックエンドサーバーとのタイムアウトに関わる設定を定義
server {
    listen 80;

    proxy_set_header  Host                $host;
    proxy_set_header  X-Forwarded-For     $proxy_add_x_forwarded_for;
    proxy_set_header  X-Forwarded-Host    $host;
    proxy_set_header  X-Forwarded-Server  $hostname;
    proxy_set_header  X-Real-IP           $remote_addr;

    proxy_http_version      1.1;

    proxy_connect_timeout 5s;
    proxy_read_timeout    5s;
    proxy_send_timeout    5s;

    location / {
      ...
    }
}

リバプロ用のログ設定を実施

Module ngx_http_log_module

log_format  upstream  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$upstream_cache_status $upstream_status '
                      '$upstream_addr $upstream_http_location '
                      '$host $proxy_add_x_forwarded_for';

access_log /var/log/nginx/upstream.log upstream;

実際のコンフィグ

/etc/nginx/nginx.conf

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    log_format  upstream  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$upstream_cache_status $upstream_status '
                          '$upstream_addr $upstream_http_location '
                          '$host $proxy_add_x_forwarded_for';

    access_log /var/log/nginx/access.log main;
    access_log /var/log/nginx/upstream.log upstream;

    server_tokens   off;

    sendfile        on;

    keepalive_timeout  65;

    upstream web-server {
        server  172.31.40.222;
        keepalive_timeout       30;
    }

    server {
        listen 80;

        proxy_set_header  Host                $host;
        proxy_set_header  X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_set_header  X-Forwarded-Host    $host;
        proxy_set_header  X-Forwarded-Server  $hostname;
        proxy_set_header  X-Real-IP           $remote_addr;

        proxy_http_version      1.1;

        proxy_connect_timeout 5s;
        proxy_read_timeout    5s;
        proxy_send_timeout    5s;

        location / {
            proxy_pass http://web-server;
        }
    }

}

ログたち

/var/log/nginx/access.log

223.xxx.xxx.xxx - - [21/Apr/2019:17:44:37 +0000] "GET / HTTP/1.1" 200 38 "-" "curl/7.55.1" "-"
223.xxx.xxx.xxx - - [21/Apr/2019:17:44:43 +0000] "GET / HTTP/1.1" 200 38 "-" "curl/7.55.1" "-"

/var/log/nginx/upstream.log

223.xxx.xxx.xxx - - [21/Apr/2019:17:44:37 +0000] "GET / HTTP/1.1" - 200 172.31.40.222:80 - kiritan.goodbyegangster.com 223.xxx.xxx.xxx
223.xxx.xxx.xxx - - [21/Apr/2019:17:44:43 +0000] "GET / HTTP/1.1" - 200 172.31.40.222:80 - zunchan.goodbyegangster.com 223.xxx.xxx.xxx