天天看點

php-fpm - 啟動參數及重要配置詳解

原文: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配置

/usr/local/php/sbin/php-fpm

-t

/usr/local/php/sbin/php-fpm

-c

/usr/local/php/etc/php

.ini -y

/usr/local/php/etc/php-fpm

.conf -t

#啟動php-fpm

/usr/local/php/sbin/php-fpm

/usr/local/php/sbin/php-fpm

-c

/usr/local/php/etc/php

.ini -y

/usr/local/php/etc/php-fpm

.conf

#關閉php-fpm

kill

-INT `

cat

/usr/local/php/var/run/php-fpm

.pid`

#重新開機php-fpm

kill

-USR2 `

cat

/usr/local/php/var/run/php-fpm

.pid`

二,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

pid = run

/php-fpm

.pid

#pid設定,預設在安裝目錄中的var/run/php-fpm.pid,建議開啟

error_log = log

/php-fpm

.log

#錯誤日志,預設在安裝目錄中的var/log/php-fpm.log

log_level = notice

#錯誤級别. 可用級别為: alert(必須立即處理), error(錯誤情況), warning(警告情況), notice(一般重要資訊), debug(調試資訊). 預設: notice.

emergency_restart_threshold = 60

emergency_restart_interval = 60s

#表示在emergency_restart_interval所設值内出現SIGSEGV或者SIGBUS錯誤的php-cgi程序數如果超過 emergency_restart_threshold個,php-fpm就會優雅重新開機。這兩個選項一般保持預設值。

process_control_timeout = 0

#設定子程序接受主程序複用信号的逾時時間. 可用機關: s(秒), m(分), h(小時), 或者 d(天) 預設機關: s(秒). 預設值: 0.

daemonize =

yes

#背景執行fpm,預設值為yes,如果為了調試可以改為no。在FPM中,可以使用不同的設定來運作多個程序池。 這些設定可以針對每個程序池單獨設定。

listen = 127.0.0.1:9000

#fpm監聽端口,即nginx中php處理的位址,一般預設值即可。可用格式為: 'ip:port', 'port', '/path/to/unix/socket'. 每個程序池都需要設定.

listen.backlog = -1

#backlog數,-1表示無限制,由作業系統決定,此行注釋掉就行。backlog含義參考:http://www.3gyou.cc/?p=41

listen.allowed_clients = 127.0.0.1

#允許通路FastCGI程序的IP,設定any為不限制IP,如果要設定其他主機的nginx也能通路這台FPM程序,listen處要設定成本地可被通路的IP。預設值是any。每個位址是用逗号分隔. 如果沒有設定或者為空,則允許任何伺服器請求連接配接

listen.owner = www

listen.group = www

listen.mode = 0666

#unix socket設定選項,如果使用tcp方式通路,這裡注釋即可。

user = www

group = www

#啟動程序的帳戶群組

pm = dynamic

#對于專用伺服器,pm可以設定為static。

#如何控制子程序,選項有static和dynamic。如果選擇static,則由pm.max_children指定固定的子程序數。如果選擇dynamic,則由下開參數決定:

pm.max_children

#,子程序最大數

pm.start_servers

#,啟動時的程序數

pm.min_spare_servers

#,保證空閑程序數最小值,如果空閑程序小于此值,則建立新的子程序

pm.max_spare_servers

#,保證空閑程序數最大值,如果空閑程序大于此值,此進行清理

pm.max_requests = 1000

#設定每個子程序重生之前服務的請求數. 對于可能存在記憶體洩漏的第三方子產品來說是非常有用的. 如果設定為 '0' 則一直接受請求. 等同于 PHP_FCGI_MAX_REQUESTS 環境變量. 預設值: 0.

pm.status_path =

/status

#FPM狀态頁面的網址. 如果沒有設定, 則無法通路狀态頁面. 預設值: none. munin監控會使用到

ping

.path =

/ping

#FPM監控頁面的ping網址. 如果沒有設定, 則無法通路ping頁面. 該頁面用于外部檢測FPM是否存活并且可以響應請求. 請注意必須以斜線開頭 (/)。

ping

.response = pong

#用于定義ping請求的傳回相應. 傳回為 HTTP 200 的 text/plain 格式文本. 預設值: pong.

request_terminate_timeout = 0

#設定單個請求的逾時中止時間. 該選項可能會對php.ini設定中的'max_execution_time'因為某些特殊原因沒有中止運作的腳本有用. 設定為 '0' 表示 'Off'.當經常出現502錯誤時可以嘗試更改此選項。

request_slowlog_timeout = 10s

#當一個請求該設定的逾時時間後,就會将對應的PHP調用堆棧資訊完整寫入到慢日志中. 設定為 '0' 表示 'Off'

slowlog = log/$pool.log.slow

#慢請求的記錄日志,配合request_slowlog_timeout使用

rlimit_files = 1024

#設定檔案打開描述符的rlimit限制. 預設值: 系統定義值預設可打開句柄是1024,可使用 ulimit -n檢視,ulimit -n 2048修改。

rlimit_core = 0

#設定核心rlimit最大限制值. 可用值: 'unlimited' 、0或者正整數. 預設值: 系統定義值.

chroot =

#啟動時的Chroot目錄. 所定義的目錄需要是絕對路徑. 如果沒有設定, 則chroot不被使用.

chdir =

#設定啟動目錄,啟動時會自動Chdir到該目錄. 所定義的目錄需要是絕對路徑. 預設值: 目前目錄,或者/目錄(chroot時)

catch_workers_output =

yes

#重定向運作過程中的stdout和stderr到主要的錯誤日志檔案中. 如果沒有設定, stdout 和 stderr 将會根據FastCGI的規則被重定向到 /dev/null . 預設值: 空.

三,常見錯誤及解決辦法整理

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加一個逾時參數。

$ctx

= stream_context_create(

array

(

'http'

=>

array

(

'timeout'

=> 10

//設定一個逾時時間,機關為秒

)

)

);

file_get_contents

(

$str

, 0,

$ctx

);

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)。大家要根據自己的實際情況設定這個值,不能盲目地加大。