2026年9月27日

2026年9月27日

Nginxの設定ファイル(nginx.conf)の基本構造を解説

はじめに

Nginxの設定ファイルの構造がよくわからない・nginx.confとsites-availableの関係がわからない・serverブロックとlocationブロックの違いが理解できないといった場合の解説と、よくある設定ミスの解決方法を説明します。

症状・原因

  • nginx.confを編集したが設定が反映されない(sites-enabledの設定が優先されている)
  • locationブロックの優先順位がわからず、意図しないルールが適用される
  • server_nameの設定が複数あり、どのブロックが使われるか不明
  • includeディレクティブで読み込まれる設定ファイルの場所がわからない

解決手順

ステップ1:設定ファイルの全体構造を確認する

# ✅ メイン設定ファイルの場所
# Ubuntu/Debian: /etc/nginx/nginx.conf
# CentOS/RHEL:   /etc/nginx/nginx.conf

# ✅ 設定ファイルの構造を確認
sudo nginx -T | head -100
# → すべての設定(include展開済み)を表示

# ✅ 構文チェック
sudo nginx -t
# → nginx: configuration file /etc/nginx/nginx.conf test is successful

# ✅ どのサーバーブロックが使われるか確認
sudo nginx -T | grep -A 5 "server_name"

ステップ2:nginx.conf の基本構造を理解する

# ✅ nginx.conf の基本構造

# main コンテキスト(グローバル設定)
user www-data;
worker_processes auto;       # CPUコア数に合わせて自動設定
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

# events コンテキスト(接続設定)
events {
    worker_connections 1024;  # ワーカーあたりの最大接続数
    use epoll;                # Linux では epoll が最適
    multi_accept on;          # 複数接続を同時に受け付ける
}

# http コンテキスト(HTTP設定)
http {
    include mime.types;
    default_type application/octet-stream;

    # ✅ ログ設定
    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log warn;

    # ✅ パフォーマンス設定
    sendfile on;
    tcp_nopush on;
    keepalive_timeout 65;
    gzip on;

    # ✅ サイト設定を読み込む
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

ステップ3:server ブロックと location ブロックを設定する

# ✅ server ブロック(VirtualHost相当)
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;

    root /var/www/html;
    index index.php index.html;

    # ✅ location ブロックの優先順位
    # 1. = (完全一致・最優先)
    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    # 2. ^~ (前方一致・正規表現より優先)
    location ^~ /images/ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }

    # 3. ~ または ~* (正規表現)
    location ~* \.(css|js)$ {
        expires 1M;
    }

    # 4. / (前方一致・最後の手段)
    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    # ✅ PHP 処理
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

ステップ4:設定の継承ルールを理解する

# ✅ Nginx の設定継承:子コンテキストは親の設定を継承する

http {
    gzip on;  # → すべての server ブロックで有効

    server {
        server_name example.com;
        # gzip on を継承
        gzip_types text/html text/css;  # このサーバーのみ追加設定

        location / {
            # gzip on, gzip_types を継承
        }

        location /api/ {
            gzip off;  # このブロックのみ上書き
        }
    }
}

# ✅ 変数の利用
server {
    set $cache_ttl "1h";

    location ~* \.(jpg|png|gif)$ {
        expires $cache_ttl;
    }
}

# ✅ if ディレクティブは慎重に使う
# Nginx の if はバグが多いため、map を使う方が安全
map $request_uri $redirect_target {
    /old-page  /new-page;
    /old-blog  /new-blog;
}
server {
    if ($redirect_target) {
        return 301 $redirect_target;
    }
}

ステップ5:設定を分割して管理する

# ✅ サイトごとに設定ファイルを分割(推奨)
# /etc/nginx/sites-available/example.com.conf
# /etc/nginx/sites-enabled/  → シンボリックリンク

# ✅ 共通設定をスニペットとして切り出す
# /etc/nginx/snippets/ssl-params.conf
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

# サイト設定で読み込む
# include snippets/ssl-params.conf;
# ✅ サイト設定を有効化
sudo ln -s /etc/nginx/sites-available/example.conf \
    /etc/nginx/sites-enabled/

# ✅ サイト設定を無効化
sudo rm /etc/nginx/sites-enabled/example.conf

# ✅ 設定反映
sudo nginx -t && sudo systemctl reload nginx

# ✅ 全設定の展開表示(デバッグ用)
sudo nginx -T 2>/dev/null | grep -A 20 "server_name example.com"

注意事項

  • nginx.confのhttpブロック内に直接serverブロックを書くことも、sites-availableに分割することも両方可能です。ただしinclude /etc/nginx/sites-enabled/*の行がある場合はそちらも読み込まれるため、設定が重複しないよう注意してください
  • locationブロックの優先順位(= > ^~ > 正規表現 > 前方一致)を理解していないと、意図しないルールが適用されます。nginx -Tで実際の設定を確認してデバッグしてください

まとめ

nginx.confの基本構造は①nginx -Tで全設定確認・nginx -tで構文チェック・設定ファイルの場所理解、②main/events/httpコンテキストの役割・worker_processes auto・keepalive_timeout・includeでサイト設定読み込み、③serverブロックのserver_name/listen/root・locationの優先順位(= > ^~ > 正規表現 > 前方一致)・try_filesでWordPressルーティング、④設定の継承ルール(子は親を継承・gzip onの伝播)・mapディレクティブで安全なリダイレクト、⑤sites-available/sites-enabledで設定分割・snippets/で共通設定切り出し・シンボリックリンクで有効化の手順で管理します。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