/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;
}
# 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;
}
}