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