Apache vs Nginx 徹底比較 - どのウェブサーバーを選ぶべきか
Apache vs Nginx Complete Comparison - Which Web Server Should You Choose
序論:ウェブサーバーの選択はなぜ重要か
ウェブサービスを運営する際に最初に直面する選択肢の一つがウェブサーバーです。ApacheとNginxは世界のウェブサーバー市場の約60%を占める二大巨頭であり、それぞれ独自の設計思想と強みを持っています。
2026年現在、Netcraftのウェブサーバー調査によると、Nginxが約34%のシェアで1位を占めており、Apacheは約28%で続いています。しかし、シェアだけで「Nginxの方が優れている」と断定することはできません。どのウェブサーバーが優れているかは、運用環境、トラフィックパターン、チームの技術スタックによって完全に異なります。
この記事では、ApacheとNginxをアーキテクチャ、性能、設定、モジュール、セキュリティ、運用などあらゆる側面から客観的に比較し、状況別にどのウェブサーバーを選択すべきか明確なガイドを提供します。
1. 誕生背景と設計思想
1.1 Apache HTTP Server
- 誕生:1995年、NCSA HTTPdサーバーをベースに開発
- 開発主体:Apache Software Foundation(オープンソース)
- 名前の由来:"A Patchy Server"(パッチの集合体)
- 設計思想:柔軟性と拡張性。すべての機能をモジュールで提供し、
.htaccessによるディレクトリレベルの設定変更を許可 - コアバリュー:互換性、豊富な機能、コミュニティサポート
1.2 Nginx
- 誕生:2004年、Igor SysoevがC10K問題の解決のために設計
- 開発主体:F5 Networks(2019年買収)、オープンソース+商用版(Nginx Plus)
- 名前の由来:"Engine X"の略称
- 設計思想:性能と効率性。イベント駆動型の非同期処理により、最小限のリソースで最大限の同時接続を処理
- コアバリュー:高性能、低メモリ使用量、シンプルな設定
2. アーキテクチャ比較 - 最も根本的な違い
ApacheとNginxの最も根本的な違いはリクエスト処理アーキテクチャにあります。この違いが性能、メモリ、同時接続処理などほぼすべての面に影響を与えます。
2.1 Apache:プロセス/スレッドベース(MPM)
ApacheはMPM(Multi-Processing Module)というモジュールを通じてリクエストを処理します:
- prefork MPM:各リクエストに個別のプロセスを割り当て。安定的だがメモリ消費が大きい。PHPの
mod_phpとの併用時に必須。 - worker MPM:プロセス内に複数のスレッドを生成してリクエスト処理。preforkより効率的。
- event MPM:workerを改良した方式で、keep-alive接続を別スレッドに分離。Apache 2.4からデフォルト。
# Apache MPM確認
apachectl -V | grep MPM
# Server MPM: event
# MPM設定例 (/etc/apache2/mods-enabled/mpm_event.conf)
# StartServers 2
# MinSpareThreads 25
# MaxSpareThreads 75
# ThreadLimit 64
# ThreadsPerChild 25
# MaxRequestWorkers 150
# MaxConnectionsPerChild 0
2.2 Nginx:イベント駆動型非同期(Event-Driven)
Nginxは単一マスタープロセス+複数のワーカープロセス構造です。各ワーカーはイベントループを回しながら非同期(non-blocking)で数千の接続を同時に処理します。
# Nginxプロセス構造確認
ps aux | grep nginx
# root ... nginx: master process
# nginx ... nginx: worker process
# nginx ... nginx: worker process
# nginx ... nginx: worker process
# nginx ... nginx: worker process
2.3 アーキテクチャ比較まとめ
| 項目 | Apache | Nginx |
|---|---|---|
| 処理方式 | プロセス/スレッドベース | イベント駆動型非同期 |
| 接続モデル | 1接続=1プロセス(スレッド) | 1ワーカー=数千接続 |
| メモリ使用量 | 接続数に比例して増加 | 接続数が増えてもほぼ一定 |
| 同時接続の限界 | 数百~数千(ハードウェア依存) | 数万~数十万 |
| コンテキストスイッチ | プロセス/スレッド切替コストが発生 | 単一スレッド内のイベント切替(非常に軽量) |
3. 性能比較
3.1 静的ファイル配信
HTML、CSS、JS、画像などの静的ファイル配信ではNginxが圧倒的に高速です:
| シナリオ | Apache | Nginx |
|---|---|---|
| 静的ファイル 1,000同時リクエスト | ~2,500 req/s | ~9,000 req/s |
| メモリ使用量(1,000接続) | ~150MB | ~20MB |
| 10,000同時接続 | 急激な性能低下 | 安定的に処理 |
Nginxはsendfileシステムコールを活用してカーネルレベルで直接ファイルを転送するため、ユーザー空間へのデータコピーが不要で非常に効率的です。
3.2 動的コンテンツ(PHP、Pythonなど)
動的コンテンツの処理では、両ウェブサーバーの性能差はそれほど大きくありません。ボトルネックはウェブサーバーではなくアプリケーションサーバー(PHP-FPM、Python WSGIなど)で発生するためです。
- Apache:
mod_phpでPHPをプロセス内で直接実行。設定は簡単だが、各プロセスがPHPを内蔵するためメモリ使用量が大きい。 - Nginx:PHP-FPMにFastCGIでリクエストを転送。ウェブサーバーとPHPプロセスが分離されており、それぞれ独立してチューニング可能。
3.3 リバースプロキシ性能
リバースプロキシとして使用する場合はNginxが明確な強みを見せます:
- 非同期処理:数千のバックエンド接続を同時に維持しながらメモリ使用量を最小化
- コネクションプーリング:upstreamサーバーとの接続を再利用してオーバーヘッドを削減
- バッファリング:バックエンドの応答をバッファリングし、遅いクライアントによるバックエンド占有を防止
このような理由から、大規模サービスではApacheの前にNginxをリバースプロキシとして配置する組み合わせも非常に一般的です。
4. 設定方式の比較
4.1 Apacheの設定体系
# Apache仮想ホスト設定例
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/html
<Directory /var/www/example.com/html>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# URLリライト
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined
</VirtualHost>
Apacheの最大の特徴は.htaccessファイルです:
# .htaccess例(ディレクトリレベル設定)
RewriteEngine On
RewriteBase /
# WordPressパーマリンク
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# キャッシュ設定
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
</IfModule>
4.2 Nginxの設定体系
# Nginxサーバーブロック設定例
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com/html;
index index.html index.php;
# HTTPSリダイレクト
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com www.example.com;
root /var/www/example.com/html;
index index.html index.php;
# WordPressパーマリンク
location / {
try_files $uri $uri/ /index.php?$args;
}
# PHP処理
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 静的ファイルキャッシュ
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
access_log off;
}
}
4.3 設定方式比較表
| 項目 | Apache | Nginx |
|---|---|---|
| 設定ファイル形式 | XML類似(<Directory>など) |
C言語類似の中括弧ブロック |
| .htaccessサポート | 対応(ディレクトリレベル設定) | 非対応 |
| 設定変更の反映 | .htaccess:即時 / conf:reload | 常にreloadが必要 |
| URLリライト | mod_rewrite(正規表現が強力) |
try_files、rewrite(より直感的) |
| 学習難易度 | .htaccessは簡単、全体は複雑 | 設定構造がシンプルで一貫的 |
| 共有ホスティング適合性 | 非常に高い(.htaccessのおかげ) | 低い(サーバー設定ファイルの修正が必要) |
.htaccessは便利ですが性能コストがあります。Apacheはすべてのリクエストでディレクトリパスに沿って.htaccessファイルを検索するため、性能が重要な環境ではAllowOverride Noneで無効化し、メイン設定ファイルに直接記述するのが望ましいです。
5. モジュールシステムの比較
5.1 Apacheの動的モジュール
Apacheは200以上の公式モジュールを提供しており、サーバーの再起動なしに動的にモジュールをロード/アンロードできます:
# 利用可能なモジュール一覧
apachectl -M
# モジュール有効化(Ubuntu/Debian)
sudo a2enmod rewrite
sudo a2enmod ssl
sudo a2enmod proxy
sudo a2enmod headers
# モジュール無効化
sudo a2dismod autoindex
# 適用
sudo systemctl reload apache2
代表的なApacheモジュール:
mod_php- PHPをApacheプロセス内で直接実行mod_rewrite- 強力なURLリライトエンジンmod_security- Webアプリケーションファイアウォール(WAF)mod_proxy- リバースプロキシ機能mod_ssl- SSL/TLSサポートmod_deflate- レスポンス圧縮mod_auth_*- 多様な認証方式(LDAP、OAuthなど)
5.2 Nginxの静的モジュール
Nginxはほとんどのモジュールがコンパイル時に組み込みされます。動的モジュールサポートもありますが、Apacheほど柔軟ではありません:
# コンパイル済みモジュール確認
nginx -V 2>&1 | tr ' ' '\n' | grep module
# 動的モジュールロード(nginx.conf最上部)
# load_module modules/ngx_http_geoip_module.so;
# 主要な内蔵モジュール(デフォルト組み込み)
# ngx_http_ssl_module - SSL/TLS
# ngx_http_v2_module - HTTP/2
# ngx_http_gzip_module - レスポンス圧縮
# ngx_http_proxy_module - リバースプロキシ
# ngx_http_upstream_module - ロードバランシング
# ngx_http_rewrite_module - URLリライト
| 項目 | Apache | Nginx |
|---|---|---|
| モジュール数 | 200以上 | 約70(公式) |
| 動的ロード | 完全対応 | 限定的に対応 |
| サードパーティエコシステム | 非常に豊富 | 増加傾向(OpenResty、Luaなど) |
| PHP連携 | mod_php(内蔵実行) | PHP-FPM(FastCGIプロキシ) |
| WAF | mod_security(成熟) | ModSecurity for Nginx / NAXSI |
6. セキュリティ比較
6.1 セキュリティ脆弱性の履歴
- Apache:歴史が長いため報告されたCVEが多いが、ほとんどが迅速にパッチ適用済み。モジュールが多いため攻撃面(attack surface)が広い。
- Nginx:相対的に少ないCVE。コードベースが小さくシンプルなため、脆弱性の発生可能性が低い。
6.2 セキュリティ設定の比較
| セキュリティ機能 | Apache | Nginx |
|---|---|---|
| バージョン情報の非表示 | ServerTokens Prod |
server_tokens off; |
| ディレクトリリスティング防止 | Options -Indexes |
autoindex off;(デフォルト) |
| アクセス制御 | Require ip、.htaccess |
allow/denyディレクティブ |
| Rate Limiting | mod_ratelimit、mod_evasive |
limit_req、limit_conn(内蔵) |
| WAF | ModSecurity(非常に成熟) | ModSecurity / NAXSI |
| SSL/TLS | mod_ssl(成熟) | 内蔵SSL(成熟) |
.htaccessは便利ですがセキュリティリスクもあります。ユーザーがアップロードした.htaccessファイルでサーバー設定を変更できるため、共有ホスティングではAllowOverrideを最小限に設定する必要があります。
7. ユースケース別の推奨
7.1 Nginxを選ぶべき場合
- 高い同時接続を処理する必要がある場合(10,000以上の同時接続)
- 静的コンテンツの配信が主要なワークロードの場合(CDN、画像サーバー)
- リバースプロキシやロードバランサーが必要な場合
- API Gatewayとして使用する場合
- マイクロサービス環境でルーティングが必要な場合
- メモリが限られた環境(コンテナ、小型サーバー)
- Node.js、Python、Goなど自前のHTTPサーバーを持つアプリのフロントエンド
7.2 Apacheを選ぶべき場合
- 共有ホスティング環境でユーザー別の設定が必要な場合(
.htaccess) - WordPress、Drupalなど
.htaccessに依存するCMSの運用時 - 複雑なURLリライトが
mod_rewriteで既に実装されている場合 - mod_securityのような成熟したWAFが必要な場合
- レガシーシステムとの互換性が必要な場合
- 多様な認証モジュール(LDAP、Kerberos、OAuth)が必要な場合
- チームがApacheに精通している場合
7.3 ハイブリッド構成(最も一般的な実践パターン)
実務で最も多く使われるパターンはNginx + Apache構成です:
# Nginxをフロントエンド(リバースプロキシ)として使用
# Apacheをバックエンド(動的コンテンツ処理)として使用
# Nginx設定
upstream apache_backend {
server 127.0.0.1:8080;
}
server {
listen 80;
server_name example.com;
# 静的ファイルはNginxが直接配信
location ~* \.(jpg|jpeg|png|gif|css|js|ico|woff2?)$ {
root /var/www/example.com;
expires 30d;
access_log off;
}
# 動的リクエストはApacheに転送
location / {
proxy_pass http://apache_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# Apacheを8080ポートに変更
# /etc/apache2/ports.conf
# Listen 8080
# Apache VirtualHostも8080に変更
# <VirtualHost *:8080>
.htaccess処理を担当します。それぞれの強みだけを活かした最適な組み合わせです。
8. 総合比較一覧
| 比較項目 | Apache | Nginx | 優勢 |
|---|---|---|---|
| 静的ファイル性能 | 普通 | 非常に高速 | Nginx |
| 動的コンテンツ性能 | 良好 | 良好 | 引き分け |
| 同時接続処理 | 普通(MPM依存) | 非常に優秀 | Nginx |
| メモリ効率 | 普通 | 非常に優秀 | Nginx |
| リバースプロキシ | 可能 | 最適化済み | Nginx |
| モジュールの豊富さ | 200以上 | 70以上 | Apache |
| 動的モジュールロード | 完全対応 | 限定的 | Apache |
| .htaccessサポート | 対応 | 非対応 | Apache |
| 設定の柔軟性 | ディレクトリレベルまで可能 | サーバー設定ファイルのみ | Apache |
| 設定のシンプルさ | XML類似(冗長) | C類似(簡潔) | Nginx |
| セキュリティ(WAF) | ModSecurity(成熟) | 限定的 | Apache |
| コンテナ適合性 | 普通 | 非常に優秀 | Nginx |
| コミュニティ/ドキュメント | 非常に豊富(30年の歴史) | 豊富(急速に成長中) | Apache |
結論:「どちらが優れているか」ではなく「どちらがより適しているか」
ApacheとNginxは「どちらが優れている」と結論づけることが難しいです。どちらもプロダクション環境で数十億のリクエストを安定的に処理する実績のあるウェブサーバーだからです。
最終選択のための意思決定ガイド:
- 「大規模トラフィック、リバースプロキシ、コンテナ環境」 → Nginx
- 「共有ホスティング、.htaccess、レガシーCMS」 → Apache
- 「静的ファイル+動的コンテンツの両方を最適化」 → Nginx(フロント)+ Apache(バックエンド)構成
- 「決められない」 → Nginx(トレンド、性能、効率すべてで優勢)
重要なのは、一度選択した後も両方のウェブサーバーに対する基本的な理解を維持することです。実務ではハイブリッド構成、マイグレーション、レガシーシステムの保守などで両方を扱わなければならない状況が頻繁にあります。このガイドが皆さんのウェブサーバー選択と運用のお役に立てれば幸いです。