Webサーバーの役割と特性

Webサーバー(Nginx / Apache)の主な役割は、クライアントからの HTTP リクエストを受け付け、 静的ファイルの配信・APサーバーへのリバースプロキシ・SSL/TLS 終端などを担うことだ。

Webサーバーの処理は I/O バウンド が中心であり、CPU よりも 同時接続数の管理ネットワーク帯域 が先にボトルネックになることが多い。 この特性が、スケールアップの判断を他サーバーと異なるものにする。

ボトルネックになるリソース

リソースNginx での傾向Apache(prefork/event)での傾向
CPUSSL 処理・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 が律速になるため効果が高い。

Nginx — nginx.conf(コア数連動設定)
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プロセスのメモリ使用量がそのまま必要メモリ量になる。

■ Apache prefork の必要メモリ試算
必要メモリ = MaxRequestWorkers × 1プロセスあたりのメモリ使用量 + OS 予約分
例:MaxRequestWorkers 300、1プロセス 25MB、OS 予約 2GB の場合
→ 300 × 25MB + 2GB = 7.5GB + 2GB = 9.5GB → 16GB 搭載
Apache — httpd.conf(prefork MPM)
<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 / CloudWatchP95 ≥ 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アクセスログ / APMSLO 閾値を超えた場合
Shell — アクティブ接続数と503エラー確認
# アクティブ接続数(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 の最適化で効果が出ることも多い