Nginx設定ファイル完全ガイド|nginx.confの書き方から実践例まで徹底解説

Web

Nginxは高性能なWebサーバーとして人気ですが、設定ファイルの書き方が独特で、最初は戸惑うことが多いですよね。

「どこに何を書けばいいの?」「このディレクティブはどういう意味?」「間違えたらサーバーが止まる?」といった不安もあるでしょう。

この記事では、Nginxの設定ファイル(nginx.conf)の基本構造から、実践的な設定例、よく使うディレクティブ、トラブルシューティングまで、初心者の方にも分かりやすく徹底解説します。


スポンサーリンク
  1. Nginx設定ファイルの基礎知識
    1. nginx.confとは?
    2. 設定ファイルの場所
    3. 設定ファイルの構造
  2. 設定ファイルの基本的な書き方
    1. 文法のルール
    2. includeディレクティブ
  3. よく使うディレクティブ解説
    1. グローバル設定
    2. eventsブロック
    3. httpブロック
  4. serverブロックの設定
    1. 基本的なserverブロック
    2. よく使うserverディレクティブ
  5. locationブロックの設定
    1. locationの基本
    2. locationの優先順位
    3. 実用的なlocation例
  6. リバースプロキシの設定
    1. 基本的なリバースプロキシ
    2. よく使うproxy_設定
    3. upstreamブロック(ロードバランサー)
  7. SSL/TLSの設定
    1. 基本的なSSL設定
    2. Let’s Encrypt(無料SSL証明書)
  8. 実践的な設定例
    1. WordPress用の設定
    2. Node.js(Express)用の設定
    3. 複数サイトの運用
  9. 設定の確認と反映
    1. 設定ファイルのテスト
    2. 設定の反映
    3. ステータスの確認
  10. トラブルシューティング
    1. 問題1:Nginxが起動しない
    2. 問題2:502 Bad Gateway
    3. 問題3:504 Gateway Timeout
    4. 問題4:403 Forbidden
  11. パフォーマンスチューニング
    1. 基本的なチューニング
    2. 静的ファイルのキャッシュ
  12. よくある質問(FAQ)
    1. Q1. nginx.confを編集したら、いつ反映されますか?
    2. Q2. 設定ファイルを間違えたら、サーバーが止まりますか?
    3. Q3. Apache の .htaccess のようなファイルはありますか?
    4. Q4. 複数のドメインを1つのNginxで運用できますか?
    5. Q5. Nginxの設定をバックアップすべきですか?
    6. Q6. デフォルト設定を確認したいのですが?
  13. まとめ|Nginx設定ファイルをマスターして高性能サーバーを構築

Nginx設定ファイルの基礎知識

nginx.confとは?

nginx.conf(エンジンエックス・ドット・コンフ)

  • Nginxのメイン設定ファイル
  • Webサーバーの動作を制御する
  • テキストファイルなので、エディタで編集可能

役割

  • バーチャルホストの設定
  • リバースプロキシの設定
  • SSL/TLS証明書の設定
  • アクセス制御
  • ログの設定

設定ファイルの場所

環境によって場所が異なります。

Linux(Ubuntu/Debian)

/etc/nginx/nginx.conf

Linux(CentOS/RHEL)

/etc/nginx/nginx.conf

Mac(Homebrewでインストール)

/opt/homebrew/etc/nginx/nginx.conf
/usr/local/etc/nginx/nginx.conf

Windows

C:\nginx\conf\nginx.conf

確認コマンド

nginx -t

このコマンドで、設定ファイルの場所とエラーの有無が確認できます。

設定ファイルの構造

Nginxの設定は、階層構造(ブロック構造)になっています。

基本的な構造

# グローバル設定(最上位)
user nginx;
worker_processes auto;

# イベントブロック
events {
    worker_connections 1024;
}

# HTTPブロック
http {
    # HTTPの設定

    # サーバーブロック
    server {
        # バーチャルホストの設定

        # ロケーションブロック
        location / {
            # 特定のURLパスに対する設定
        }
    }
}

