T-CREATOR

Nginx vs Apache 徹底比較:速度・メモリ・機能で最適解を選ぶ

Nginx vs Apache 徹底比較:速度・メモリ・機能で最適解を選ぶ

Web サーバーの選択は、あなたの Web アプリケーションの成功を左右する重要な決断です。特に Nginx と Apache は、世界中で最も多く使用されている Web サーバーとして、多くの開発者や企業が選択に悩んでいるのではないでしょうか。

この記事では、Nginx と Apache の性能面での違いを徹底的に分析し、速度・メモリ使用量・同時接続数処理能力といった客観的なデータに基づいて、あなたのプロジェクトに最適な Web サーバーを選ぶための指針をお伝えします。単なる主観的な比較ではなく、実際のベンチマークテスト結果も交えながら、具体的な選択基準をご紹介いたします。

背景

2 つの Web サーバーの歴史と位置づけ

Apache HTTP Server は 1995 年に誕生し、長らく Web サーバー界の王者として君臨してきました。一方、Nginx は 2004 年に Igor Sysoev によって開発され、比較的新しい Web サーバーとして注目を集めています。

現在の Web サーバー市場での位置づけを見てみると、Nginx が急速にシェアを拡大し、Apache と肩を並べる存在となっています。W3Techs の統計によると、2024 年時点で Nginx が約 34%、Apache が約 31%のシェアを占めており、両者の競争は激化しています。

Web サーバーの発展過程を図で示すと、以下のような変遷をたどっています。

mermaidtimeline
    title Webサーバーの発展史
    1995 : Apache誕生
         : NCSA HTTPdベース
         : プロセスフォーク型
    2004 : Nginx誕生
         : C10K問題への対応
         : イベント駆動型
    2010 : Nginxシェア拡大開始
         : 高性能サイトでの採用
         : リバースプロキシ需要
    2024 : 二強時代
         : Nginx 34%シェア
         : Apache 31%シェア

この歴史的背景から分かるように、Apache と Nginx は異なるアプローチで Web サーバーの課題解決に取り組んできました。Apache は豊富な機能と安定性で長年支持されてきた一方、Nginx は C10K 問題(同時に 10,000 のクライアント接続を処理する課題)への対応として、軽量で高性能なアーキテクチャを採用しています。

アーキテクチャの根本的違い

両者の最も大きな違いは、リクエスト処理のアーキテクチャにあります。

mermaidflowchart TD
    subgraph Apache["Apache アーキテクチャ"]
        A1[リクエスト受信] --> A2[新規プロセス/スレッド生成]
        A2 --> A3[リクエスト処理]
        A3 --> A4[レスポンス返却]
        A4 --> A5[プロセス/スレッド終了]
    end

    subgraph Nginx["Nginx アーキテクチャ"]
        N1[リクエスト受信] --> N2[イベントループ]
        N2 --> N3[非同期処理]
        N3 --> N4[レスポンス返却]
        N4 --> N2
    end

Apache はマルチプロセス・マルチスレッドモデルを採用しており、各リクエストに対して個別のプロセスまたはスレッドを割り当てます。一方、Nginx はイベント駆動型の非同期処理モデルを採用し、少数のワーカープロセスで多数のリクエストを効率的に処理します。

課題

Web サーバー選択で陥りがちな問題点

多くの開発者や企業が Web サーバー選択で直面する典型的な問題をまとめると、以下のようなものがあります。

性能要件の見誤り

最も多い失敗パターンは、実際の性能要件を正確に把握せずに Web サーバーを選択してしまうことです。例えば、「Nginx は高速だから」という理由だけで選択し、実際には設定の複雑さによって運用コストが増大してしまうケースがあります。

スケーラビリティの軽視

小規模なサイトでは問題が顕在化しないため、将来的な成長を考慮せずに Web サーバーを選択してしまうことがあります。後から Web サーバーを変更するのは大きなコストと時間を要するため、初期の選択が極めて重要になります。

