はじめに:Webサーバーのパフォーマンス、1秒が売上を左右する

Googleの調査によると、モバイルWebページの読み込み時間が1秒から3秒に増えると離脱率が32%増加します。5秒まで延びると離脱率は90%に達します。Amazonはページ読み込みが100ms遅くなるごとに売上が1%減少すると発表しており、Walmartは1秒の改善でコンバージョン率が2%上昇したと報告しています。

Webサーバーのパフォーマンスチューニングは、こうしたビジネスインパクトを生み出す最もコスト効率の高い作業です。サーバーを1台追加するより、既存サーバーの設定を最適化するほうがはるかに安価で即効性がある場合が多いです。実際、デフォルト設定のNginxとしっかりチューニングされたNginxでは、同じハードウェアで5〜10倍のパフォーマンス差が出ることも珍しくありません。

本ガイドでは、Nginx Webサーバーのパフォーマンスを最大化するすべてのチューニング手法を体系的に解説します。Workerプロセス設定から、カーネルパラメータ、TLS最適化、HTTP/2・HTTP/3、圧縮、キャッシング、そしてベンチマークまで、実務ですぐに適用できる具体的な設定と数値を併せて紹介します。

1. パフォーマンス計測と現状把握

1.1 チューニング前に必ず計測せよ

チューニングの第一原則は「計測しないものは改善できない」です。現在のパフォーマンスを正確に計測せずに設定から変更するのは誤ったアプローチです。チューニング前後の数値を比較できて初めて効果を判断できます。

1.2 ベンチマークツール

# === ab (Apache Benchmark) - 最もシンプル ===
# 10,000リクエスト、100同時接続
ab -n 10000 -c 100 https://example.com/

# keep-alive有効化 (より現実的)
ab -n 10000 -c 100 -k https://example.com/

# POSTリクエストテスト
ab -n 1000 -c 10 -p data.json -T application/json https://example.com/api/


# === wrk - より強力な負荷テスト ===
sudo apt install wrk -y

# 30秒間、10スレッド、100接続
wrk -t10 -c100 -d30s https://example.com/

# 詳細なレイテンシ分布
wrk -t10 -c100 -d30s --latency https://example.com/

# スクリプトで複雑なシナリオ
wrk -t10 -c100 -d30s -s script.lua https://example.com/


# === hey - Goで書かれたモダンなツール ===
go install github.com/rakyll/hey@latest

hey -n 10000 -c 100 https://example.com/


# === vegeta - 継続的負荷テスト ===
echo "GET https://example.com/" | \
  vegeta attack -rate=500 -duration=60s | \
  vegeta report

1.3 主要パフォーマンス指標(KPI)

指標 説明 目標値
RPS (Requests/sec) 秒あたり処理リクエスト数 ハードウェアによる、高いほど良い
Latency p50 リクエスト応答時間の中央値 < 100ms
Latency p99 99パーセンタイル応答時間 (テール遅延) < 500ms
Error Rate 失敗リクエスト率 < 0.1%
CPU使用率 プロセスあたりCPU使用率 平均60〜70%
メモリ使用率 Workerあたりメモリ使用量 安定していて一貫性があること

1.4 システムリソースのリアルタイム監視

# 総合リソース
htop
btop    # よりモダンなインターフェース

# CPU詳細
mpstat -P ALL 1

# ディスクI/O
iostat -xz 1
iotop

# ネットワーク
iftop
nethogs
ss -s    # ソケット統計

# Nginx stub_status
curl http://localhost:8080/nginx_status
# Active connections: 291
# server accepts handled requests
#  16630948 16630948 31070465
# Reading: 6 Writing: 179 Waiting: 106

2. WorkerプロセスとConnectionのチューニング

2.1 worker_processes設定

Workerプロセスは実際のリクエストを処理するNginxの中核です。一般的にCPUコア数と同じに設定します:

# /etc/nginx/nginx.conf (グローバルコンテキスト)

# 最も推奨: 自動検出
worker_processes auto;

# または明示的にCPUコア数
# worker_processes 8;    # 8コアCPUの場合