ブロックの階層

グローバル
├── events
└── http
    ├── upstream
    ├── server
    │   └── location
    └── server
        └── location

設定ファイルの基本的な書き方

文法のルール

1. ディレクティブの書き方

ディレクティブ名 値;

必ずセミコロン(;)で終わります。

listen 80;
server_name example.com;
root /var/www/html;

2. ブロックの書き方

ディレクティブ名 {
    # ブロック内の設定
}

中括弧({})で囲みます。

3. コメントの書き方

# これはコメント
# シャープ記号で始まる行はコメント扱い

4. インデント

必須ではありませんが、可読性のため推奨されます。

# 良い例(見やすい)
server {
    listen 80;
    server_name example.com;

    location / {
        root /var/www/html;
    }
}

# 悪い例(見づらい)
server {
listen 80;
server_name example.com;
location / {
root /var/www/html;
}
}

includeディレクティブ

設定を複数のファイルに分割できます。

http {
    # 外部ファイルを読み込む
    include /etc/nginx/mime.types;
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

メリット

  • 設定が整理しやすい
  • サイトごとに設定ファイルを分けられる
  • 再利用しやすい

よく使うディレクティブ解説

実務でよく使う設定項目を解説します。

グローバル設定

user

Nginxを実行するユーザーを指定します。

user nginx;
# または
user www-data;

worker_processes

ワーカープロセスの数です。

# CPUコア数に合わせる
worker_processes auto;

# 手動で指定
worker_processes 4;

推奨値: auto(自動でCPUコア数に合わせる)

error_log

エラーログの出力先です。

error_log /var/log/nginx/error.log warn;

ログレベル:

  • debug:デバッグ情報
  • info:情報メッセージ
  • notice:通知
  • warn:警告(推奨)
  • error:エラー
  • crit:重大なエラー

pid

プロセスIDファイルの場所です。

pid /var/run/nginx.pid;

eventsブロック

worker_connections

1つのワーカーが処理できる最大接続数です。

events {
    worker_connections 1024;
}

推奨値

  • 小規模:512〜1024
  • 中規模:2048〜4096
  • 大規模:8192以上

httpブロック

include mime.types

ファイルタイプとMIMEタイプの対応表です。

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
}

access_log

アクセスログの設定です。

access_log /var/log/nginx/access.log;

# ログを無効化(パフォーマンス重視)
access_log off;

sendfile

ファイル送信の最適化です。

sendfile on;

推奨: 基本的にon

tcp_nopush

sendfileと組み合わせて使います。

tcp_nopush on;

推奨: sendfile onの場合はon

keepalive_timeout

接続を保持する時間(秒)です。

keepalive_timeout 65;

推奨値: 30〜75秒

gzip

レスポンスの圧縮です。

gzip on;
gzip_comp_level 5;
gzip_min_length 256;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;

転送量が減り、表示速度が向上します。


serverブロックの設定

バーチャルホスト(Webサイト)ごとの設定です。

基本的なserverブロック

server {
    # ポート番号
    listen 80;

    # サーバー名(ドメイン)
    server_name example.com www.example.com;

    # ドキュメントルート
    root /var/www/example.com;

    # インデックスファイル
    index index.html index.htm;

    # アクセスログ
    access_log /var/log/nginx/example.com.access.log;

    # エラーログ
    error_log /var/log/nginx/example.com.error.log;
}

よく使うserverディレクティブ

listen

待ち受けるポート番号です。

# HTTP(ポート80)
listen 80;

# HTTPS(ポート443)
listen 443 ssl;

# IPv6対応
listen [::]:80;

# 特定のIPアドレス
listen 192.168.1.100:80;

server_name

このserverブロックが応答するドメイン名です。

# 単一ドメイン
server_name example.com;

# 複数ドメイン
server_name example.com www.example.com;

# ワイルドカード
server_name *.example.com;