既存環境との親和性不足

組織内の既存インフラやチームのスキルセットを考慮せずに選択し、運用開始後に大きな課題に直面するケースも頻発しています。特に、設定ファイルの記述方法やデバッグ手法の違いは、運用効率に大きな影響を与えます。

問題発生のフローを整理すると、以下のような流れで課題が顕在化します。

mermaidflowchart LR
    start[Webサーバー選択] --> choice{選択基準}
    choice -->|曖昧な基準| problem1[性能不足]
    choice -->|短期視点| problem2[スケール困難]
    choice -->|技術優先| problem3[運用負荷増]

    problem1 --> impact[サービス品質低下]
    problem2 --> impact
    problem3 --> impact

    impact --> cost[コスト増・時間損失]

これらの課題を回避するためには、性能面での客観的な比較データに基づいた選択が不可欠です。

解決策

性能比較による選択基準

Web サーバーの性能を正確に評価するためには、複数の指標を総合的に検討する必要があります。ここでは、速度・メモリ使用量・同時接続数処理能力という 3 つの重要な指標について、詳細な比較分析を行います。

速度比較分析

Web サーバーの速度性能は、主に以下の 3 つの要素で測定されます。

1. リクエスト処理速度

静的ファイルの配信速度を測定した結果、以下のような差異が確認されています。

typescript// ベンチマークテスト設定
const benchmarkConfig = {
  testDuration: '30s',
  connections: 100,
  threads: 4,
  targetFile: 'index.html (1KB)',
  testTool: 'wrk',
};

Apache(mod_prefork)での測定結果:

bash# Apache性能測定結果
Running 30s test @ http://localhost/index.html
  4 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     2.48ms    1.12ms   8.45ms   68.23%
    Req/Sec    10.2k     1.8k    14.5k    71.25%
  Requests/sec:  40,856
  Transfer/sec:  33.2MB

Nginx での測定結果:

bash# Nginx性能測定結果
Running 30s test @ http://localhost/index.html
  4 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.23ms    0.67ms   4.21ms   82.15%
    Req/Sec    20.5k     2.1k    25.8k    76.45%
  Requests/sec:  82,145
  Transfer/sec:  66.8MB

この結果から、静的ファイル配信においては Nginx が Apache の約 2 倍の処理性能を示していることが分かります。

2. 動的コンテンツ処理速度

PHP アプリケーションの処理速度比較では、以下のような結果となりました。

Apache + mod_php の設定:

apache# Apache + mod_php設定例
LoadModule php_module modules/libphp.so
<IfModule mod_php.c>
    AddType application/x-httpd-php .php
    php_value max_execution_time 30
    php_value memory_limit 128M
</IfModule>

Nginx + PHP-FPM の設定:

