Nginx は『シンプルに見えて深い』Webサーバの定番
Nginx はリバースプロキシ・ロードバランサ・静的ファイル配信で広く採用されています。本記事では編集部の視点で、本番運用での主要チューニングを公開情報をもとに整理します。CDN/Edge 実践 もご参考に。
ワーカープロセスとコネクション
(1) worker_processes auto:CPU コア数に合わせる。(2) worker_connections 1024 以上:CPU/メモリ次第で増やす。(3) ulimit の調整:file descriptor 上限を増やす。(4) keepalive_timeout:65秒前後が一般的。(5) multi_accept on:高並行向け。同時接続が10K超なら設定見直しのサインです。
キャッシュ設定
(1) proxy_cache_path:ディスクキャッシュ。(2) proxy_cache_valid:レスポンスコード別の保持。(3) proxy_cache_key:キャッシュキー設計。(4) X-Cache-Status:HIT/MISS の可視化。(5) キャッシュパージ:API/ファイル削除で実現。CDN との併用も一般的です。
SSL/TLS チューニング
(1) ssl_protocols TLSv1.2 TLSv1.3:古いプロトコル無効化。(2) ssl_session_cache shared:再ネゴ削減。(3) ssl_session_timeout:1時間程度。(4) OCSP Stapling:証明書検証の高速化。(5) HTTP/2 / HTTP/3有効化。Webセキュリティ実践 も合わせて。
圧縮とバッファリング
(1) gzip on:text/html/json/css/js を対象。(2) gzip_comp_level 4〜6:CPU と圧縮率のバランス。(3) brotli:モジュール追加で対応。(4) proxy_buffering off:SSE で必須。(5) client_max_body_size:アップロード上限。
ログとモニタリング
(1) access_log の構造化:JSON フォーマット。(2) レスポンスタイム($request_time/$upstream_response_time)。(3) upstream エラー:5xx の集計。(4) nginx-prometheus-exporter:メトリクス公開。(5) access.log の rotate:logrotate 設定。ログ管理実践 も合わせて。
セキュリティ強化
(1) server_tokens off:バージョン非表示。(2) limit_req:レート制限。(3) limit_conn:同時接続数制限。(4) add_header Strict-Transport-Security:HSTS。(5) WAF モジュール:ModSecurity 等。API レート制限実装 もご参考に。
失敗しがちなパターン
(1) ulimit デフォルトのまま:1024 で詰まる。(2) worker_processes 1:CPU 1コアのみ使用。(3) keepalive 短すぎ:TCP 再確立コスト増。(4) access_log 大量出力:I/O 圧迫。(5) SSL バージョン古いまま。対策は、(1)limits.conf 編集、(2)auto 設定、(3)65秒前後、(4)buffer + 構造化、(5)定期更新、です。