# 正規表現
server_name ~^(?<subdomain>.+)\.example\.com$;

# デフォルトサーバー
server_name _;

root

Webサイトのファイルがある場所です。

root /var/www/html;

index

ディレクトリアクセス時に表示するファイルです。

index index.html index.htm index.php;

左から順に探します。


locationブロックの設定

特定のURLパスに対する設定です。

locationの基本

server {
    # ルートパス
    location / {
        root /var/www/html;
        index index.html;
    }

    # 特定のパス
    location /images/ {
        root /var/www;
    }

    # 拡張子で指定
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
    }
}

locationの優先順位

マッチングには優先順位があります。

1. 完全一致(=)- 最優先

location = / {
    # http://example.com/ にのみマッチ
}

2. 前方一致(^~)- 正規表現より優先

location ^~ /images/ {
    # /images/ で始まるすべてのURLにマッチ
    # 正規表現はチェックされない
}

3. 正規表現(~、~*)

# 大文字小文字を区別
location ~ \.php$ {
    # .phpで終わるURLにマッチ
}

# 大文字小文字を区別しない
location ~* \.(jpg|jpeg|png|gif)$ {
    # 画像ファイルにマッチ
}

4. 前方一致(プレフィックス)

location /admin/ {
    # /admin/ で始まるURLにマッチ
}

実用的なlocation例

静的ファイルの配信

location /static/ {
    root /var/www;
    expires 30d;
    add_header Cache-Control "public, immutable";
}

PHPファイルの処理

