Apache 握手在 prefork 設定上很慢,需要設定調整

Apache 握手在 prefork 設定上很慢,需要設定調整

我的伺服器運行 Ubuntu 14/Apache2.4.7,有一個 htaccess 重定向來強制所有請求使用 HTTPS。一般來說,它的反應很快。不過,我最近更改了 SSL 配置,將使用的密碼限制為更現代的設置,以防止 Heartbleed、Beast 和其他漏洞利用,並確保使用現代加密方法。

最近我收到了一些投訴——這些投訴似乎與這些變化無關(見下文)——我的機器有時會運行緩慢。這些投訴表明這可能與握手或建立聯繫有關:

我遇到了間歇性緩慢載入頁面的問題,其中包含各種瀏覽器狀態訊息,具體取決於所使用的瀏覽器;所有這些都是為了等待建立安全連線。

我寫了一個 PHP 腳本,使用 cURL 連接一千次。我昨晚運行得很晚,緩慢似乎不是問題。我嘗試連接到 https 和 http 並遵循上面的重定向。所有請求均在 3.5 秒或更短的時間內完成,其中絕大多數 (96-98%) 在 1.5 秒內完成。

我在今天早上加州時間 10:30 運行了相同的腳本,大約 10% 的請求花費的時間超過 1.5 秒,其中許多請求花費的時間更長。最長的時間約為17秒。

我的研究和直覺告訴我,雖然 https 握手比 http 連接更複雜,但這個問題可能可以透過調整我的 apache 配置來解決(例如,最大請求工作者) 設定.伺服器的平均負載幾乎從未超過 1.5 左右,而且看起來有足夠的可用記憶體。

誰能建議我如何縮小這裡的瓶頸以及我可以採取哪些步驟來解決它?任何幫助將非常感激。

編輯:我訪問了 #apache IRC 頻道並詢問了那裡,友好的人們讓我注意到這個伺服器位於預叉mode 和 MinSpareServers、MaxSpareServers、StartServers 和 MaxRequestWorkers 都是預設的或經過調整的,但仍然相當低。

他們非常堅定地認為生產伺服器不應該使用 prefork 模式,並向我推薦了一些連結:

據我了解,這些效能問題的糾正解決方案可能是安裝 apache 以事件模式運行,但我的網站很複雜,並且使用了一些進程分叉之類的東西。我希望作為權宜之計,有人可以提出調整建議最少備用伺服器數,最大備用伺服器數,啟動伺服器,最大請求工作者

編輯 2:典型慢速請求的細分,如curl_getinfoPHP 中的函數所報告:

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 bench 和高並發值進行了測試,我可以看到伺服器透過產生工作線程進行回應,但我仍然有足夠的可用 RAM:

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

我用以下命令檢查了記憶體:

free -h

這似乎目前有效,儘管非常令人失望的是我無法使用 ubuntu 安裝程式讓 apache 使用 fastCGI。

相關內容