序論:ウェブサーバーの選択はなぜ重要か

ウェブサービスを運営する際に最初に直面する選択肢の一つがウェブサーバーです。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ワーカー=数千接続
メモリ使用量 接続数に比例して増加 接続数が増えてもほぼ一定
同時接続の限界 数百~数千(ハードウェア依存) 数万~数十万
コンテキストスイッチ プロセス/スレッド切替コストが発生 単一スレッド内のイベント切替(非常に軽量)
核心的な違い: Apacheはリクエストが来るたびにプロセス/スレッドを割り当てる「1:1モデル」であり、Nginxは一つのワーカーが複数のリクエストを同時に処理する「1:Nモデル」です。この違いが大規模同時接続時に劇的な性能差を生み出します。

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など)で発生するためです。

  • Apachemod_phpでPHPをプロセス内で直接実行。設定は簡単だが、各プロセスがPHPを内蔵するためメモリ使用量が大きい。
  • Nginx:PHP-FPMにFastCGIでリクエストを転送。ウェブサーバーとPHPプロセスが分離されており、それぞれ独立してチューニング可能。
誤解に注意:「Nginxが常に速い」というのは正確ではありません。静的ファイルと高い同時接続ではNginxが圧倒的ですが、動的コンテンツ処理自体の速度はアプリケーションサーバーによって決まります。

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_filesrewrite(より直感的)
学習難易度 .htaccessは簡単、全体は複雑 設定構造がシンプルで一貫的
共有ホスティング適合性 非常に高い(.htaccessのおかげ) 低い(サーバー設定ファイルの修正が必要)
TIP:.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_ratelimitmod_evasive limit_reqlimit_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>
ハイブリッドの利点: Nginxが静的ファイル、SSL終端、キャッシュ、Rate Limitingを担当し、Apacheが動的コンテンツと.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(トレンド、性能、効率すべてで優勢)

重要なのは、一度選択した後も両方のウェブサーバーに対する基本的な理解を維持することです。実務ではハイブリッド構成、マイグレーション、レガシーシステムの保守などで両方を扱わなければならない状況が頻繁にあります。このガイドが皆さんのウェブサーバー選択と運用のお役に立てれば幸いです。