# CPUコアにWorkerを固定 (CPU affinity)
# コンテキストスイッチ削減、キャッシュ局所性向上
worker_cpu_affinity auto;

# 明示的に指定 (8コアの例)
# worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

2.2 worker_connections設定

各Workerプロセスが同時に処理できる最大接続数です。この値がNginx全体の同時処理能力を決定します:

events {
    # Workerあたり最大接続数
    worker_connections 65535;

    # イベント処理方式 (Linuxではepollが最適)
    use epoll;

    # 一度に複数接続を受け付け
    multi_accept on;

    # accept相互排他 (Worker間のロードバランシング)
    # 高負荷環境ではoff推奨 (Nginx 1.11.3+)
    accept_mutex off;
}

理論上の最大同時接続数 = worker_processes × worker_connections

例: 8コア × 65535 = 524,280同時接続可能

注意: worker_connectionsを高く設定するには、OSのファイルディスクリプタ制限も合わせて増やす必要があります。設定しないとToo many open filesエラーが発生します。

2.3 ファイルディスクリプタ制限の拡大

# === システム全体の制限 ===
# /etc/sysctl.conf
sudo tee -a /etc/sysctl.conf << 'EOF'
fs.file-max = 2097152
fs.nr_open = 2097152
EOF

sudo sysctl -p

# === ユーザー別制限 (/etc/security/limits.conf) ===
sudo tee -a /etc/security/limits.conf << 'EOF'
nginx soft nofile 65535
nginx hard nofile 65535
* soft nofile 65535
* hard nofile 65535
EOF

# === systemdサービス制限 ===
sudo mkdir -p /etc/systemd/system/nginx.service.d
sudo tee /etc/systemd/system/nginx.service.d/override.conf << 'EOF'
[Service]
LimitNOFILE=65535
EOF

sudo systemctl daemon-reload
sudo systemctl restart nginx
# Nginxグローバルコンテキストでも明示
worker_rlimit_nofile 65535;

2.4 接続最適化の検証

# 現在のNginx Workerの開いているファイル数確認
for pid in $(pgrep -f "nginx: worker"); do
    echo "PID $pid: $(ls /proc/$pid/fd | wc -l) open files"
done

# 現在設定されている制限確認
cat /proc/$(pgrep -f "nginx: master")/limits | grep "Max open files"

3. カーネルパラメータチューニング (sysctl)

Nginx設定だけでは限界があります。OSカーネルレベルのチューニングが併せて行われて初めて、真のパフォーマンス向上が得られます。

3.1 推奨カーネルパラメータ

# /etc/sysctl.d/99-nginx-tuning.conf
sudo tee /etc/sysctl.d/99-nginx-tuning.conf << 'EOF'

# === ファイルディスクリプタ ===
fs.file-max = 2097152
fs.nr_open = 2097152

# === TCP接続キューサイズ ===
# 待機中TCP接続 (SYN_RECV状態)
net.ipv4.tcp_max_syn_backlog = 65535
# accept()待ちキュー
net.core.somaxconn = 65535
# ネットワークデバイスバックログ
net.core.netdev_max_backlog = 16384

# === TCP TIME_WAIT最適化 ===
# TIME_WAITソケット再利用
net.ipv4.tcp_tw_reuse = 1
# TIME_WAIT最大数
net.ipv4.tcp_max_tw_buckets = 1440000
# FIN_WAIT時間
net.ipv4.tcp_fin_timeout = 15
# keep-alive時間
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 60
net.ipv4.tcp_keepalive_probes = 3

# === ローカルポート範囲拡張 ===
net.ipv4.ip_local_port_range = 1024 65535

# === TCPバッファサイズ ===
# 受信バッファ (最小、デフォルト、最大)
net.ipv4.tcp_rmem = 4096 87380 16777216
# 送信バッファ
net.ipv4.tcp_wmem = 4096 65536 16777216
# TCP全体メモリ
net.ipv4.tcp_mem = 786432 1048576 26777216

# === ソケットバッファ ===
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 262144
net.core.wmem_default = 262144

# === TCP輻輳制御 ===
# BBR有効化 (Linux 4.9+) - 高帯域ネットワークで優秀
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

