Nginx パフォーマンスチューニング
『Nginx』のパフォーマンスチューニングでは、CPUコア数に合わせた worker_processes の設定・接続の再利用を促す keepalive_timeout・静的ファイル転送を高速化する sendfile・レスポンスを圧縮する gzip の4つが基本の最適化ポイントです。これらのディレクティブを適切に組み合わせることで、サーバーリソースの無駄を省き、エンドユーザーへのレスポンス速度を大幅に改善できます。
構文
# -----------------------------------------------
# worker_processes / worker_connections
# -----------------------------------------------
# worker_processes {数 | auto}
# → Nginx のワーカープロセス数を指定します
# → auto にするとサーバーの CPU コア数に自動で合わせます
# 例: worker_processes auto;
# worker_connections {数}
# → 1つのワーカープロセスが同時に処理できる接続数です
# → 実際の同時接続数は worker_processes × worker_connections になります
# 例: worker_connections 1024;
# -----------------------------------------------
# keepalive_timeout
# -----------------------------------------------
# keepalive_timeout {秒数} [{ヘッダー送信用秒数}]
# → HTTP Keep-Alive 接続を維持する時間(秒)を指定します
# → 値を大きくすると接続の再確立オーバーヘッドが減りますが、
# FD(ファイルディスクリプタ)を長時間占有します
# → 本番環境では 10〜30 秒程度が一般的です
# 例: keepalive_timeout 15;
# -----------------------------------------------
# sendfile / tcp_nopush / tcp_nodelay
# -----------------------------------------------
# sendfile {on | off}
# → カーネルの sendfile(2) システムコールを使用します
# → ユーザースペースを経由せず直接ディスク→ネットワークに送るため
# 静的ファイル配信が高速化されます
# 例: sendfile on;
# tcp_nopush {on | off}
# → sendfile on の場合に有効で、レスポンスヘッダーとファイルの
# 先頭部分を1つの TCP パケットにまとめて送信します
# → sendfile on と組み合わせて使用します
# 例: tcp_nopush on;
# tcp_nodelay {on | off}
# → Nagle アルゴリズムを無効化し、小さいパケットでも即時送信します
# → keepalive 接続時に有効です
# 例: tcp_nodelay on;
# -----------------------------------------------
# gzip 圧縮
# -----------------------------------------------
# gzip {on | off}
# → gzip によるレスポンス圧縮を有効化します
# 例: gzip on;
# gzip_types {MIMEタイプ ...}
# → 圧縮対象の MIME タイプを指定します
# → text/html は常に圧縮されるため指定不要です
# 例: gzip_types text/plain text/css application/json application/javascript text/xml;
# gzip_comp_level {1〜9}
# → gzip の圧縮レベルを指定します
# → 1 が最速(低圧縮)、9 が最高圧縮(低速)
# → CPU コストと圧縮率のバランスから 4〜6 が推奨です
# 例: gzip_comp_level 5;
# gzip_min_length {バイト数}
# → 指定バイト数未満のレスポンスは圧縮しません
# → 小さいファイルは圧縮しても効果が薄いため 256〜1024 が一般的です
# 例: gzip_min_length 256;
# gzip_vary {on | off}
# → Vary: Accept-Encoding ヘッダーをレスポンスに付加します
# → CDN やプロキシが圧縮版と非圧縮版を正しくキャッシュするために必要です
# 例: gzip_vary on;
# -----------------------------------------------
# バッファ / クライアントサイズ制限
# -----------------------------------------------
# client_max_body_size {サイズ}
# → クライアントが送信できるリクエストボディの最大サイズです
# → ファイルアップロードがある場合は適切に大きく設定します
# 例: client_max_body_size 10m;
# client_body_buffer_size {サイズ}
# → リクエストボディをメモリに保持するバッファサイズです
# → これを超えるとディスクへの一時ファイル書き込みが発生します
# 例: client_body_buffer_size 16k;
# -----------------------------------------------
# ファイルキャッシュ
# -----------------------------------------------
# open_file_cache max={数} inactive={秒数}
# → ファイルディスクリプタ・サイズ・更新時刻等をキャッシュします
# → 静的ファイルが多いサーバーでディスク I/O を削減できます
# 例: open_file_cache max=1000 inactive=30s;
# open_file_cache_valid {秒数}
# → キャッシュエントリを何秒ごとに検証するかを指定します
# 例: open_file_cache_valid 60s;
構文一覧
| ディレクティブ | 説明 |
|---|---|
worker_processes auto | ワーカープロセス数を CPU コア数に自動で合わせます。コアを最大限に活用できます。 |
worker_connections 1024 | 1ワーカーが同時に処理できる接続数を指定します。同時接続上限は worker_processes との積になります。 |
keepalive_timeout 15 | Keep-Alive 接続を維持する秒数を指定します。接続再確立のオーバーヘッドを減らしますが、長すぎるとリソースを占有します。 |
sendfile on | カーネルの sendfile() システムコールで静的ファイルを直接送信します。ユーザースペースへのコピーが不要になり高速化されます。 |
tcp_nopush on | sendfile と組み合わせてレスポンスヘッダーとファイルを1パケットにまとめます。 |
tcp_nodelay on | Nagle アルゴリズムを無効化し、keepalive 接続で小さいパケットを即時送信します。 |
gzip on | gzip 圧縮を有効化します。テキスト系のレスポンスサイズを大幅に削減できます。 |
gzip_types ... | 圧縮対象の MIME タイプを指定します。text/html は自動で対象になります。 |
gzip_comp_level 5 | gzip の圧縮レベル(1〜9)を指定します。CPU コストと圧縮率のバランスから 4〜6 が推奨です。 |
gzip_min_length 256 | 指定バイト数未満のレスポンスは圧縮しません。小さすぎるファイルへの圧縮処理を省略できます。 |
gzip_vary on | Vary: Accept-Encoding ヘッダーを付加します。CDN やプロキシが圧縮版と非圧縮版を正しく区別できます。 |
client_max_body_size 10m | クライアントが送信できるリクエストボディの最大サイズです。ファイルアップロードに合わせて設定します。 |
client_body_buffer_size 16k | リクエストボディのメモリバッファサイズです。超過分はディスクへ一時書き込みされます。 |
open_file_cache max=1000 inactive=30s | ファイルディスクリプタ・サイズ・更新時刻などをキャッシュします。静的ファイル配信が多いサーバーのディスク I/O を削減できます。 |
open_file_cache_valid 60s | キャッシュエントリを検証する間隔を指定します。 |
使用例
/etc/nginx/nginx.conf
# -----------------------------------------------
# 本番環境向け Nginx パフォーマンスチューニング設定
# 桐生グループ EC サイト用(kiryu-group.example.com)
# -----------------------------------------------
# ワーカープロセス数を CPU コア数に自動調整します
worker_processes auto;
# Nginx が使用できるファイルディスクリプタ数の上限を設定します
# worker_connections の合計値より大きくしておきます
worker_rlimit_nofile 65535;
events {
# 1ワーカーが同時に処理できる接続数です
# 同時接続上限 = worker_processes × worker_connections
worker_connections 1024;
# Linux でのみ有効。複数の接続を一度に accept します
multi_accept on;
}
http {
# -----------------------------------------------
# 基本設定
# -----------------------------------------------
# MIME タイプの定義ファイルを読み込みます
include /etc/nginx/mime.types;
default_type application/octet-stream;
# -----------------------------------------------
# 静的ファイル転送の最適化
# -----------------------------------------------
# カーネルの sendfile() でファイルを直接ネットワークに送信します
sendfile on;
# レスポンスヘッダーとファイル先頭を1パケットにまとめます
# (sendfile on の場合のみ有効です)
tcp_nopush on;
# Keep-Alive 接続で小さいデータを即時送信します
tcp_nodelay on;
# -----------------------------------------------
# Keep-Alive 設定
# -----------------------------------------------
# クライアントとの Keep-Alive 接続を 15 秒間維持します
# 短すぎると接続再確立コストがかかり、長すぎると FD を占有します
keepalive_timeout 15;
# -----------------------------------------------
# ファイルキャッシュ(静的ファイルが多い場合に有効)
# -----------------------------------------------
# ファイルディスクリプタ・サイズ・更新時刻をメモリにキャッシュします
# 30 秒アクセスのなかったエントリは解放されます
open_file_cache max=1000 inactive=30s;
# 60 秒ごとにキャッシュの有効性を確認します
open_file_cache_valid 60s;
# -----------------------------------------------
# gzip 圧縮
# -----------------------------------------------
# gzip 圧縮を有効化します
gzip on;
# text/html は常に圧縮対象です(ここでは書かなくてよい)
# その他のよく使うテキスト系 MIME タイプを追加します
gzip_types
text/plain
text/css
text/javascript
application/json
application/javascript
application/x-javascript
text/xml
application/xml
application/xml+rss
image/svg+xml;
# 圧縮レベル 5 はCPUコストと圧縮率のバランスが良い値です
gzip_comp_level 5;
# 256 バイト未満の小さいレスポンスは圧縮しません
gzip_min_length 256;
# CDN やリバースプロキシが圧縮版を正しくキャッシュできるようにします
gzip_vary on;
# -----------------------------------------------
# クライアントサイズ制限
# -----------------------------------------------
# 画像・動画アップロードに備えて 20MB まで許可します
client_max_body_size 20m;
# リクエストボディのメモリバッファ(超過分はディスクへ書き出されます)
client_body_buffer_size 16k;
# -----------------------------------------------
# バーチャルホスト設定
# -----------------------------------------------
# 桐生グループ EC サイト
server {
listen 80;
server_name kiryu-group.example.com;
root /var/www/html/kiryu-shop;
index index.php index.html;
# 静的ファイルに長期キャッシュを設定します
location ~* \.(css|js|jpg|jpeg|png|gif|ico|woff2)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
}
実行するコマンドは次の通りです。
$ sudo nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful $ sudo systemctl reload nginx $ curl -I -H "Accept-Encoding: gzip" https://kiryu-group.example.com/ HTTP/2 200 server: nginx/1.26.0 content-type: text/html; charset=UTF-8 content-encoding: gzip vary: Accept-Encoding
概要
Nginx のパフォーマンスチューニングは、大きく「プロセス設定」「静的ファイル転送」「接続管理」「圧縮」の4つの領域に分かれます。worker_processes auto でCPUコアをフル活用し、sendfile on + tcp_nopush on でカーネルレベルの高速転送を実現します。keepalive_timeout を適切な値(10〜30秒程度)に設定することで、接続の再確立オーバーヘッドを削減しつつリソースの無駄遣いを防げます。gzip 圧縮は HTML / CSS / JS などのテキスト系レスポンスを大幅に圧縮し、ネットワーク転送量を削減します。ただし画像(JPEG / PNG)はすでに圧縮済みのため gzip_types に含めないことが重要です。Nginx の基本的なサーバーブロック設定については Nginxの設定 を、HTTPS・TLS のセキュリティ設定については NginxのSSL設定 を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。