Webサーバーの役割と特性
Webサーバー(Nginx / Apache)の主な役割は、クライアントからの HTTP リクエストを受け付け、 静的ファイルの配信・APサーバーへのリバースプロキシ・SSL/TLS 終端などを担うことだ。
Webサーバーの処理は I/O バウンド が中心であり、CPU よりも 同時接続数の管理 と ネットワーク帯域 が先にボトルネックになることが多い。 この特性が、スケールアップの判断を他サーバーと異なるものにする。
ボトルネックになるリソース
| リソース | Nginx での傾向 | Apache(prefork/event)での傾向 |
|---|---|---|
| CPU | SSL 処理・gzip 圧縮時に上昇。静的配信は低 CPU。 | 同左。MPM worker/event は prefork より効率的。 |
| メモリ | 1接続あたりのメモリ消費は非常に小さい(数KB)。 | prefork は1プロセス/接続で大量メモリを消費しやすい。 |
| 接続数(FD) | worker_connections と OS の ulimit が上限。 | MPM の MaxRequestWorkers が上限。 |
| ネットワーク帯域 | 大容量ファイル配信で帯域を使い切ることがある。 | 同左。 |
💡 Nginx の同時接続数の計算
Nginx の最大同時接続数 = worker_processes × worker_connections。例えば worker_processes 8; worker_connections 4096; なら最大 32,768 接続を処理できます(ただし OS の ulimit -n が上限になる場合あり)。
スケールアップの内容と効果
① CPU コア数を増やす
Nginx の場合、worker_processes auto; と設定すると CPU コア数に合わせてワーカーが自動調整される。
コア数を増やすとワーカー数が増加し、並列処理数が向上する。
特に SSL/TLS 終端・gzip 圧縮を行う構成では CPU が律速になるため効果が高い。
worker_processes auto; # CPU コア数に自動設定
events {
worker_connections 4096; # 1ワーカーあたりの最大接続数
use epoll; # Linux では epoll を明示
multi_accept on; # 一度に複数接続を受け入れる
}
# スケールアップ後は worker_rlimit_nofile も上げる
worker_rlimit_nofile 65536; # ulimit -n に合わせる
② メモリを増やす(Apache prefork の場合)
Apache の prefork MPM は1リクエスト1プロセス方式のため、 同時接続数 × 1プロセスのメモリ使用量がそのまま必要メモリ量になる。
→ 300 × 25MB + 2GB = 7.5GB + 2GB = 9.5GB → 16GB 搭載
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 300 # ← メモリ増強後に引き上げる
MaxConnectionsPerChild 1000
</IfModule>
③ ネットワーク帯域を増やす(物理)
大容量ファイル配信(動画・パッケージ配布など)で帯域が上限に達した場合は、 NIC の増設・ボンディングまたは上位スイッチへの変更が有効だ。 クラウドでは ENA(Elastic Network Adapter)対応インスタンスへのアップグレードが相当する。
スケールダウンの考え方
Webサーバーは I/O バウンドなため、閑散期のリソース余剰が大きいことが多い。 夜間・週末に使用率が 10〜20% 程度になるなら、スケールダウンによるコスト削減の余地がある。
| スケールダウン項目 | リスク | 対処 |
|---|---|---|
| CPU コア数削減 | SSL 処理が遅延しやすい | SSL セッションキャッシュを有効化してから試みる |
| メモリ削減(Apache) | MaxRequestWorkers を下げる必要があり、同時接続数が減少 | event MPM への移行を先に検討する |
| インスタンスクラス変更(クラウド) | ダウンタイムが発生する場合がある | ブルーグリーンデプロイで無停止化 |
⚠️ スケールダウン前に必ず確認すること
① 閑散期でも突発的なクロールやキャンペーンが発生していないか確認する。② MaxRequestWorkers を下げる場合、503 エラーが増加しないか 1〜2 週間モニタリングする。③ worker_connections を削減する場合は accept キューの溢れ(netstat -s | grep overflow)を監視する。
スケールアップ vs スケールアウト
Webサーバーはスケールアウト(台数追加)との相性が最も良いサーバー種の一つだ。 ステートレスな構造のため、ロードバランサー(ALB / NLB / HAProxy)を前段に置くだけで ほぼ無制限に水平拡張できる。
| 判断基準 | スケールアップが有効 | スケールアウトが有効 |
|---|---|---|
| 構成変更の容易さ | 既存1台の強化のみ。設定変更が少ない | LB の設定・デプロイ自動化が必要 |
| コスト | 小規模では単純でコスト管理しやすい | 台数が増えると管理コストも増加 |
| 耐障害性 | 単一障害点(SPOF)が残る | 1台落ちてもサービス継続できる |
| 限界 | 1台の物理・仮想上限がある | 事実上の上限なし |
✅ 目安:CPU 70%、接続数 80% を超えたらスケールアウトを検討
スケールアップで対処できるのは一時的な増加まで。ピーク CPU 使用率が常時 70% を超え、かつ同時接続数が最大接続数の 80% を超えるようになったら、スケールアウトへの移行タイミングです。
判断指標(監視メトリクス)
| メトリクス | 確認コマンド / ツール | スケールアップの目安 |
|---|---|---|
| CPU 使用率 | mpstat 1 10 / CloudWatch | P95 ≥ 70% |
| アクティブ接続数 | ss -s / nginx -T | grep worker_connections | 最大値の 80% 超え |
| メモリ使用率 | free -m / vmstat | スワップ使用が継続 |
| 503 エラー率 | アクセスログ分析 / ALB メトリクス | 全リクエストの 0.1% 超え |
| ネットワーク帯域 | sar -n DEV 1 10 / NIC 統計 | NIC 帯域の 70% 超え |
| レスポンスタイム P99 | アクセスログ / APM | SLO 閾値を超えた場合 |
# アクティブ接続数(ESTABLISHED のみカウント)
ss -s | grep estab
# Nginx のアクティブ接続(stub_status が有効な場合)
curl http://localhost/nginx_status
# 直近1時間の 503 エラー数をアクセスログから集計
awk '$9==503' /var/log/nginx/access.log | wc -l
# ネットワーク帯域使用量(受信: rxkB/s, 送信: txkB/s)
sar -n DEV 1 10 | grep eth0
まとめ
| 項目 | 要点 |
|---|---|
| ボトルネック | CPU(SSL/gzip 時)・同時接続数・ネットワーク帯域 |
| スケールアップ主目的 | SSL 処理速度向上・prefork のメモリ確保・帯域確保 |
| スケールダウン時期 | 夜間・週末の使用率 20% 以下が継続する場合 |
| スケールアウト移行タイミング | CPU P95 ≥ 70% かつ接続数 ≥ 80% が常態化 |
| 設定チューニングを先に | keepalive_timeout・gzip・sendfile の最適化で効果が出ることも多い |