# === TCP Fast Open (高速接続再利用) ===
net.ipv4.tcp_fastopen = 3

# === SYN Flood防御 ===
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 2

# === IPv6 (必要時) ===
net.ipv6.ip_local_port_range = 1024 65535

EOF

# 適用
sudo sysctl -p /etc/sysctl.d/99-nginx-tuning.conf

3.2 BBR輻輳制御の有効化確認

# BBRサポート確認
sudo sysctl net.ipv4.tcp_congestion_control

# 利用可能な輻輳制御アルゴリズム
sudo sysctl net.ipv4.tcp_available_congestion_control

# BBRモジュールロード (必要時)
sudo modprobe tcp_bbr
echo "tcp_bbr" | sudo tee /etc/modules-load.d/bbr.conf
BBRの効果: Googleが開発したBBR(Bottleneck Bandwidth and RTT)は、既存のCUBICアルゴリズムと比べて、特に長距離ネットワークや高帯域環境で卓越したパフォーマンスを発揮します。YouTubeとGoogle Cloudは、BBRによってスループットを最大2700倍向上させたと報告しています。

4. HTTPプロトコル最適化

4.1 HTTP/2有効化

HTTP/2は単一接続で複数リクエストを同時に処理(マルチプレキシング)できるため、HTTP/1.1と比べて飛躍的なパフォーマンス向上を提供します:

server {
    # http2オプション追加
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name example.com;

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

    # HTTP/2パフォーマンスチューニング
    http2_max_concurrent_streams 128;
    http2_recv_buffer_size 256k;

    # ...
}

4.2 HTTP/3 (QUIC) 有効化

HTTP/3はUDPベースのQUICプロトコルを使用し、HTTP/2よりも高速な接続確立とパケットロス復旧を提供します。Nginx 1.25.0から公式にサポートされています:

server {
    # HTTP/2 (TCP 443)
    listen 443 ssl;
    http2 on;

    # HTTP/3 (UDP 443)
    listen 443 quic reuseport;
    listen [::]:443 quic reuseport;
    http3 on;

    # HTTP/3サポート通知
    add_header Alt-Svc 'h3=":443"; ma=86400';

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

    # QUIC最適化
    ssl_early_data on;    # 0-RTTサポート

    server_name example.com;
    # ...
}
# UDP 443ポートのファイアウォール許可 (HTTP/3)
sudo ufw allow 443/udp
sudo firewall-cmd --add-port=443/udp --permanent
sudo firewall-cmd --reload

5. TLS/SSLパフォーマンス最適化

HTTPSは必須となりましたが、TLSハンドシェイクは相応のオーバーヘッドを発生させます。適切な最適化によりこのコストを最小化できます。

server {
    listen 443 ssl http2;
    server_name example.com;

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

    # === プロトコル (旧バージョン除去) ===
    ssl_protocols TLSv1.2 TLSv1.3;

    # === 暗号スイート ===
    # TLS 1.3は自動最適化
    # TLS 1.2用のモダンな暗号を優先
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
    ssl_prefer_server_ciphers off;    # TLS 1.3ではoff推奨

    # === SSLセッションキャッシュ (ハンドシェイク再利用) ===
    ssl_session_cache shared:SSL:50m;    # 50MB = 約20万セッション
    ssl_session_timeout 1d;              # 1日
    ssl_session_tickets off;             # セキュリティのためoff

    # === OCSP Stapling ===
    # 証明書の有効性検証をサーバーが代行 (クライアント1-RTT節約)
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    resolver 1.1.1.1 8.8.8.8 valid=300s;
    resolver_timeout 5s;

    # === TLS 1.3 early data (0-RTT) ===
    ssl_early_data on;
    # early dataではidempotentリクエストのみ許可するようアプリでチェック
    proxy_set_header Early-Data $ssl_early_data;
}
ECDSA証明書の使用を推奨: RSAの代わりにECDSA(楕円曲線)証明書を使うと、ハンドシェイクが大幅に高速になり、CPU使用量も削減できます。Let's Encryptでは--key-type ecdsaオプションで発行できます。

