原文:http://www.4wei.cn/archives/1002061
約定幾個目錄
/usr/local/php/sbin/php-fpm
/usr/local/php/etc/php-fpm.conf
/usr/local/php/etc/php.ini
一,php-fpm的啟動參數
幫助
01 02 03 04 05 06 07 08 09 10 11 12 13 | |
二,php-fpm.conf重要參數詳解
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | |
三,常見錯誤及解決辦法整理
1,request_terminate_timeout的值如果設定為0或者過長的時間,可能會引起file_get_contents的資源問題。
如果file_get_contents請求的遠端資源如果反應過慢,file_get_contents就會一直卡在那裡不會逾時,我們知道php.ini 裡面max_execution_time 可以設定 PHP 腳本的最大執行時間,但是,在 php-cgi(php-fpm) 中,該參數不會起效。真正能夠控制 PHP 腳本最大執行時間的是 php-fpm.conf 配置檔案中的request_terminate_timeout參數。
request_terminate_timeout預設值為 0 秒,也就是說,PHP 腳本會一直執行下去。這樣,當所有的 php-cgi 程序都卡在 file_get_contents() 函數時,這台 Nginx+PHP 的 WebServer 已經無法再處理新的 PHP 請求了,Nginx 将給使用者傳回“502 Bad Gateway”。修改該參數,設定一個 PHP 腳本最大執行時間是必要的,但是,治标不治本。例如改成 30s,如果發生 file_get_contents() 擷取網頁内容較慢的情況,這就意味着 150 個 php-cgi 程序,每秒鐘隻能處理 5 個請求,WebServer 同樣很難避免"502 Bad Gateway"。解決辦法是request_terminate_timeout設定為10s或者一個合理的值,或者給file_get_contents加一個逾時參數。
|
2,max_requests參數配置不當,可能會引起間歇性502錯誤:
http://hily.me/blog/2011/01/nginx-php-fpm-502/
pm.max_requests = 1000
#設定每個子程序重生之前服務的請求數. 對于可能存在記憶體洩漏的第三方子產品來說是非常有用的. 如果設定為 '0' 則一直接受請求. 等同于 PHP_FCGI_MAX_REQUESTS 環境變量. 預設值: 0.
這段配置的意思是,當一個 PHP-CGI 程序處理的請求數累積到 500 個後,自動重新開機該程序。
但是為什麼要重新開機程序呢?
一般在項目中,我們多多少少都會用到一些 PHP 的第三方庫,這些第三方庫經常存在記憶體洩漏問題,如果不定期重新開機 PHP-CGI 程序,勢必造成記憶體使用量不斷增長。是以 PHP-FPM 作為 PHP-CGI 的管理器,提供了這麼一項監控功能,對請求達到指定次數的 PHP-CGI 程序進行重新開機,保證記憶體使用量不增長。
正是因為這個機制,在高并發的站點中,經常導緻 502 錯誤,我猜測原因是 PHP-FPM 對從 NGINX 過來的請求隊列沒處理好。不過我目前用的還是 PHP 5.3.2,不知道在 PHP 5.3.3 中是否還存在這個問題。
目前我們的解決方法是,把這個值盡量設定大些,盡可能減少 PHP-CGI 重新 SPAWN 的次數,同時也能提高總體性能。在我們自己實際的生産環境中發現,記憶體洩漏并不明顯,是以我們将這個值設定得非常大(204800)。大家要根據自己的實際情況設定這個值,不能盲目地加大。