概要
nginxの設定について、役立ちそうなことや間違えやすいことなどのメモです。順次追記していきます。動作はnginx 1.18で確認しています。
wwwありからwwwなしにリダイレクトする
http://www.example.net から https://example.net にリダイレクトする設定です。rewriteよりreturnを使う方が良いようです。
参考:Examples – Standardizing the Domain Name (How to Create NGINX Rewrite Rules | NGINX)
server {
listen 80;
listen [::]:80;
server_name www.example.net;
server_tokens off;
return 301 https://example.net$request_uri;
}
HTTP/2を有効にする
listenディレクティブにキーワードhttp2を入れれば、HTTP/2が有効になります。
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.net;
server_tokens off;
ssl_certificate /path/to/example.net.crt;
ssl_certificate_key /path/to/example.net.key;
}
アクセスログの書式をバーチャルホストありのCombinedにする
アクセスログの書式を、ログ解析ソフトGoAccessで読み込めるNCSA Combined Log Format with Virtual Hostにする設定です。
log_format combinedvhost '$server_name:$server_port $remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
access_log /var/log/nginx/access.log combinedvhost;
警告メッセージ duplicate MIME type "text/html" が出ないようにする
nginx: [warn] duplicate MIME type "text/html" in /etc/nginx/sites-enabled/example.net:50のような警告メッセージが出る場合があります。これは、text/htmlがcharset_typesとgzip_typesの対象としてデフォルトで有効となっているためです。重複して定義した箇所を削除することで解決します。
参考:nginx - duplicate MIME type "text/html"? - Stack Overflow
locationのプレフィックスによる動作の違い
以下は、https://example.net/test/ がリクエストされ場合の例です。
参考:nginx.conf の location の優先順位を正しく理解する - 無印吉澤
事例1
前方一致で最長の^~ /test/
にマッチします。正規表現は評価されません。
# 前方一致(正規表現に優先)
location ^~ /test/ {
# このコンテキストが適用される
index index1.html;
}
# 前方一致
location /test {
index index2.html;
}
# 正規表現
location ~ /test/ {
index index3.html;
}
事例2
前方一致で最長の/test/
にマッチしますが、正規表現~ /test/
にもマッチするため、正規表現が優先されます。
# 前方一致(正規表現に優先)
location ^~ /test {
index index1.html;
}
# 前方一致
location /test/ {
index index2.html;
}
# 正規表現
location ~ /test/ {
# このコンテキストが適用される
index index3.html;
}
事例3
前方一致で最長の/test/
にマッチします。正規表現はマッチしないため、前方一致のlocationがそのまま適用されます。
# 前方一致(正規表現に優先)
location ^~ /test {
index index1.html;
}
# 前方一致
location /test/ {
# このコンテキストが適用される
index index2.html;
}
# 正規表現
location ~ /release/ {
index index3.html;
}
事例4
完全一致= /test/
にマッチします。
# 前方一致(正規表現に優先)
location ^~ /test/ {
index index1.html;
}
# 完全一致
location = /test/ {
# このコンテキストが適用される
index index2.html;
}
# 正規表現
location ~ /test/ {
index index3.html;
}