6. 圧縮最適化 (Gzip/Brotli)

6.1 Gzip圧縮

http {
    gzip on;

    # 圧縮レベル (1-9)
    # 6がCPUコスト対効果のバランスが最も良い
    gzip_comp_level 6;

    # 最小圧縮サイズ (小さすぎるファイルは逆に非効率)
    gzip_min_length 1024;

    # プロキシ経由のリクエストも圧縮
    gzip_proxied any;

    # User-Agentに応じてVaryヘッダを追加
    gzip_vary on;

    # サポートするMIMEタイプ
    gzip_types
        text/plain
        text/css
        text/xml
        text/javascript
        application/javascript
        application/x-javascript
        application/json
        application/xml
        application/xml+rss
        application/atom+xml
        application/rss+xml
        application/ld+json
        application/manifest+json
        image/svg+xml
        image/x-icon
        font/ttf
        font/otf
        font/woff
        font/woff2;

    # バッファサイズ
    gzip_buffers 16 8k;
    gzip_http_version 1.1;

    # すでに圧縮されたファイルは除外
    gzip_disable "msie6";
}

6.2 Brotli圧縮 (Gzipより効率的)

BrotliはGoogleが開発した最新の圧縮アルゴリズムで、同等の品質でGzipより15〜25%小さいサイズを実現します。Nginxにはデフォルトで含まれていないため、別途モジュールが必要です:

# Ubuntu/Debian - Nginx + Brotliモジュールのインストール
sudo apt install libnginx-mod-http-brotli-filter libnginx-mod-http-brotli-static -y

# RHEL/CentOS
sudo dnf install nginx-module-brotli -y

# モジュールロード確認 (Ubuntuの場合は自動)
ls /etc/nginx/modules-enabled/ | grep brotli
# nginx.confグローバルコンテキスト (必要時)
load_module modules/ngx_http_brotli_filter_module.so;
load_module modules/ngx_http_brotli_static_module.so;

http {
    # Brotli動的圧縮
    brotli on;
    brotli_comp_level 6;       # 1-11 (6がバランス点)
    brotli_min_length 1024;
    brotli_types
        text/plain
        text/css
        text/javascript
        application/javascript
        application/json
        application/xml
        application/rss+xml
        application/atom+xml
        image/svg+xml
        font/ttf
        font/otf
        font/woff
        font/woff2;

    # 事前圧縮済みの.brファイルを配信 (CPU負担なし)
    brotli_static on;

    # GzipとBrotliの同時有効化可能 (クライアントがサポートするものを選択)
    gzip on;
    # ... Gzip設定
}

7. キャッシングと静的ファイルの最適化

7.1 ブラウザキャッシング

# 静的リソース別キャッシング戦略
server {
    # 画像 (長期キャッシング)
    location ~* \.(jpg|jpeg|png|gif|ico|webp|avif|svg)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        access_log off;
    }

    # CSS/JS (中期キャッシング、ハッシュベースのキャッシュバスティング)
    location ~* \.(css|js)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        access_log off;
    }

    # フォント (超長期キャッシング + CORS)
    location ~* \.(woff|woff2|ttf|otf|eot)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        add_header Access-Control-Allow-Origin "*";
        access_log off;
    }

    # HTML (短期キャッシング + 再検証)
    location ~* \.(html|htm)$ {
        expires 5m;
        add_header Cache-Control "public, must-revalidate";
    }

    # APIレスポンス (キャッシング禁止)
    location /api/ {
        add_header Cache-Control "no-store, no-cache, must-revalidate";
        # ...
    }
}

7.2 sendfileとtcp_nopush

http {
    # === sendfile: カーネルから直接ファイル送信 ===
    # ユーザー空間コピーを排除し、パフォーマンス向上
    sendfile on;
    sendfile_max_chunk 1m;

    # === tcp_nopush: レスポンスヘッダとファイル先頭を1パケットに ===
    # sendfileと併用
    tcp_nopush on;

    # === tcp_nodelay: Nagleアルゴリズム無効化 ===
    # keepalive接続での小パケット遅延を防ぐ
    tcp_nodelay on;

    # === ファイルディスクリプタキャッシュ ===
    # よくアクセスされるファイルのメタデータをキャッシュ
    open_file_cache max=10000 inactive=30s;
    open_file_cache_valid 60s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;

    # === Keep-Alive ===
    keepalive_timeout 65;
    keepalive_requests 10000;    # 1接続あたり最大リクエスト数
    reset_timedout_connection on;
}

