2019/12/01 に行われた PHPカンファレンス2019の Track 5 で発表した「Apache から LiteSpeed に乗り換えてみませんか?」の登壇資料です。
ApacheからLiteSpeedに乗り換えてみませんか?(デモ内容補足版)2019-12-01 PHP Conference Japan 2019GMO Pepabo, Inc @kunit
View Slide
自己紹介✔高橋邦彦✔@kunit✔GMOペパボ株式会社✔ホスティング事業部所属✔2018年11月に東京から福岡に移住
「みんなのPHP」でるぞー✔ 技術評論社さんからでます✔ 電子版は本日発売✔ 物理本は12/6発売✔ 執筆者、総勢18名!!✔ 私は1章担当しました✔ みなさん、買ってね!
GMOペパボ株式会社✔ 一緒に働く仲間を募集中です!✔ ご興味のある方はぜひお声がけください
GMOペパボ株式会社✔ロリポップ!✔ムームードメイン✔カラーミーショップ✔SUZURI✔minne✔その他にも多数のサービスをしてます!
ロリポップ! 9月に新プラン追加✔ハイスピードプラン✔LiteSpeed を採用しています
こんな方はいらっしゃいませんか?✔ずっとApacheを使っていて、nginx +php-fpm に移行したいなと思ったが✔長年熟成に熟成を重ねてきた数百行の秘伝の mod_rewrite ルールが存在していて✔泣く泣くApacheを使い続けているという✔あなたに特に本日の発表をおすすめします!
LiteSpeed とは✔LiteSpeed Technologiesが開発している Webサーバー✔第4のWebサーバーと言われている✔Apache✔nginx✔第3は?
LiteSpeed とは✔有償版とオープンソース版がある✔有償版はホスティング事業者が嬉しい機能が満載✔オープンソース版は有償版に比べて一部機能が使えない✔ロリポップ!ハイスピードプランでは有償版を利用しています
LiteSpeed の特徴✔Apache 互換✔イベントドリブンアーキテクチャ✔HTTP/2、QUIC、HTTP/3✔DoS/DDoS 対策✔WordPress に対するキャッシュ、攻撃対策
Apache 互換!✔有償版はApacheの httpd.confがそのままつかえる✔有償版は .htaccess がそのままつかえる✔既存のApacheから5分で乗り換えれると公式は言っている✔オープンソース版は mod_rewriteルールを解釈してくれる
LiteSpeed 上での PHP✔ LiteSpeed SAPI というのが準備されている✔ PHP のコアにきちんとあるんです
Apache + mod_php✔Apache 本体のプロセスにPHPインタプリタがそのままロードされる✔静的コンテンツとPHP処理プロセスは同じもので処理される✔静的コンテンツを大量にさばきたくても、プロセスを増やすとPHP側も増えてしまい、DB接続数やメモリ使用量等で問題になる✔Apache は prefork で動作(C10K問題)✔PHPのバージョンは全プロセス同じものとなる✔php.ini は全プロセスで同じものとなる
nginx + php-fpm✔nginx とは別に php-fpm を起動しておいて、リクエストを転送する✔それぞれ別管理、別起動✔静的コンテンツは nginx、PHPは php-fpmで処理できるので効率的✔イベントドリブン(C10K問題に強い)✔バーチャルホストごとにPHPのバージョンを変更可能✔バーチャルホストごとに php.ini 指定可能✔.htaccess は使えない
LiteSpeed✔LiteSpeed WebサーバーにPHPを利用するアクセスが来た際に、PHPの処理プロセスを起動させることが可能✔もちろん、予め処理プロセスを起動しておくことも可能だが、これもLiteSpeed Webサーバーが管理してくれる✔イベントドリブン(C10K問題に強い)✔一定時間処理がないPHP処理プロセスは自動的に落としてくれる✔LiteSpeed Webサーバー本体で静的コンテンツを、PHPは別プロセスで処理するので効率的
LiteSpeed✔有償版は httpd.conf/.htaccess 使用可✔オープンソース版は .htaccess から rewriteルールの読み込みが可能✔バーチャルホストごとに細かい制御が可能(秒間リクエスト数や帯域幅等)✔バーチャルホストごとに php.ini 指定可能✔外部アプリケーションという考え方があり、PHPの処理はこれを利用する✔外部アプリケーションをサーバー全体もしくはバーチャルホストごとに設定可能
LiteSpeed 外部アプリケーション✔外部アプリケーションごとにPHPのバージョン指定できる✔外部アプリケーションごとに実行ユーザを変更できる(suEXEC)✔メモリ使用量、プロセス数を制御可能✔外部アプリケーションは拡張子に対して指定する✔つまり、同じバーチャルホストでも、.php73 と .php72 でバージョンを変えるというエグいこともできる
LiteSpeed✔有償版には WordPress の wp-login.php や xmlrpc.php に対する Brute Force AttackProtection という機能がある✔一定時間内に決まった回数アクセスがあるとそのIPを弾くとかが可能✔LiteSpeed Cache Plugin というWordPress Plugin をオフィシャルで提供している
LiteSpeed PHPのインストール✔LiteSpeed 公式リポジトリからインストール可能✔PHP 5.2 から 7.3 まで準備されている✔2019/11/30 現在は 7.4 は準備されてなかった(残念)✔yum install lsphp73 lsphp73-devel ...✔apt-get install lsphp73 lsphp73-devel ...
説明だけだとあれなので✔実際に動いているところを見ていただきましょう
ここから、補足ページです✔ここ以降は当日行ったデモの内容のダイジェストを補足します✔当日、デモ内容が文字が小さくて見れなかった方、本当にすみませんでした✔アーカイブ動画もチェックしましたが、見づらい部分もあったのでそれも含めて補足します✔当日時間がなくて、本来やりたかった内容も追加しています
当日デモの環境✔Vagrant + VirtualBox で作った CentOS7 環境✔Apache 2.4.6(CentOS)✔nginx 1.17.6✔Apacheおよびnginx向けに、remi から php 7.3 をインストール
当日デモの環境✔OpenLiteSpeed 1.6.4✔LiteSpeed の公式リポジトリから 5.6/7.0/7.1/7.2/7.3のPHPをインストール
OpenLiteSpeed の管理ツール✔Webインターフェースの管理ツールが付属する✔通常は 7080 ポートでアクセスできる(もちろん変更可能)✔OpenLiteSpeed では英語のみではなく、日本語/中国語での表示が可能✔ちなみに、有償版の管理ツールは英語のみ
OpenLiteSpeed の管理ツール✔ ログイン画面
OpenLiteSpeed の管理ツール✔ ダッシュボード(英語表示)
OpenLiteSpeed の管理ツール✔ ダッシュボード(日本語表示)
OpenLiteSpeed の管理ツール✔ バーチャルホスト一覧
OpenLiteSpeed の管理ツール✔ バーチャルホスト詳細
OpenLiteSpeed の管理ツール✔ 外部アプリケーション(バーチャルホスト単位)
OpenLiteSpeed の管理ツール✔ 外部アプリケーションと拡張子の関連付け
OpenLiteSpeed の管理ツール✔ 公開バーチャルホストの一覧(リスナー設定)
OpenLiteSpeed の管理ツール✔ バーチャルホストとドメインとの関連付け(リスナー設定)
OpenLiteSpeed のPHP 7.3✔ OpenLiteSpeed + PHP7.3 でとった phpinfo✔ Server API は 「LiteSpeed V 7.6」
OpenLiteSpeed のPHP 7.2✔ OpenLiteSpeed + PHP7.2 でとった phpinfo✔ Server API は 「LiteSpeed V 7.6」
OpenLiteSpeed のPHP 7.1✔ OpenLiteSpeed + PHP7.1 でとった phpinfo✔ Server API は 「LiteSpeed V 7.6」
OpenLiteSpeed のPHP 7.0✔ OpenLiteSpeed + PHP7.0 でとった phpinfo✔ Server API は 「LiteSpeed V 7.6」
OpenLiteSpeed のPHP 5.6✔ OpenLiteSpeed + PHP5.6 でとった phpinfo✔ Server API は 「LiteSpeed V 7.6」
OpenLiteSpeed のプロセス✔ OpenLiteSpeed を起動した直後のプロセス状態✔ PHPにまだアクセスしてないので PHP のプロセスはいない
OpenLiteSpeed のプロセス✔ PHP 7.3 の phpinfo にアクセスした状態✔ OpenLiteSpeed の lscgid からPHPプロセス lsphp が生成されている✔ WebサーバーのプロセスとPHPのプロセスが親子関係になるのがなかなかおもしろい
OpenLiteSpeed のプロセス✔ PHP 7.3/7.2/7.1 のバーチャルホストの phpinfo にアクセスした状態✔ OpenLiteSpeed の lscgid からPHPプロセス lsphp が複数生成されている✔ lscgid の直接の子供の lsphp が外部アプリケーションごとに生成されるもので、それぞれの外部アプリケーション毎のプロセスは今は1つだけ子供のプロセスをもっているが、アクセスが増えると子供のプロセスを増やしていく✔ つまり実際のリクエストを処理しているのは一番子供の lsphp✔ 各バーチャルホスト毎の外部アプリケーションが別々のアカウント(phpcon73/phpcon72/php71)で処理されていることもわかる
OpenLiteSpeed のプロセス✔ OpenLiteSpeedの管理ツールをアクセスした後、PHP 7.3/7.2/7.1 のバーチャルホストのphpinfo にアクセスした状態✔ OpenLiteSpeed の lscgid から各バーチャルホスト毎の外部アプリケーション用の lsphp だけではなくて、管理ツール用の admin_php も生成されている
Apache httpd のPHP 7.3✔ Apache httpd + PHP7.3 でとった phpinfo✔ Server API は 「Apache 2.0 Handler」
Apache httpd のプロセス✔ Apache httpd を起動し、PHP 7.3 のphpinfo にアクセスした状態✔ httpd のプロセスが複数起動し、どのプロセスでも静的コンテンツおよびPHPを処理する
nginx + php-fpm のPHP 7.3✔ nginx + php-fpm(7.3) でとった phpinfo✔ Server API は 「FPM/FastCGI」
nginx + php-fpm のプロセス✔ nginx と php-fpm をそれぞれ起動し、PHP7.3 の phpinfo にアクセスした状態✔ nginx のプロセスと php-fpm のプロセスは完全に独立して存在し、静的コンテンツはnginx、PHPの処理は php-fpm 側に転送されて処理が行われる
当日行ったベンチマークの注意事項✔ ここまで説明したような Apache + mod_php、nginx + php-fpm、OpenLiteSpeed のそれぞれの 7.3 環境に対して、WordPress 5.3 をインストールして、インストール直後のトップページに対して、ベンチマークをとってみた✔ ベンチマークで使ったのは、当日デモしていたノートPCであり、3つのWebサーバーに対して特にチューニングは行っていないので、あくまでも参考値✔ 環境がもっとリッチなもので、それぞれに対して、もっとチューニングすれば差異がでてくるものだと思ってください。
当日行ったベンチマークの注意事項✔ WordPress はこんなページ
当日行ったベンチマーク✔ ベンチマークには ab を利用✔ ab -n 1000 -c 100 [URL] という形で実施✔ https ではなく http アクセスでのテスト(httpsにしておいて h2load で HTTP/2でのテストをするのも面白いかもしれないが準備が間に合わなかった...)✔ 当日会場で行った結果は、Apache +mod_php/nginx +php-fpm/OpenLiteSpeed ともに 45reqs/sec 前後の値で速さは変わらなかった
当日行えなかった比較✔ 当日は ab -n 1500 -c 1000 [URL] というものを OpenLiteSpeed でのみ行った✔ OpenLiteSpeed はチューニングなしの状態で1000並列リクエストを reqs/sec を落とすことなく完了できる✔ 同一環境で Apache+mod_php と nginx+php-fpm は素の状態だと途中で落ちる(ファイルのオープン数の上限に引っかかる等の理由で)✔ もちろん、Apacheおよびnginx環境でもパラメーターチューニングを行うことにより処理できるようになるが、LiteSpeedが高負荷状態にもともと強いものとして設計されているということを説明したかったのでこの説明を当日入れた
ここまでが当日の補足✔ あらためて、当日プロジェクターで写したプロセスリスト等の結果が見づらかったことをお詫びします✔ アーカイブ動画ではかろうじて見れるようですので、この資料とともに見ていただけると幸いです
LiteSpeed 使っていきましょう!✔日本ではあまりにも知名度が低いのがあれですが、もっと使われていてもおかしくないと思うので、ぜひ試してみてください!
?質問あるかたどうぞ