nginxの設定メモ

公開日:

更新日:

概要

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が有効になります。

参考:Module ngx_http_v2_module

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