8. プロキシキャッシュとマイクロキャッシング

8.1 伝統的なプロキシキャッシング

http {
    # キャッシュ領域定義
    proxy_cache_path /var/cache/nginx/proxy
                     levels=1:2
                     keys_zone=api_cache:100m    # 100MBメタデータ
                     max_size=5g                 # 5GBディスク
                     inactive=7d                 # 7日未使用で削除
                     use_temp_path=off;

    server {
        location /api/ {
            proxy_cache api_cache;
            proxy_cache_key "$scheme$request_method$host$request_uri";

            # ステータスコード別キャッシュ時間
            proxy_cache_valid 200 302 10m;
            proxy_cache_valid 301 1h;
            proxy_cache_valid 404 1m;
            proxy_cache_valid any 30s;

            # キャッシュロック (サンダリングハード防止)
            proxy_cache_lock on;
            proxy_cache_lock_timeout 5s;

            # バックエンド障害時は古いキャッシュを使用
            proxy_cache_use_stale error timeout updating
                                  http_500 http_502 http_503 http_504;
            proxy_cache_background_update on;

            # キャッシュ状態の可視化 (デバッグ)
            add_header X-Cache-Status $upstream_cache_status;

            proxy_pass http://backend;
        }
    }
}

8.2 マイクロキャッシング - 動的コンテンツの超高速化

マイクロキャッシングとは「たった1秒だけキャッシュする」手法です。高トラフィックサイトでバックエンド負荷を劇的に削減できます:

location / {
    proxy_cache api_cache;
    proxy_cache_key "$scheme$request_method$host$request_uri";

    # たった1秒だけキャッシュ
    proxy_cache_valid 200 1s;

    # キャッシュロックで重複バックエンド呼び出しを防止
    proxy_cache_lock on;

    # Set-Cookieがあればキャッシュしない (ログインユーザー)
    proxy_no_cache $http_pragma $http_authorization;
    proxy_cache_bypass $http_pragma $http_authorization;

    proxy_pass http://backend;

    add_header X-Cache-Status $upstream_cache_status;
}
マイクロキャッシングの効果: 1秒あたり1,000リクエストが届くページを1秒キャッシングすると、バックエンド呼び出しは秒あたり1回に減ります。ユーザー視点では最大1秒遅延したデータを見るだけですが、サーバー負荷は99.9%削減されます。

9. Nginxバッファとタイムアウトの最適化

http {
    # === クライアントリクエストバッファ ===
    client_body_buffer_size 128k;
    client_max_body_size 50m;
    client_header_buffer_size 4k;
    large_client_header_buffers 4 16k;

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

    # === プロキシバッファ ===
    proxy_buffering on;
    proxy_buffer_size 8k;
    proxy_buffers 16 8k;
    proxy_busy_buffers_size 16k;
    proxy_max_temp_file_size 2048m;
    proxy_temp_file_write_size 16k;

    # === プロキシ接続再利用 ===
    # upstream keepaliveと併用
    proxy_http_version 1.1;
    proxy_set_header Connection "";
}

upstream backend {
    server 127.0.0.1:3000;
    # Workerあたり維持するアイドル接続
    keepalive 64;
    keepalive_requests 1000;
    keepalive_timeout 60s;
}

10. 実戦チューニング前後比較

実際に本ガイドのチューニングを適用した場合、どの程度の効果があるのか見てみましょう。

10.1 ベンチマークシナリオ

  • ハードウェア: 4 vCPU, 8GB RAM, Ubuntu 22.04
  • テスト: wrk -t4 -c1000 -d60s https://example.com/
  • コンテンツ: 静的HTML + CSS + JS (〜200KB)

10.2 チューニング前後比較

