Nginx サーバー構成と最適化設定ガイド

コアプロセスとリソース管理

Nginx のパフォーマンスを最大化するには、ワーカープロセスの適切な設定が不可欠です。CPU コア数に合わせてプロセス数を調整し、コンテキストスイッチングを減らすことで処理効率が向上します。

ワーカープロセス数の設定

worker_processes ディレクティブを使用し、利用可能な CPU コア数に合わせてプロセス数を決定します。明示的に数を指定するか、自動的に検出させる設定が可能です。

worker_processes auto;
# システムの CPU コア数に自動的に合わせて設定
# 明示的な指定例:worker_processes 4;

設定後、以下のコマンドでプロセス数が反映されているか確認できます。

ps -eo pid,psr,ni,cmd | grep nginx
# 出力例:
# 1024 nginx: master process /usr/sbin/nginx
# 1025 nginx: worker process
# 1026 nginx: worker process

CPU アフィニティの設定

特定のワーカープロセスを特定の CPU コアに绑定することで、キャッシュヒット率を向上させられます。バイナリマスクを使用して CPU コアを指定します。

worker_cpu_affinity 0001 0010 0100 1000;
#  respective workers bind to CPU 0, 1, 2, 3

負荷テストを行い、プロセスが指定した CPU から移動していないことを確認します。

while true; do curl -s http://172.16.0.50/ > /dev/null; done

プロセス優先度の調整

システムリソースが競合する環境では、worker_priority を使用して Nginx ワーカーの優先度(nice 値)を変更できます。値を小さくすると優先度が上がります。

worker_priority -10;
# 優先度を高める設定(範囲は -20 〜 19)

変更後はプロセスリストで NI 値が変更されているか検証します。

ファイル記述子の制限

大量の同時接続を処理する場合、OS のファイル記述子制限を超えないよう worker_rlimit_nofile で制限値を引き上げておきます。

worker_rlimit_nofile 65535;

セキュリティ設定とバージョン隠蔽

デフォルトでは HTTP レスポンスヘッダーに Nginx のバージョン情報が含まれます。これはセキュリティリスクとなるため、必要に応じて隠蔽します。

server_tokens off;
# サーバーヘッダーからバージョン情報を削除
# 設定前:Server: nginx/1.24.0
# 設定後:Server: nginx

開発環境ではデバッグのため情報を残すこともありますが、本番環境では無効化が推奨されます。

HTTP ブロックと仮想ホスト構成

HTTP トラフィックの処理は http ブロック内で行われます。ここでは MIME タイプ、仮想ホスト、およびパス映射の設定を行います。

MIME タイプの定義

クライアントに返すコンテンツタイプを定義します。対応していない形式はダウンロードとして処理され、対応している形式はブラウザで表示されます。

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

サーバーブロックとルートディレクトリ

server ディレクティブで仮想ホストを定義し、root でドキュメントルートを指定します。

server {
    listen 80;
    server_name app.example.local;
    root /srv/www/content;
    
    location / {
        index index.html;
    }
}

クライアント側の hosts ファイルにドメインと IP を紐付けることで、名前ベースの仮想ホストとして機能します。

alias と root の違い

location ブロック内では、rootalias でパスの解決方法が異なります。

location /static/ {
    root /var/www/assets;
    # 請求:/static/image.png
    # 解決:/var/www/assets/static/image.png
}

location /downloads/ {
    alias /mnt/storage/files/;
    # 請求:/downloads/report.pdf
    # 解決:/mnt/storage/files/report.pdf
}

alias は URI の該当部分を置き換える動作をするため、パスの末尾のスラッシュ処理に注意が必要です。

URL マッピングとアクセス制御

リクエストされた URI に対してどの設定を適用するかは location ディレクティブで制御します。マッチングには優先順位が存在します。

location のマッチング優先度

以下の順序で優先的に評価されます。

  1. =:完全一致(最優先)
  2. ^~:接頭辞一致(正規表現をチェックしない)
  3. ~ または ~*:正規表現一致(大文字小文字の区別あり/なし)
  4. なし:接頭辞一致(最長マッチ)
location = /health {
    # 完全一致の場合のみ適用
    return 200 'OK';
}

location ^~ /api/ {
    # /api/ で始まる場合、正規表現をチェックせず適用
    proxy_pass http://backend;
}

location ~* \.(jpg|png)$ {
    # 画像ファイルの場合
    expires 30d;
}

IP アドレスによるアクセス制御

ngx_http_access_module を使用し、特定の IP アドレスまたはサブネットからのアクセスを許可または拒否できます。

server {
    listen 80;
    server_name internal.corp.local;
    
    allow 10.0.0.0/8;
    allow 172.16.5.20;
    deny all;
    
    location / {
        root /var/www/secure;
    }
}

設定順序に注意し、具体的な許可ルールを先に記述し、最後に deny all で閉じるのが一般的です。モジュールの有无は configure オプションで確認可能です。

タグ: nginx web-server configuration Security performance-tuning

7月26日 22:55 投稿