PHP標準のアプリケーションサーバー「PHP-FPM」から「NGINX Unit」に乗り換えるだけで約8倍も応答速度が改善したというテスト結果
NGINX Unitはさまざまな言語で動作可能なオープンソースの動的アプリケーションサーバーです。PHPのアプリケーションを動作させる際にNGINX Unitを使うと、PHP-FPMを使う場合に比べて約8倍も応答速度が改善するというテスト結果をエンジニアのstraykerwlさんが報告しています。
Comparing PHP-FPM, NGINX Unit, and Laravel Octane / Habr
https://habr.com/en/articles/646397/
サービスメッシュ基盤構築~NGINX Unit - NGINX
https://www.nginx.co.jp/products/nginx-unit/
GitHub - nginx/unit: NGINX Unit
https://github.com/nginx/unit
NGINX UnitではPHPのほか、Ruby、Go、Python、Java、Node.js、Perlなどさまざまな言語で構築されたアプリケーションを実行することが可能です。RESTful JSON APIを使ってコントロールでき、サービスを継続したまま動的にアプリを更新できるという特徴も併せ持っています。
NGINX Unitは分散アプリケーション向けに設計されており、さまざまなアプリをつないでサービスメッシュを構築するという使い方が想定されていますが、straykerwlさんはNGINX Unit上でPHPのフレームワークである「Laravel」と「Lumen」を動作させることのみを検証しました。
比較対象は一般的に用いられているPHP標準アプリケーションサーバーの「PHP-FPM」およびLaravel特化型サーバー「Octane」の2つ。一般的な負荷をかける「標準テスト」とアクセス量の限界を試す高負荷の「ストレステスト」の2種類のテストを行いました。
標準テストの結果は下の表の通り。応答時間の各パーセンタイル値がミリ秒単位で記載されています。99パーセンタイルの黄色背景部分の数値を比較すると、PHP-FPM+Laravelの組み合わせでは応答に60ミリ秒かかっているのに対し、NGINX Unit+Laravelでは7.6ミリ秒と約8倍も高速化されていることが分かります。なお、Octaneは特化しているだけあり、99パーセンタイル点でも処理に1.23ミリ秒しかかかっていません。右端の「HTTP OK %」は「何%のリクエストが正常に処理されたか」を意味しており、標準テストでは全ての組み合わせで100%アクセスを処理することができたことが分かります。
99% | 98% | 95% | 90% | 85% | 80% | 75% | 50% | HTTP OK % | |
---|---|---|---|---|---|---|---|---|---|
nginx + php-fpm + laravel | 60 | 59 | 56 | 52 | 48 | 46 | 45 | 44 | 100 |
nginx + php-fpm + lumen | 18 | 18 | 17 | 16 | 16 | 15 | 15 | 14 | 100 |
nginx-unit + laravel | 7.6 | 7 | 6.5 | 5.8 | 5.3 | 5.2 | 5.2 | 4.059 | 100 |
nginx-unit + lumen | 1.930 | 1.870 | 1.640 | 1.520 | 1.460 | 1.410 | 1.320 | 1.070 | 100 |
octane (swoole) + laravel | 1.230 | 1.200 | 1.160 | 1.110 | 1.050 | 1.010 | 0.980 | 0.800 | 100 |
高負荷環境をシミュレートするストレステストの結果は下の表の通り。赤色背景部分に記載されている通り、PHP-FPMやOctaneは負荷に耐えられずリクエストがタイムアウトしてしまいました。毎秒120リクエストを超えたあたりでPHP-FPM+Laravelは処理できなくなり、PHP-FPM+Lumenの組み合わせも毎秒400リクエストまでしか処理できなかったとのこと。Octaneも秒間600リクエストで脱落しましたが、NGINX Unitは毎秒1000リクエストでも安定して処理できています。
99% | 98% | 95% | 90% | 85% | 80% | 75% | 50% | HTTP OK % | |
---|---|---|---|---|---|---|---|---|---|
* nginx + PHP-FPM + Laravel ~120 rps | 62 | 59 | 55 | 52 | 49 | 47 | 45 | 43 | - |
* nginx + PHP-FPM + Lumen ~400 rps | 34 | 25 | 19 | 17 | 16 | 16 | 15 | 14 | - |
NGINX Unit + Laravel | 6.6 | 6 | 5.5 | 5.2 | 4.96 | 4.7 | 4.5 | 3.79 | 100 |
NGINX Unit + Lumen | 1.77 | 1.56 | 1.4 | 1.25 | 1.17 | 1.13 | 1.08 | 0.91 | 100 |
Octane (Swoole) + Laravel | 18 | 8.3 | 4.85 | 3.88 | 3.45 | 3.1 | 2.85 | 1.87 | 82.807 |
* Octane (Swoole) + Laravel ~600 rps | 3.23 | 3.01 | 2.85 | 2.55 | 2.2 | 2.029 | 1.92 | 0.78 | - |
そのほか、別のエンジニアがWordPressをPHP-FPMとNGINX Unit、Apacheの3種類で動作させて比較した結果でも下図の通りNGINX Unitが安定性・速度ともに優れているという結論になっていました。
・関連記事
スラッシュの有無だけでセキュリティにとんでもない大穴が空いてしまうNginxのありがちな設定ミスについて実例を踏まえて専門家が解説 - GIGAZINE
ハッカーがPHPの開発者になりすましてソースコードにバックドアを仕込んでいたことが判明 - GIGAZINE
Netflixはどのようにして800Gb/sものデータ転送を実現しようとしているのか? - GIGAZINE
ウェブアプリに対する典型的な攻撃手法とその対策まとめ - GIGAZINE
NGINXがKubernetes向けサービスメッシュ「NGINX Service Mesh」を発表 - GIGAZINE
・関連コンテンツ