指標 デフォルト設定 完全チューニング 改善
Requests/sec 3,200 31,500 +884%
Latency p50 312ms 32ms -90%
Latency p99 1,820ms 145ms -92%
エラー率 2.3% 0.01% -99%
レスポンスサイズ (圧縮) 200KB 32KB -84%
CPU使用率 95% (飽和) 65% 余裕確保

同じハードウェアで約10倍のスループット向上応答時間90%削減を達成できます。

11. チェックリストとトラブルシューティング

11.1 パフォーマンスチューニングチェックリスト

  • まず計測: チューニング前後のベンチマークで効果検証
  • worker_processes auto: CPUコア数に合わせる
  • worker_connections 65535: 高同時接続への準備
  • ファイルディスクリプタ制限の拡大: LimitNOFILE=65535
  • カーネルパラメータ適用: /etc/sysctl.d/99-nginx-tuning.conf
  • BBR輻輳制御の有効化
  • HTTP/2有効化: listen 443 ssl http2;
  • HTTP/3 (オプション): Nginx 1.25+環境で有効化
  • TLS 1.3 + セッションキャッシュ: ハンドシェイクコスト最小化
  • OCSP Stapling有効化
  • Gzip + Brotli併用圧縮
  • sendfile + tcp_nopush + tcp_nodelay有効化
  • open_file_cache有効化
  • 静的ファイルの長期キャッシング: 画像/CSS/JSは1年
  • プロキシキャッシュまたはマイクロキャッシングの適用
  • Upstream keepalive: バックエンド接続再利用
  • Worker CPU affinity: コンテキストスイッチ削減

11.2 よく遭遇するボトルネックと解決

症状 原因 解決策
"Too many open files" ファイルディスクリプタ不足 LimitNOFILE + worker_rlimit_nofileを増やす
"Connection refused"急増 somaxconnまたはbacklog不足 カーネルパラメータ増加
高いCPU使用率 圧縮レベルが高すぎるかSSLオーバーヘッド gzip_comp_level 5〜6、ECDSA証明書
高いレイテンシ (p99) バックエンドボトルネックまたはキャッシュミス プロキシキャッシング、マイクロキャッシング適用
メモリ使用量が継続増加 proxy_buffers設定が不適切 適切なバッファサイズに調整
TIME_WAITソケット過多 接続再利用不足 tcp_tw_reuse=1、keepalive活用

結論: チューニングは科学であり芸術である

Webサーバーのパフォーマンスチューニングは、単に設定値をコピー&ペーストする作業ではありません。各環境の特性、トラフィックパターン、アプリケーションの性格によって最適な設定は異なります。本ガイドで提示した値はあくまで一般的な出発点にすぎず、計測と反復的なチューニングを通じて、自分の環境に最も適した値を見つける必要があります。

核心原則を改めて整理すると:

  • 計測なくしてチューニングなし - ベンチマークでベースラインを作り、変更後の効果を検証しましょう。
  • 一度に一つずつ変更 - 複数の設定を同時に変更すると、どれが効果を生んだのか分かりません。
  • ボトルネックを見つけよ - CPU? メモリ? ネットワーク? ディスク? 実際のボトルネックがある箇所を攻めるべきです。
  • OSとNginxを合わせて - Nginx設定だけでは限界があります。カーネルチューニングも必ず併行する必要があります。
  • キャッシングこそ最高の最適化 - リクエストを受けないことより速いものはありません。まずキャッシング戦略を考えましょう。
  • HTTPSは選択ではなく必須 - TLSオーバーヘッドを心配せず、代わりにTLS自体を最適化しましょう。
  • 最新プロトコルを活用 - HTTP/2、HTTP/3、Brotliは単に「あると良い」ものではなく、明確なパフォーマンスメリットを提供します。

本ガイドの設定を段階的に適用しながら、自分の環境に合った最適値を探してみてください。Webサーバーのパフォーマンスチューニングは一度きりの作業ではなく、サービスの成長に合わせて継続的に再評価し調整すべき運用の一部です。きちんとチューニングされたNginxは、同じハードウェアで10倍のユーザーを収容可能にしてくれます。これは最も効果的なインフラ投資と言えるでしょう。