location ~ \.php$ {
    root /var/www/html;
    fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

APIエンドポイント

location /api/ {
    proxy_pass http://localhost:3000/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

リバースプロキシの設定

バックエンドサーバーへリクエストを転送する設定です。

基本的なリバースプロキシ

server {
    listen 80;
    server_name example.com;

    location / {
        # バックエンドサーバーへ転送
        proxy_pass http://localhost:3000;

        # ヘッダーの設定
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

よく使うproxy_設定

proxy_pass

転送先のサーバーです。

# HTTPで転送
proxy_pass http://localhost:3000;

# HTTPSで転送
proxy_pass https://backend.example.com;

# UNIXソケット
proxy_pass http://unix:/tmp/backend.sock;

proxy_set_header

バックエンドに送るヘッダーを設定します。

# ホスト名
proxy_set_header Host $host;

# クライアントの実IPアドレス
proxy_set_header X-Real-IP $remote_addr;

# プロキシチェーン
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

# プロトコル(http/https)
proxy_set_header X-Forwarded-Proto $scheme;

proxy_redirect

リダイレクトURLを書き換えます。

proxy_redirect off;
# または
proxy_redirect http://localhost:3000/ http://example.com/;

upstreamブロック(ロードバランサー)

複数のバックエンドサーバーに負荷分散します。

upstream backend {
    # ラウンドロビン(デフォルト)
    server 192.168.1.101:3000;
    server 192.168.1.102:3000;
    server 192.168.1.103:3000;
}

server {
    listen 80;

    location / {
        proxy_pass http://backend;
    }
}

負荷分散の方式

upstream backend {
    # 重み付け
    server 192.168.1.101:3000 weight=3;
    server 192.168.1.102:3000 weight=1;

    # IPハッシュ(同じクライアントは同じサーバーへ)
    ip_hash;

    # 最小接続数
    least_conn;
}

SSL/TLSの設定

HTTPS対応の設定方法です。

基本的なSSL設定

server {
    listen 443 ssl;
    server_name example.com;

    # 証明書のパス
    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    # SSLプロトコル
    ssl_protocols TLSv1.2 TLSv1.3;

    # 暗号化方式
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # セッションキャッシュ
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    location / {
        root /var/www/html;
        index index.html;
    }
}

# HTTPからHTTPSへリダイレクト
server {
    listen 80;
    server_name example.com;
    return 301 https://$server_name$request_uri;
}

Let’s Encrypt(無料SSL証明書)

server {
    listen 80;
    server_name example.com;

    # Let's Encrypt認証用
    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    # その他はHTTPSへリダイレクト
    location / {
        return 301 https://$server_name$request_uri;
    }
}

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    location / {
        root /var/www/html;
    }
}

実践的な設定例

よくある構成の完全な設定例です。

WordPress用の設定

server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/wordpress;
    index index.php;

    # アクセスログ
    access_log /var/log/nginx/wordpress.access.log;
    error_log /var/log/nginx/wordpress.error.log;

    # 静的ファイルのキャッシュ
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    # メインロケーション
    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    # PHPファイルの処理
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    # セキュリティ:隠しファイルへのアクセス拒否
    location ~ /\. {
        deny all;
    }

    # wp-config.phpへのアクセス拒否
    location = /wp-config.php {
        deny all;
    }
}

Node.js(Express)用の設定

upstream nodejs {
    server localhost:3000;
    keepalive 64;
}

server {
    listen 80;
    server_name example.com;

    # 静的ファイル
    location /static/ {
        alias /var/www/app/public/;
        expires 30d;
    }

    # Node.jsアプリケーション
    location / {
        proxy_pass http://nodejs;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

複数サイトの運用

# サイト1
server {
    listen 80;
    server_name site1.com www.site1.com;
    root /var/www/site1;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

# サイト2
server {
    listen 80;
    server_name site2.com www.site2.com;
    root /var/www/site2;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

# デフォルト(どのドメインにもマッチしない場合)
server {
    listen 80 default_server;
    server_name _;
    return 444;  # 接続を切断
}

設定の確認と反映

設定ファイルのテスト

編集後、必ず構文チェックを行います。

# 構文チェック
sudo nginx -t

成功時の出力

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

エラー時の出力

nginx: [emerg] unexpected "}" in /etc/nginx/nginx.conf:25
nginx: configuration file /etc/nginx/nginx.conf test failed

エラー箇所と行番号が表示されるので、修正します。

設定の反映

リロード(推奨)

ダウンタイムなしで設定を反映します。

sudo nginx -s reload
# または
sudo systemctl reload nginx

再起動

完全に再起動します。

sudo systemctl restart nginx

停止と開始

# 停止
sudo systemctl stop nginx

# 開始
sudo systemctl start nginx

ステータスの確認

# サービスの状態
sudo systemctl status nginx

# プロセスの確認
ps aux | grep nginx

# ポートの確認
sudo netstat -tlnp | grep nginx
# または
sudo ss -tlnp | grep nginx

トラブルシューティング

よくある問題と解決法です。

問題1:Nginxが起動しない

症状

Job for nginx.service failed

原因と対処法

1. 構文エラー

sudo nginx -t

エラーメッセージに従って修正します。

2. ポートが使用中

sudo netstat -tlnp | grep :80

他のプロセスが80番ポートを使っている場合、そのプロセスを停止するか、別のポートを使用します。

3. 権限の問題

# Nginxユーザーを確認
ps aux | grep nginx

# ファイルの権限を確認
ls -la /var/www/html

問題2:502 Bad Gateway

原因

  • バックエンドサーバーが動いていない
  • proxy_passの設定ミス
  • ファイアウォールでブロックされている

対処法

1. バックエンドの確認

# Node.jsアプリの確認
ps aux | grep node

# PHP-FPMの確認
sudo systemctl status php8.1-fpm

2. 接続テスト

curl http://localhost:3000

3. エラーログを確認

sudo tail -f /var/log/nginx/error.log

問題3:504 Gateway Timeout

原因

  • バックエンドの処理が遅い
  • タイムアウト設定が短すぎる

対処法

タイムアウト時間を延長します。

location / {
    proxy_pass http://backend;
    proxy_read_timeout 300s;
    proxy_connect_timeout 75s;
}

問題4:403 Forbidden

原因

  • ファイルの権限が不正
  • インデックスファイルがない
  • ディレクトリリスティングが無効

対処法

1. 権限の確認と修正

# 所有者をnginxユーザーに変更
sudo chown -R www-data:www-data /var/www/html

# 権限を設定
sudo chmod -R 755 /var/www/html

2. インデックスファイルの確認

ls -la /var/www/html/index.html

ファイルが存在しない場合は作成します。


パフォーマンスチューニング

Nginxを高速化する設定です。

基本的なチューニング

# ワーカープロセス
worker_processes auto;
worker_rlimit_nofile 65535;

events {
    worker_connections 4096;
    use epoll;
    multi_accept on;
}

http {
    # ファイル送信の最適化
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

    # キープアライブ
    keepalive_timeout 65;
    keepalive_requests 100;

    # バッファサイズ
    client_body_buffer_size 128k;
    client_max_body_size 10m;
    client_header_buffer_size 1k;
    large_client_header_buffers 4 4k;
    output_buffers 1 32k;
    postpone_output 1460;

    # タイムアウト
    client_header_timeout 12;
    client_body_timeout 12;
    send_timeout 10;

    # Gzip圧縮
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss application/rss+xml font/truetype font/opentype application/vnd.ms-fontobject image/svg+xml;
    gzip_disable "msie6";

    # キャッシュ
    open_file_cache max=1000 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;
}

静的ファイルのキャッシュ

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 1y;
    add_header Cache-Control "public, immutable";
    access_log off;
}

よくある質問(FAQ)

Q1. nginx.confを編集したら、いつ反映されますか?

A. リロードまたは再起動後です。

sudo nginx -s reload

リロードすれば、ダウンタイムなしで反映されます。

Q2. 設定ファイルを間違えたら、サーバーが止まりますか?

A. いいえ、構文チェックで防げます。

sudo nginx -t

このコマンドでエラーがなければ、安全に反映できます。エラーがあれば、反映前に気づけます。

Q3. Apache の .htaccess のようなファイルはありますか?

A. いいえ、Nginxには .htaccess 相当の機能はありません。

すべての設定は、nginx.conf または include されるファイルに記述します。

Q4. 複数のドメインを1つのNginxで運用できますか?

A. はい、server ブロックを複数作成すれば可能です。

server {
    server_name site1.com;
    root /var/www/site1;
}

server {
    server_name site2.com;
    root /var/www/site2;
}

Q5. Nginxの設定をバックアップすべきですか?

A. はい、必ずバックアップを取ってください。

sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup

変更前に必ずバックアップすることを強く推奨します。

Q6. デフォルト設定を確認したいのですが?

A. サンプル設定ファイルが用意されています。

# Ubuntu/Debian
cat /usr/share/doc/nginx/examples/nginx.conf

# または新規インストール時の設定
nginx -V 2>&1 | grep "configure arguments"

まとめ|Nginx設定ファイルをマスターして高性能サーバーを構築

Nginxの設定ファイルは、最初は複雑に見えますが、基本を理解すれば柔軟にカスタマイズできます。

この記事の重要ポイント

  • nginx.confは階層構造(ブロック構造)で書く
  • 設定変更後は必ず nginx -t で構文チェック
  • nginx -s reload でダウンタイムなしで反映
  • serverブロックでバーチャルホストを設定
  • locationブロックで特定のURLパスを制御
  • リバースプロキシでバックエンドと連携
  • SSL/TLSでHTTPS対応
  • パフォーマンスチューニングで高速化

設定変更のチェックリスト

  1. バックアップを取る
  2. 設定ファイルを編集
  3. sudo nginx -t で構文チェック
  4. sudo nginx -s reload で反映
  5. ブラウザやcurlで動作確認
  6. エラーログを確認

最初は戸惑うかもしれませんが、この記事の例を参考に、少しずつ試していけば必ず使いこなせるようになります。

あなたのWebサイトやアプリケーションを、Nginxで高速かつ安定して配信してくださいね!

コメント

タイトルとURLをコピーしました