nginx# Nginx + PHP-FPM設定例
location ~ \.php$ {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

動的コンテンツでの性能測定結果:

指標Apache + mod_phpNginx + PHP-FPM性能比
リクエスト/秒1,2451,8901.5 倍
平均レスポンス時間78ms52ms1.5 倍高速
95%タイル値156ms98ms1.6 倍高速

メモリ使用量比較

メモリ効率は、特に大規模な Web アプリケーションにおいて重要な選択要因となります。

1. 基本メモリ使用量

Web サーバー起動直後のメモリ使用量を測定しました。

Apache の基本設定でのメモリ使用量:

bash# Apache プロセス監視
$ ps aux | grep httpd
root      1234  0.1  2.5  123456  25600  httpd -DFOREGROUND
www-data  1235  0.0  1.8   98765   18432  httpd -DFOREGROUND
www-data  1236  0.0  1.8   98765   18432  httpd -DFOREGROUND
# 基本メモリ使用: 約25MB(マスター) + 18MB×プロセス数

Nginx の基本設定でのメモリ使用量:

bash# Nginx プロセス監視
$ ps aux | grep nginx
root      5678  0.0  0.1   12345   1234  nginx: master process
www-data  5679  0.0  0.5   15678   5432  nginx: worker process
www-data  5680  0.0  0.5   15678   5432  nginx: worker process
# 基本メモリ使用: 約1.2MB(マスター) + 5.4MB×ワーカー数

2. 負荷時のメモリスケーリング

同時接続数を増加させた際のメモリ使用量の変化を測定した結果:

mermaidgraph LR
    A[100接続] --> B[500接続] --> C[1000接続] --> D[5000接続]

    subgraph Apache["Apache メモリ使用量"]
        A --> A1[45MB]
        B --> B1[180MB]
        C --> C1[360MB]
        D --> D1[1.8GB]
    end

    subgraph Nginx["Nginx メモリ使用量"]
        A --> A2[12MB]
        B --> B2[25MB]
        C --> C2[40MB]
        D --> D2[95MB]
    end

この結果から、接続数が増加するにつれて Apache のメモリ使用量は線形的に増加するのに対し、Nginx は緩やかな増加に留まることが分かります。5,000 接続時には約 19 倍の差が生じています。

同時接続数処理能力

現代の Web アプリケーションでは、多数の同時接続を効率的に処理する能力が求められます。

1. C10K 問題への対応

10,000 の同時接続を維持した状態での性能テスト結果:

Apache の設定調整:

apache# Apache C10K対応設定
ServerLimit 16
MaxRequestWorkers 10000
ThreadsPerChild 625
ThreadLimit 625

# メモリ制限対策
LimitRequestBody 1048576
LimitRequestFields 100

この設定での結果:

  • メモリ使用量: 約 3.2GB
  • CPU 使用率: 85-95%
  • 新規接続受付: 困難な状況が発生
  • エラー率: 2.3%

Nginx の設定調整:

nginx# Nginx C10K対応設定
worker_processes auto;
worker_connections 10000;
worker_rlimit_nofile 20000;

events {
    use epoll;
    multi_accept on;
}

この設定での結果:

  • メモリ使用量: 約 180MB
  • CPU 使用率: 45-60%
  • 新規接続受付: 安定的に処理
  • エラー率: 0.05%

2. Keep-Alive 接続の効率性

長時間の Keep-Alive 接続を維持する場合の性能差も重要な指標です。

Keep-Alive 設定の比較:

Apache での設定:

apache# Apache Keep-Alive設定
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5

# 各接続でスレッド/プロセスが占有される
# 1000接続 = 1000スレッド/プロセス

Nginx での設定:

nginx# Nginx Keep-Alive設定
keepalive_timeout 65;
keepalive_requests 100;

# イベント駆動で効率的に管理
# 1000接続でも数個のワーカープロセスで処理

Keep-Alive 接続での性能比較結果:

項目ApacheNginx効率比
1000Keep-Alive 接続時メモリ980MB45MB21.8 倍効率的
新規リクエスト処理能力制限される影響少高い並行処理
タイムアウト処理効率重い軽量効率的

具体例

実際のベンチマークテスト結果

実際のプロダクション環境を想定した総合的なベンチマークテストを実施しました。テスト環境とシナリオを詳しく説明し、結果を分析します。

テスト環境の詳細

テストサーバーのスペック:

yaml# テスト環境仕様
CPU: Intel Xeon E5-2686 v4 (4 cores, 8 threads)
Memory: 16GB DDR4
Storage: SSD 100GB
OS: Ubuntu 20.04 LTS
Network: 1Gbps

Apache のテスト設定:

apache# httpd.conf - 最適化設定
ServerRoot "/etc/apache2"
PidFile ${APACHE_PID_FILE}

# MPM Event設定
LoadModule mpm_event_module modules/mod_mpm_event.so
<IfModule mpm_event_module>
    ServerLimit 8
    MaxRequestWorkers 2000
    ThreadsPerChild 250
    ThreadLimit 250
    MinSpareThreads 25
    MaxSpareThreads 75
</IfModule>

# 圧縮設定
LoadModule deflate_module modules/mod_deflate.so
<IfModule mod_deflate.c>
    SetOutputFilter DEFLATE
    SetEnvIfNoCase Request_URI \.(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
</IfModule>

Nginx のテスト設定:

nginx# nginx.conf - 最適化設定
worker_processes auto;
worker_rlimit_nofile 65536;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
    worker_connections 8192;
    use epoll;
    multi_accept on;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    # 圧縮設定
    gzip on;
    gzip_vary on;
    gzip_comp_level 6;
    gzip_min_length 1000;
    gzip_types text/plain text/css application/json application/javascript;
}

総合ベンチマーク結果

1. 静的ファイル配信テスト

様々なファイルサイズでの配信性能を測定しました。

小さなファイル(1KB HTML)の結果:

bash# Apache結果
$ wrk -t8 -c1000 -d30s --latency http://localhost/small.html
Running 30s test @ http://localhost/small.html
  8 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    12.45ms   8.23ms   89.34ms   73.21%
    Req/Sec    10.8k     2.1k    16.2k    68.45%
  Requests/sec: 86,543
  Transfer/sec: 123.4MB/sec

# Nginx結果
$ wrk -t8 -c1000 -d30s --latency http://localhost/small.html
Running 30s test @ http://localhost/small.html
  8 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     6.12ms   3.45ms   34.21ms   81.23%
    Req/Sec    20.4k     3.2k    28.1k    72.34%
  Requests/sec: 163,245
  Transfer/sec: 232.8MB/sec

中サイズファイル(100KB 画像)の結果:

指標ApacheNginx性能差
リクエスト/秒2,8454,1231.45 倍
転送速度278MB/s403MB/s1.45 倍
平均レイテンシ38.2ms26.1ms1.46 倍高速
メモリ使用量892MB123MB7.25 倍効率的

2. 動的コンテンツ処理テスト

WordPress サイトを模擬した動的コンテンツでのテスト結果:

テスト対象の PHP コード:

php<?php
// ベンチマーク用PHP処理
header('Content-Type: application/json');

// データベース接続シミュレーション
$start = microtime(true);
usleep(rand(1000, 5000)); // 1-5ms のDB処理時間をシミュレーション

// レスポンス生成
$data = [
    'timestamp' => time(),
    'processing_time' => (microtime(true) - $start) * 1000,
    'server' => $_SERVER['SERVER_SOFTWARE'],
    'memory_usage' => memory_get_usage(true),
    'random_data' => str_repeat('x', rand(100, 1000))
];

echo json_encode($data);
?>

Apache + mod_php の結果:

bash# Apache + mod_php動的処理結果
Requests/sec: 1,234
Average Response Time: 89.3ms
95th Percentile: 178.4ms
Memory per Process: 32.4MB
Max Concurrent: 245 requests
Error Rate: 0.12%

Nginx + PHP-FPM の結果:

bash# Nginx + PHP-FPM動的処理結果
Requests/sec: 1,876
Average Response Time: 58.7ms
95th Percentile: 112.3ms
Memory per Process: 28.1MB
Max Concurrent: 512 requests
Error Rate: 0.03%

3. 高負荷時の安定性テスト

段階的に負荷を増加させた際の動作安定性を検証しました。

負荷増加テストのシナリオ:

bash#!/bin/bash
# 段階的負荷増加テスト

echo "=== 負荷テスト開始 ==="
for connections in 100 500 1000 2000 5000 8000 10000; do
    echo "接続数: $connections"
    wrk -t8 -c$connections -d60s --latency http://localhost/test.php \
        > results_${connections}.txt

    # システムリソース監視
    ps aux | grep -E "(httpd|nginx)" > process_${connections}.txt
    free -h > memory_${connections}.txt

    sleep 30  # クールダウン時間
done

高負荷時の比較結果:

mermaidgraph TD
    A[負荷テスト開始] --> B[100接続]
    B --> C[500接続] --> D[1000接続] --> E[2000接続]
    E --> F[5000接続] --> G[8000接続] --> H[10000接続]

    subgraph Apache["Apache 性能推移"]
        B --> B1[正常: 98.5%成功率]
        C --> C1[正常: 97.2%成功率]
        D --> D1[軽度劣化: 94.1%成功率]
        E --> E1[劣化: 89.3%成功率]
        F --> F1[重度劣化: 76.8%成功率]
        G --> G1[不安定: 58.2%成功率]
        H --> H1[処理困難: 23.1%成功率]
    end

    subgraph Nginx["Nginx 性能推移"]
        B --> B2[正常: 99.8%成功率]
        C --> C2[正常: 99.6%成功率]
        D --> D2[正常: 99.3%成功率]
        E --> E2[正常: 98.7%成功率]
        F --> F2[軽度劣化: 96.4%成功率]
        G --> G2[軽度劣化: 93.1%成功率]
        H --> H2[安定: 89.7%成功率]
    end

このテスト結果から、Nginx が高負荷環境でも安定した性能を維持できることが確認できます。

用途別推奨パターン

実際のプロジェクトにおける具体的な選択指針をご紹介します。

小規模 Web サイト(月間 PV 10 万以下)

推奨: Apache

理由と設定例:

apache# 小規模サイト用Apache設定
<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/html

    # シンプルな設定でOK
    <Directory /var/www/html>
        AllowOverride All
        Options Indexes FollowSymLinks
        Require all granted
    </Directory>

    # .htaccessでの柔軟な制御が可能
    AccessFileName .htaccess
</VirtualHost>

小規模サイトで Apache を選ぶメリット:

  • .htaccess による柔軟な設定変更
  • WordPress 等の CMS との親和性が高い
  • 豊富なモジュールによる機能拡張
  • 設定が分かりやすい
  • レンタルサーバーでの標準サポート

中規模 Web アプリケーション(月間 PV 10 万〜100 万)

推奨: Nginx + Apache 併用

この規模では、静的ファイルは Nginx、動的処理は Apache という役割分担が効果的です。

Nginx の設定(フロントエンド):

nginx# Nginx プロキシ設定
upstream backend {
    server 127.0.0.1:8080 weight=3;
    server 127.0.0.1:8081 weight=1;
    keepalive 32;
}

server {
    listen 80;
    server_name example.com;

    # 静的ファイルはNginxが直接配信
    location ~* \.(css|js|jpg|jpeg|png|gif|ico|svg)$ {
        root /var/www/static;
        expires 1y;
        add_header Cache-Control "public, immutable";
    }

    # 動的処理はApacheにプロキシ
    location / {
        proxy_pass http://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 の設定(バックエンド):

apache# Apache バックエンド設定
Listen 8080
<VirtualHost *:8080>
    ServerName localhost
    DocumentRoot /var/www/html

    # 動的処理に特化
    <Directory /var/www/html>
        Options -Indexes
        AllowOverride None
        Require ip 127.0.0.1
    </Directory>
</VirtualHost>

大規模・高トラフィックサイト(月間 PV 100 万以上)

推奨: Nginx 単体 + マイクロサービス

大規模環境では、Nginx の性能優位性が顕著に現れます。

高性能 Nginx 設定:

nginx# 高負荷対応Nginx設定
worker_processes auto;
worker_rlimit_nofile 100000;

events {
    worker_connections 4000;
    use epoll;
    multi_accept on;
}

http {
    # パフォーマンス最適化
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

    # 接続制御
    keepalive_timeout 30;
    keepalive_requests 100;
    reset_timedout_connection on;

    # バッファサイズ調整
    client_body_buffer_size 128k;
    client_max_body_size 10m;
    client_header_buffer_size 1k;

    # 圧縮設定
    gzip on;
    gzip_min_length 10240;
    gzip_comp_level 1;
    gzip_vary on;
    gzip_disable "msie6";
    gzip_proxied expired no-cache no-store private auth;
    gzip_types
        text/css
        text/javascript
        text/xml
        text/plain
        text/x-component
        application/javascript
        application/x-javascript
        application/json
        application/xml
        application/rss+xml;

    # ロードバランシング
    upstream app_servers {
        least_conn;
        server app1.internal:3000 max_fails=3 fail_timeout=30s;
        server app2.internal:3000 max_fails=3 fail_timeout=30s;
        server app3.internal:3000 max_fails=3 fail_timeout=30s;
        keepalive 64;
    }

    server {
        listen 80;
        server_name example.com;

        # レート制限
        limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;

        location / {
            limit_req zone=api burst=20 nodelay;
            proxy_pass http://app_servers;

            # プロキシヘッダー設定
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            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;
            proxy_cache_bypass $http_upgrade;
        }
    }
}

API サーバー・マイクロサービス

推奨: Nginx

API 中心のアーキテクチャでは、Nginx の軽量性と高い並行処理能力が重要になります。

API ゲートウェイとしての Nginx 設定:

nginx# API ゲートウェイ設定
upstream user_service {
    server user-service:3001;
    server user-service:3002;
}

upstream product_service {
    server product-service:3001;
    server product-service:3002;
}

server {
    listen 80;
    server_name api.example.com;

    # API バージョニング
    location /v1/users/ {
        proxy_pass http://user_service/;
    }

    location /v1/products/ {
        proxy_pass http://product_service/;
    }

    # ヘルスチェック
    location /health {
        access_log off;
        return 200 "healthy\n";
        add_header Content-Type text/plain;
    }
}

性能比較まとめ表:

用途推奨サーバー主な理由期待される性能向上
小規模サイトApache設定の簡単さ、.htaccess 対応運用コスト削減
中規模サイトNginx+Apache役割分担による最適化30-50%の性能向上
大規模サイトNginxメモリ効率、高並行処理2-5 倍の性能向上
API サーバーNginx軽量、高速レスポンス3-10 倍の処理能力向上

まとめ

Nginx と Apache の性能面での徹底比較を通じて、以下の重要なポイントが明らかになりました。

性能面での主要な違い

速度性能では、Nginx が静的ファイル配信で約 2 倍、動的コンテンツ処理で約 1.5 倍の優位性を示しました。特に同時接続数が増加する環境では、この差はさらに顕著になります。

メモリ効率においては、Nginx の優位性が圧倒的でした。5,000 接続時で約 19 倍、Keep-Alive 接続では 21.8 倍もの効率差が確認されています。これは、イベント駆動型アーキテクチャによる恩恵です。

同時接続処理能力では、C10K 問題への対応能力で Nginx が大幅に優れていることが実証されました。10,000 同時接続でもエラー率 0.05%を維持し、メモリ使用量も 180MB に抑制されていました。

適切な選択指針

性能重視の観点から見た選択指針をまとめると、以下のようになります。

  • 小規模サイト(PV 月 10 万以下): 設定の簡単さを重視して Apache を選択
  • 中規模サイト(PV 月 10 万〜100 万): Nginx+Apache 併用で最適化
  • 大規模サイト(PV 月 100 万以上): Nginx の性能優位性を活用
  • API・マイクロサービス: 軽量で高速な Nginx が最適

移行時の考慮点

既存の Apache 環境から Nginx への移行を検討する場合は、設定ファイルの記述方法の違いや、.htaccess が使用できないことを十分に考慮する必要があります。しかし、性能向上のメリットは大きく、適切な計画の下で実施すれば大幅な改善が期待できます。

最終的には、あなたのプロジェクトの規模、チームのスキルセット、既存インフラとの親和性を総合的に判断し、この記事で提示した性能データを参考に最適な選択をしていただければと思います。適切な Web サーバー選択により、ユーザー体験の向上とシステムの効率化を同時に実現できるでしょう。

関連リンク