Apache ハンドシェイクがプリフォーク構成で遅くなるため、構成の調整が必要

Apache ハンドシェイクがプリフォーク構成で遅くなるため、構成の調整が必要

Ubuntu 14/Apache2.4.7 を実行している私のサーバーには、すべてのリクエストで HTTPS を使用するように強制する htaccess リダイレクトがあります。通常、応答は速いです。ただし、最近 SSL 設定を変更して、使用する暗号をより最新の設定に制限し、Heartbleed、Beast、その他のエクスプロイトを防ぎ、最新の暗号化方式が使用されるようにしました。

最近、私のマシンが時々遅くなるという苦情がいくつか寄せられています。これらの苦情は、これらの変更とは関係ないようです (下記参照)。これらの苦情は、ハンドシェイクまたは接続の確立に関連している可能性があることを示唆しています。

使用しているブラウザに応じて、さまざまなブラウザ ステータス メッセージが表示され、ページの読み込みが断続的に遅くなることがあります。これはすべて、安全な接続を確立するまで待機しているためです。

cURL を使用して 1000 回接続する PHP スクリプトを作成しました。昨夜遅くに実行しましたが、速度低下は問題ではないようでした。https と http の両方に接続して、上記のリダイレクトに従ってみました。すべてのリクエストは 3.5 秒以内に完了し、大部分 (96 ~ 98%) は 1.5 秒未満で完了しました。

今朝カリフォルニア時間の 10:30 に同じスクリプトを実行したところ、リクエストの約 10% に 1.5 秒以上かかり、多くはさらに長い時間がかかりました。最長時間は約 17 秒でした。

私の調査と直感によれば、httpsハンドシェイクはhttp接続よりも複雑ですが、この問題はおそらくApacheの設定を微調整することで解決できると思われます(例:最大リクエストワーカー) 設定。サーバーの負荷平均が 1.5 程度を超えることはほとんどなく、メモリも十分にあるようです。

ここでボトルネックを絞り込む方法と、それを修正するためにどのような手順を踏めばよいか、どなたかアドバイスをいただけませんか? ご協力いただければ幸いです。

編集: #apache IRCチャンネルを訪問してそこで尋ねたところ、フレンドリーな人々がこのサーバーがプリフォークモードであり、MinSpareServers、MaxSpareServers、StartServers、および MaxRequestWorkers はすべてデフォルトまたは調整されていますが、それでもかなり低いです。

彼らは、実稼働サーバーではプリフォーク モードを使用すべきではないと強く主張し、いくつかのリンクを紹介してくれました。

これらのパフォーマンスの問題の修正方法は、おそらくApacheをインストールしてイベントモードで実行することだと理解していますが、私のウェブサイトは複雑で、プロセスフォークなどを使用しています。当面の解決策として、最小スペアサーバー最大スペアサーバー開始サーバー最大リクエストワーカー

curl_getinfo編集 2: PHP の関数によって報告される、典型的な遅いリクエストの内訳:

elapsed: 17.6722049713
ssl_verify_result: 0
total_time: 17.671187
namelookup_time: 0.000051
connect_time: 0.065855
pretransfer_time: 16.787012
starttransfer_time: 17.340403
redirect_time: 0.261569

答え1

結局のところ、Ubuntuのapacheとphp7をインストールするためのパッケージはprefork以外は何も提供していないようです。本当に最悪だ。そういうわけで、私はpreforkで我慢しなければならなかったが、これは理想的な解決策ではないが、推奨構成働いているなら、それが唯一の選択肢です。

/etc/apache2/mods-available/mpm_prefork.conf ファイルを編集しました:

sudo nano /etc/apache2/mods-available/mpm_prefork.conf

MaxRequestWorkers 設定を 300 に増やしました。注記これを実行するには、ServerLimit 設定を 300 に追加する必要があります。そうしないと、MaxRequestWorkers は ServerLimit のデフォルト値である 256 に制限されます。

StartServers        5
MinSpareServers     5
MaxSpareServers     10
# changed in response to slow connect/handshaking time complaints
ServerLimit     300
# note this value is constrained by ServerLimit, which defaults to 256
MaxRequestWorkers   300
MaxConnectionsPerChild  0

これらの設定により、速度低下が緩和されたようです。忙しい時間帯に PHP テスト スクリプトを使用したところ、すべてのリクエストが 3.5 秒以内に完了し、大部分は 1.5 秒未満で完了しました。また、Apache ベンチと高い同時実行値でテストしたところ、サーバーがワーカーを生成して応答するのを確認できましたが、空き RAM はまだ十分にありました。

ab -n 1000 -c 100 "https://example.com/"

RAM を次のようにチェックしました:

free -h

今のところはうまくいっているようですが、Ubuntu インストーラーを使用して Apache で fastCGI を使用できないのは非常に残念です。

関連情報