G. T. Wang 網站伺服器當機紀錄(2016/04/07)

本篇是 G. T. Wang 網站伺服器於 2016 年 4 月 7 日下午當機停擺的記錄。

今天下午赫然發現我的 G. T. Wang 部落格竟然無預警停擺,網頁伺服器可以連得上去,但是顯示的內容卻是 nginx 的錯誤訊息,差點把我嚇死,馬上連上伺服器檢查,結果更讓我吃驚,查了 /var/log 底下相關的伺服器記錄,一時之間找不到關鍵的錯誤訊息,但是網站卻是處於停止服務的狀態。


我檢查了 nginx 的 error.log,都是一大堆 php5-fpm 的錯誤:

nginx-error-log-1

nginx 的 error.log 記錄檔

2016/04/07 15:25:11 [error] 4743#0: *50 connect() to unix:/var/run/php5-fpm.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: 66.249.84.208, server: blog.gtwang.org, request: "GET /feeds/posts/default HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "blog.gtwang.org"

接著去看 php5-fpm 的記錄檔,結果竟然沒有任何錯誤訊息在裡頭:

php5-fpm-log-1

php5-fpm.log 記錄檔

在一臉疑惑的情況下,嘗試使用 service 重新啟動 php5-fpm 服務也無效,後來實在不想浪費時間找,直接重開機試試看,結果重開機之後就恢復正常了,從發現問題到處理完大約花了 5 分鐘,但是在我發現問題之前,網站已經掛了 20 分鐘了,應該有影響到不少的使用者。

後來我仔細檢查伺服器的記錄檔,終於找到出問題的地方,主因出在 php5-fpm 的嚴重 bugs:

php5-fpm-segfault-1

syslog 記錄檔

Apr  7 15:05:47 linode01 kernel: php5-fpm[17757]: segfault at 7ffcbc82b001 ip 000000000079fe74 sp 00007ffcbc823e70 error 6 in php5-fpm[400000+800000]

這種 segfault 問題通常不會有太明顯的錯誤訊息,而且 php5-fpm 出問題終止執行之後,使用 service 重新啟動似乎還會有問題,我猜可能是 pid 檔案之類的問題,不過我也不想找了,重開機可能會比慢慢找問題修正來得快。

我目前所使用的 Linux 發行版是 Ubuntu,這類的 Linux 比較不穩定,會出這種問題我也不意外,只是我之前沒有考慮網站長期營運的問題,經過這次的事件之後,我會認真考慮未來改用 CentOSRHEL 了。

最後補充一下目前的系統環境資訊:

項目 版本
Linux 發行版 Ubuntu 14.04.4 LTS
Linux 核心 Linux linode01 4.5.0-x86_64-linode65 #2 SMP Mon Mar 14 18:01:58 EDT 2016 x86_64 x86_64 x86_64 GNU/Linux
php5 5.5.9+dfsg-1ubuntu4.14
php5-fpm 5.5.9+dfsg-1ubuntu4
nginx 1.4.6-1ubuntu3

Linux

6 Comments

  1. 路人

    不是LINUX發行版的問題,是 nginx 與 php5-fpm 運作機制的問題。

    http://stackoverflow.com/questions/25098029/connect-to-unix-var-run-php5-fpm-sock-failed-what-is-wrong-with-my-setup

    • G. T. Wang

      感謝高人指點,但我這裡的問題不是 pm.max_children 上限問題,而是 php5-fpm 出現 segfault,不過這是一個很好的參考資料,非常感謝您。 🙂

  2. 路人

    有兩個方向試看看:
    (1) 過去經驗使用 lighttpd 搭 spawn-fcgi,穩定度很好。流量大時也不會炸掉。
    (2) 使用 nginx 搭 php-fpm 考慮採用 tcp/ip 方式溝通,而不用系統的sock

    • G. T. Wang

      感謝您的建議,我會再研究看看這些設定配置。

  3. Mason.C

    nginx + php-fpm unix sock 的實作上好像有限制.

    之前我們公司主機在做壓力測試時unix sock 連線量一多很快就會有connect failed 的情況(aws c4 large),試出來的感覺是每個unix sock配1000左右的連線(老實說蠻少的)

    若不講究單位時間連線數最大量(cost reduction <3)tcp/ip 確實很夠用,但希望榨乾主機可以多開啟幾個unix sock 然後用nginx 本身的upstream 去分.
    大概長這樣:
    upstream api_backend {
    server unix:/var/run/php5-fpm-www.sock max_fails=3;
    server 127.0.0.1:9940 max_fails=3; # tcp
    keepalive 50;
    }

    location ~ \.php$ {
    //…
    fastcgi_pass api_backend;
    }

Leave a Reply