Apache-2.2

如何防止 Apache 倒下?

  • January 28, 2016

我有一對伺服器託管一個流量適中的 Magento 電子商務網站(Google分析報告每天 60k 頁面瀏覽量,我認為伺服器本身報告了 80k 頁面瀏覽量)。數據庫伺服器執行平穩快速,除了偶爾的打嗝,但 apache 伺服器時常出現故障。

我已經設置了 magento 以使用推薦的 PHP 記憶體 (APC),並將其自己的記憶體文件保存在 1.5 gig tmpfs 中(這個 tmpfs 經常變得非常滿,並且我有一個腳本執行以在 tmpfs 是時清除記憶體文件80% 以上)。我提供來自亞馬遜雲端的大多數圖像。我最近將 nginx 設置為 apache 的反向代理(nginx 也提供靜態文件)。我已盡我所能配置 apache - keepalives 和 hostnamelookups 已關閉,prefork 配置如下:

<IfModule prefork.c>
   StartServers      50
   MinSpareServers   50
   MaxSpareServers  100
   ServerLimit  512
   MaxClients   256
   MaxRequestsPerChild 400
</IfModule>

我沒有關閉 .htaccess 文件,並且訪問日誌記錄已打開。我知道有些模組可以關閉。我不確定這三個更改中的任何一個會產生什麼影響(如果有的話)。

apache 伺服器是一個具有 6 gig RAM 的 VPS。截至撰寫本文時,伺服器正在報告load average: 17.77, 18.27, 49.76,但有大約 2 gig 的可用 RAM。當它變得非常糟糕時,負載會達到 120+ 並保持在那裡 - 重新啟動 apache 會使站點恢復正常,負載又會降低。

vmstat是(當伺服器報告上面的負載時),我認為,顯示 CPU 空閒值在 0 到 70 左右之間波動。iostat顯示 iowait 值介於 0 和 0.2% 之間。

我有點卡住了。我所知道的很少告訴我,問題是由於正在執行的程式碼和使用者數量的組合導致 CPU 過載。但我沒有足夠的經驗來確定這是問題所在。如果這是問題所在,我認為解決方案是改程序式碼或使用負載均衡器將託管在兩個 VPS 上的站點拆分。

所以,我想我的問題是:

  1. 我還能做些什麼來查找伺服器上的問題或瓶頸?
  2. 我可以對伺服器配置進行任何明顯的更改以改善這一點嗎?
  3. 當負載超過一定水平時,設置一個自動化系統重新啟動 apache 是個好主意嗎?
  4. 綜上所述,網站超出伺服器的可能性有多大?

編輯:

我發現了一些奇怪的東西 - /var/spool/mail/root 很大…… 38 gig。這聽起來……不健康。這可能是問題嗎?

如您所見,Magento 和 Zend Framework 佔用大量 CPU。避免 CPU 負載的最好方法是只渲染任何內容一次,直到它發生變化。目錄的大多數部分不會經常更改,並且通常只有頁面上的購物車塊或“最受歡迎的商品”塊是唯一的動態部分。

我建議在 Apache 前面放置一個Varnish記憶體。這為您提供了高性能的頁面記憶體,可以嚴重解除安裝您的 LAMP 堆棧。由於 Varnish,我們最近在一個非常公開的網站發布中倖存下來,速度和低 CPU 負載給我留下了深刻的印象。Varnish 是免費的,並且足夠靈活,可以記憶體整個頁面,或者只記憶體相對靜態的部分並動態包含購物車。

但是,Varnish 在預設的 Magento 安裝中不會記憶體太多,因為每個使用者都有很多動態內容、cookie 等。諸如“由 Varnish 提供支持的 PageCache ”之類的 Magento 模組會修改 Magento 以與 Varnish 一起工作。它還提供了一個與 Magento 設置匹配的 Varnish 配置文件。這兩者共同構成​​了非常有效的設置。它是一個商業模組,但比功能更強大的伺服器要便宜得多。

您解除安裝到 CDN 或 Nginx 的部分不是您真正的問題,儘管它確實有幫助。甚至 Apache 也可以處理相當多的靜態請求。您需要記憶體那些需要努力一次又一次生成的東西,即您的動態部分。

引用自:https://serverfault.com/questions/277230