前段時間把阿湯博客從虛擬主機遷移到了服務器,一同遷移的還有其他兩個網站,開始幾天沒啥問題,但是過了幾天,網站就會出現打不開的情況。
一開始沒在意,重啟了Apache服務就正常了,但是接下來一段時間頻繁出現無法打開的情況,有時候兩三天,有時候四五天。
出現故障的時候監聽Apache錯誤日志,發現大量的child pid xxx exit signal Segmentation fault (11)信息。

但是此時測試80和443端口正常,訪問PHP探針頁面也可以正常訪問,但是就是頁面無法訪問,一些css、js文件訪問報404錯誤。
網上查了查,有人說child pid xxx exit signal Segmentation fault (11)是因為進程內存泄露導致的,需要調整Apache參數,MaxConnectionsPerChild不能設置為0 。
MaxConnectionsPerChild : 進程生命周期內,處理的最大請求數目。達到該數目后,進程將死掉。如果設置為0,表示沒有限制。該參數的意義在于,避免了可能存在的內存泄露帶來的系統問題。
但是我的Apache此參數并不是0,我也嘗試改小一些,測試了兩天還是會出現無法訪問的情況。
然后網上又找到一些可能會導致此問題的原因:
1. 使用mmcache模塊在linux x86-64上有問題
2. 由于php編譯安裝過程有問題,或者apache+php安裝完成后,PHP又重新編譯安裝過,同時apache也重新編譯就會產生這種現象.建議保留httpd.conf和相關配置文件后,重新安裝一遍apache+PHP,注意先后順序,如果還是會有這個提示,請更換php版本重裝。
3. php的模塊zend_extension和extension沖突。
4. 由于使用了APC造成的,這是這類op-code緩存優化軟件共同的問題.建議用最新版本試試(http://pecl.php.net/package/APC).一旦出現,只能重起apache。
5. /tmp目錄文件太多,刪除后正常。
6. 配置模式為worker, 改為prefork。
7. ZendOptimizer-3.3.0 與 jdk1.7.0沖突。
8. web訪問的某些特殊文件造成的,檢查access_log可以看到,刪除文件。
9. PHP啟用了eaccelerator模塊導致。
10. apahce啟用了cache導致。
11. 配置文件模塊沖突之類的原因。
通過一條條排查,并沒有符合條件的原因。
由于故障屬于偶發,排查找原因非常困難,而且此類故障原因太多。
一開始想著通過站點監控接口回調,觸發腳本重啟Apache服務,但是發現每次故障監控返回的都是狀態200,沒有觸發監控。
于是就想著換nginx試試,畢竟好多年沒用過Apache,對一些Apache報錯和問題有些陌生了。
其實阿湯博客遷移到服務器的時候,就打算用nginx的,但是想著要去重寫幾個網站偽靜態太麻煩就放棄了,但是沒想到省了一時的麻煩,換來后面無休止的折騰。
然后花了半天時間把偽靜態規則換成nginx的,然后就是替換ssl證書,本地測試成功以后,線上進行替換操作。
Apache偽靜態轉nginx偽靜態,網上有很多工具,但是有些轉換工具還是有問題的,還是需要本地多測試,不要盲目在線上操作。
WordPress的nginx偽靜態規則還是比較簡單的,網上有兩種方案,這里貼一下我使用的WordPress的nginx偽靜態規則:
if ($http_host !~ "^www.maowutv.com$"){
rewrite ^(.*)$ http://www.maowutv.com/$1 redirect;
}
try_files $uri $uri/ /index.php?$args;
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
切換到nginx運行到現在已經一周多了,一切穩定,未出現過無法訪問的情況。


