やまどり
WordPress最速Webサーバー決定戦

WordPress最速Webサーバー決定戦

本記事では、Apache・nginx+PHP-FPM・NGINX Unitといった主要なWebサーバーを実際の負荷テストを通じて性能を比較しました。

はじめに

NGINX Unitはサポートが終了してしまいました。

WordPressを動かすWebサーバーとしては、従来からApacheが広く使われており、近年ではnginx + PHP-FPMの構成が主流となっています。また、アプリケーションサーバーとして設計されたNGINX Unitも登場し、用途や環境に応じてさまざまな選択肢から最適な構成を選べるようになりました。

本記事では、WordPressにおけるこれらの構成の性能について検証します。

環境

WordPressはWindows11のPC上でVirtualBoxを使用して構築しました。

性能検証にはk6を使用しました。

キャッシュの設定や最適化などはせずインストールした時点での設定のままです。

  • WordPress:6.9.1
  • OS:Ubuntu 24.04 Server
  • PHP:8.3.6
  • CPU:4コア
  • メモリ:4GB
  • DB:MariaDB 15.1
  • WPテーマ:Twenty Twenty-Four

  • Apache:2.4.58
  • nginx:1.24.0
  • PHP-FPM:8.3.6
  • NGINX Unit:1.34.2

検証

ベンチマーク1

仮想ユーザー数を段階的に増やし、最大1,500ユーザーまで負荷を上昇させるテストです。

script.js
import http from "k6/http";
import { check, sleep } from "k6";

export const options = {
  stages: [
    { duration: "1m", target: 250 },
    { duration: "1m", target: 500 },
    { duration: "1m", target: 750 },
    { duration: "1m", target: 1000 },
    { duration: "1m", target: 1250 },
    { duration: "1m", target: 1500 },
    { duration: "30s", target: 0 },
  ],
};

export default function () {
  const res = http.get("http://<IPアドレス>/wordpress/");

  check(res, {
    "is status 200": (r) => r.status === 200,
  });
  sleep(0.5);
}

ベンチマーク1結果

Apache

Apacheは総リクエスト数でトップの数値を記録し、平均レスポンスタイムも3秒と非常に優秀な瞬発力を見せました。しかし、仮想ユーザー(VU)が400を超えたあたりからリクエストの失敗が急増し、最終的なリクエスト失敗率は39.3%に達しました。アクセス数が一定のラインに収まっている間は極めて快適に動作する一方で、同時接続数の限界を超えると急激に処理を破棄し始めるという、限界点がはっきりとした特性が確認できました。

nginx + PHP-FPM

nginx + PHP-FPM構成は、VUが1,500に達するまでリクエストの失敗が一切発生せず、最終的な失敗率もわずか0.1%と極めて優秀な結果でした。一方で、ユーザー数の増加に比例してレスポンスタイムが徐々に悪化し、平均で19秒待たされる結果となりました。処理速度自体はApacheに劣りますが、高負荷時でもリクエストを取りこぼすことなくキューに溜め込み、確実に処理し続けようとする粘り強さが確認できました。

NGINX Unit

NGINX Unitは公式が公開するセットアップ方法で最初に構築を行いました。

NGINX Unitの初期状態は、処理速度、レスポンスタイム、リクエスト失敗率の全項目において、他を大きく下回る厳しい結果となりました。デフォルトの設定のままだと、プロセスが一つしかないため、まったくマシンの性能を使えていない状態でした。さすがにかわいそうなので、設定を少しいじってプロセスが最大20個になるようにしました。

設定を調整した「NGINX Unit (調整後)」では、処理速度が46.24 req/sまで向上し、失敗率も15.6%まで改善する変化が見られました。チューニング次第でパフォーマンスを大きく引き出せるポテンシャルは確認できましたが、それは他も同じでnginx + PHP-FPMの安定性やApacheの速度には届いておらず、仮想ユーザーが900を超えた付近からリクエストの失敗が目立つ結果となりました。

Apache

nginx+PHP-FPM

NGINX Unit

NGINX Unit(調整後)

総リクエスト数

25.2k

15.7k

10.7k

18.9k

平均処理速度(req/s)

61.1

37.97

25.57

46.24

平均レスポンスタイム

3s

19s

27s

15s

リクエスト失敗率

39.3%

0.1%

79.8%

15.6%

ベンチマーク2

500人の仮想ユーザーが同時にアクセスし、合計10,000回のリクエストを実行する最大負荷テスト。10分でタイムアウト。

script.js
import http from "k6/http";
import { check } from "k6";

export const options = {
  vus: 500,
  iterations: 10000,
};

export default function () {
  const res = http.get("http://<IPアドレス>/wordpress/");

  check(res, {
    "status is 200": (r) => r.status === 200,
  });
}

ベンチマーク2結果

Apache

実行時間は3分31.6秒と最も短く、平均レスポンスタイムも6秒と高速でした。しかし、前回のテストで「VUが400を超えたあたりから失敗する」という傾向が示された通り、初めから500VUをかけた本テストではリクエスト失敗率が21.6%に達しました。「処理が早い」という結果の裏には、処理しきれないリクエストを即座にエラーとして弾いている側面も含まれており、アクセス集中時の確実な処理という点では課題が残りました。

nginx + PHP-FPM

実行時間やレスポンスタイムはApacheに及びませんでしたが、リクエスト失敗率0.0%を記録しました。500人からの同時アクセスという高い負荷が常にかかり続ける状態でも、システムが破綻することなく、10,000回すべてのリクエストを確実に処理しきりました。

NGINX Unit

初期設定のNGINX Unitは、10分間のタイムアウト条件に引っかかり、平均レスポンスタイムも45秒と極端に遅延するなど、全く負荷に耐えられない結果となりました。

しかし、設定をチューニングした「NGINX Unit (調整後)」では劇的な改善が見られました。失敗率0.0%で全リクエストを処理し切っただけでなく、実行時間やレスポンスタイムにおいて、堅牢な nginx + PHP-FPM を僅かに上回るパフォーマンスを叩き出しました。500VU程度までの負荷であれば、適切な調整を施すことで、安定性と処理速度を高い次元で両立できる強力な構成になりそうです。

Apache

nginx+PHP-FPM

NGINX Unit

NGINX Unit(調整後)

実行時間

03m31.6s

04m22.2s

タイムアウト

04m05.8

平均処理速度(req/s)

47.25

38.13

10.48

40.69

平均レスポンスタイム

6s

12s

45s

11s

リクエスト失敗率

21.6%

0.0%

0.0%

0.0%

おわりに

いかがだったでしょうか?今回は定番の Apache、nginx + PHP-FPM、そして注目の NGINX Unit に対して、徐々に負荷をかけるテストと、500人が一斉にアクセスするの2つの過酷な検証を行いました。

「とりあえずこれを選べば正解」というのはありませんし、チューニングや構成次第でまったく異なる結果になるとは思います。

ただ、個人的にNGINX UnitのセットアップはApacheと同じくらいに単純なため今後もし、WordPressを構築することがあれば導入を検討したいと思います。構築方法についてはこちらで解説しています。