コピペコードで快適生活

明日使えるソースを自分のために

nginxのproxy設定メモ

/etc/nginx/nginx.conf

# 略
http {
    # 略

    # proxy_cache_path: キャッシュファイルの本体
    #   keys_zone: 1mは共有メモリのサイズ。1MiBあたり約8000個のキーを保持できる
    #   max_size: 全キャッシュファイルのサイズ合計の上限
    #   inactive: 指定した期間内にアクセスされなかったキャッシュファイルは、その有効期間に関わらず削除される(デフォルトで10分)
    # proxy_temp_path: オリジンからの応答を一時的に保存するパス
    # 参考: https://qiita.com/aosho235/items/bb1276a8c43e41edfc6f
    proxy_cache_path /var/cache/nginx keys_zone=zone1:1m max_size=1g inactive=24h;
    proxy_temp_path  /var/cache/nginx_tmp;

    include /etc/nginx/conf.d/*.conf;
}

etc/nginx/conf.d/example.com.conf

# proxy先の設定
upstream my_app {
  # 送信先のサーバをクライアントIPから算出する
  ip_hash;

  # 送信先のサーバ情報
  # weightが大きいほど送信頻度が高くなる
  server 192.168.101:80 weight=1;
  server 192.168.102:80 weight=1;
}

# HTTPの設定
# HTTPSにリダイレクトする
server {
    listen  80 proxy_protocol;
    server_name www.example.com assets.example.com;
    return 301 https://$host$request_uri;
}

# HTTPS
# proxyする
server {
    listen 443 ssl http2 proxy_protocol;
    server_name www.example.com assets.example.com;

    # X-Forwarded-ForからproxyのIPアドレス(192.168.0.0/24)を削って
    # 一番右側のIPアドレスを、$remote_addr変数にセットする
    # 参考: https://christina04.hatenablog.com/entry/2016/10/25/190000
    set_real_ip_from 192.168.0.0/24;
    real_ip_header X-Forwarded-For;

    # ELB+SSLの場合は、こうする
    # set_real_ip_from 192.168.0.0/24;
    # real_ip_header proxy_protocol;

    # ステータスコードが20x,30xの場合にレスポンスヘッダに含める
    # 参考: https://nginx.org/en/docs/http/ngx_http_headers_module.html#add_header
    add_header Front-End-Https on;

    # レスポンスヘッダに含まれるnginxのバージョンを消す
    server_tokens off;

    # リダイレクト時のサーバ名に何を使うか
    # on: server_nameディレクティブのサーバ名(デフォルト)
    # off: Hostヘッダの値
    # 参考: https://heartbeats.jp/hbblog/2012/04/nginx04.html
    server_name_in_redirect off;

    # アップロードのサイズ制限
    # 参考: https://qiita.com/notakaos/items/4816ad71b90a9967fa18
    client_max_body_size 10M;

    # クライアントリクエストボディをファイルとして書き出すか
    # on: ファイル書き出す+消さない
    # clean: ファイル書き出す+消す
    # off: ファイルに書き出さない(デフォルト)
    # 参考: http://mogile.web.fc2.com/nginx/http/ngx_http_core_module.html#client_body_in_file_only
    client_body_in_file_only clean;

    keepalive_timeout 5;

    # 使用する証明書の指定
    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;
    ssl_protocols             TLSv1.2 TLSv1.3;
    ssl_ciphers               AESGCM:HIGH:!aNULL:!MD5:!LOW:!SSLv2:!EXP:!eNULL;
    ssl_prefer_server_ciphers on;

    # プロキシ先に送信する際のヘッダ設定
    proxy_set_header X-Real-IP $remote_addr;     # クライアントのIPアドレス
    proxy_set_header X-Forwarded-Proto $scheme;  # クライアントとサービスエンドポイントで使用したプロトコル
    proxy_set_header Host $http_host;            # Hostヘッダ
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # X-Forwarded-Forに自身のIPを足した値をセットする
    proxy_set_header Authorization $http_authorization;

    # デフォルトでproxyに通さないヘッダを通す設定
    proxy_pass_header Accept;
    proxy_pass_header Server;

    # proxy先のタイムアウト設定
    proxy_read_timeout 300;
    proxy_connect_timeout 300;
    proxy_send_timeout 300;

    # proxy先がリダイレクトを返したときに、nginxがリダイレクト先を書き換えるか
    # proxy_redirect http:// https://;
    # とすると、httpをhttpsに書き換えてくれる
    proxy_redirect off;

    # setで変数に値をセットできる
    set $do_not_cache 1;
    if ($uri ~* "\.(jpeg|gif|png|jpg|webp)") {
        set $do_not_cache 0;
    }
    if ($request_method != GET) {
        set $do_not_cache 1;
    }

    # ファイルをキャッシュから取得するか
    # 0: キャッシュ使う
    # 1: キャッシュから取得しない
    proxy_cache_bypass $do_not_cache;

    # proxy先が返すCache-Controlヘッダを無視する
    proxy_ignore_headers Cache-Control;

    proxy_cache zone1;        # キャッシュに使うメモリ領域を指定。名前は任意の値を使用可。
    proxy_cache_valid 200 3m; # status=200の場合は3分キャッシュを使う
    proxy_cache_key "$scheme://$host$request_uri$is_args$args";

    # /* へのアクセスを my_app/* へプロキシする
    location / {
        proxy_pass https://my_app/;
    }

    # trailing slashあり
    # /info01/abc へのアクセスは、https://example.jp/abc へ転送される
    # 参考: https://blog.cosnomi.com/posts/674/
    location /info/ {
        proxy_pass https://example.jp/
    }

    # trailing slashなし
    # # /news/abc へのアクセスは、https://example.jp/news/abc へ転送される
    location /news/ {
        proxy_pass https://example.jp
    }

    location /blog/ {
        proxy_pass https://blog.example.com/;

        # proxy先が返したリダイレクト先を /blog/ に書き換える
        proxy_redirect https://blog.example.com /blog/;
        proxy_redirect http://blog.example.com /blog/;

        # proxy先が返したレスポンスの文字列を /blog に書き換える
        # sub_filter_once offにすることで、複数個の書き換えを行う
        sub_filter "https://blog.example.com" "/blog";
        sub_filter "http://blog.example.com" "/blog";
        sub_filter_once off;
    }
}