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/で共通設定切り出し・シンボリックリンクで有効化の手順で管理します。