php-fpm裏常用參數優化解析

從php5.3以後php自帶了php-fpm不是和php5.2一樣以插件的方式存在了。這給我們帶來一個好處502沒有那麼容易出現了
配置優化:
php-fpm的配置文件位置:
/usr/local/php/etc/php-fpm.conf
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含義參考:
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(靜態模式)或者dynamic(動態模式5.2的時候叫apache-like但是不好使)
如果選擇static,則由pm.max_children指定固定的子進程數。
如果選擇dynamic,則由下開參數決定:
pm.max_children ,子進程最大數
pm.start_servers ,啓動時的進程數
pm.min_spare_servers ,保證空閒進程數最小值,如果空閒進程小於此值,則創建新的子進程
pm.max_spare_servers ,保證空閒進程數最大值,如果空閒進程大於此值,此進行清理
對於專用服務器,pm可以設置爲static。
pm.max_requests = 1000
設置每個子進程重生之前服務的請求數. 對於可能存在內存泄漏的第三方模塊來說是非常有用的. 如果設置爲 ’0′ 則一直接受請求. 等同於 PHP_FCGI_MAX_REQUESTS 環境變量. 默認值: 0.
pm.status_path = /status
FPM狀態頁面的網址. 如果沒有設置, 則無法訪問狀態頁面. 默認值: none.
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 . 默認值: 空
下面已我的php配置例子:
[global]pid = /usr/local/php/var/run/php-fpm.pid
error_log = /home/wwwlogs/php-fpm.log
log_level = notice
rlimit_files = 65535
rlimit_core = 0
[www]
listen = /tmp/php-cgi.sock
user = nobody  nginx, php-fpm進程的權限不能以網站所有權運行安全有問題
group = nobody  nginx, php-fpm進程的權限不能以網站所有權運行安全有問題
pm = dynamic
pm.max_children = 36 靜態模式開啓進程數
pm.start_servers = 9 動態模式默認開啓進程 數
pm.min_spare_servers = 8 動態模式默認最低保留進程 數
pm.max_spare_servers = 36 動態模式默認最高 進程數具體通過netstat -napo |grep "php-fpm" | wc -l和系統負載確定
pm.max_requests = 4096 進程執行xxx後重啓釋放內存避免內存泄漏
request_terminate_timeout = 100 進程超時時間
request_slowlog_timeout = 3s 記錄大於3秒的php執行命令
slowlog = /home/wwwlogs/php-fpm.log.slow
rlimit_files = 65535 這個值一定要改默認的太小不改日誌會有錯誤但是要和全局文件數相同具體查看ulimit -n系統全局設置
rlimit_core = 0




----注:

下面4個參數的意思分別爲:

pm.max_children:靜態方式下開啓的php-fpm進程數量。
pm.start_servers:動態方式下的起始php-fpm進程數量。
pm.min_spare_servers:動態方式下的最小php-fpm進程數量。
pm.max_spare_servers:動態方式下的最大php-fpm進程數量。

如果dm設置爲static,那麼其實只有pm.max_children這個參數生效。系統會開啓設置數量的php-fpm進程。

如果dm設置爲dynamic,那麼pm.max_children參數失效,後面3個參數生效。系統會在php-fpm運行開始的時候啓動pm.start_servers個php-fpm進程,然後根據系統的需求動態在pm.min_spare_servers和pm.max_spare_servers之間調整php-fpm進程數。

那麼,對於我們的服務器,選擇哪種執行方式比較好呢?事實上,跟Apache一樣,運行的PHP程序在執行完成後,或多或少會有內存泄露的問題。這也是爲什麼開始的時候一個php-fpm進程只佔用3M左右內存,運行一段時間後就會上升到20-30M的原因了。

對於內存大的服務器(比如8G以上)來說,指定靜態的max_children實際上更爲妥當,因爲這樣不需要進行額外的進程數目控制,會提高效率。因爲頻繁開關php-fpm進程也會有時滯,所以內存夠大的情況下開靜態效果會更好。數量也可以根據 內存/30M 得到,比如8GB內存可以設置爲100,那麼php-fpm耗費的內存就能控制在 2G-3G的樣子。如果內存稍微小點,比如1G,那麼指定靜態的進程數量更加有利於服務器的穩定。這樣可以保證php-fpm只獲取夠用的內存,將不多的內存分配給其他應用去使用,會使系統的運行更加暢通。

對於小內存的服務器來說,比如256M內存的VPS,即使按照一個20M的內存量來算,10個php-cgi進程就將耗掉200M內存,那系統的崩潰就應該很正常了。因此應該儘量地控制php-fpm進程的數量,大體明確其他應用佔用的內存後,給它指定一個靜態的小數量,會讓系統更加平穩一些。或者使用動態方式,因爲動態方式會結束掉多餘的進程,可以回收釋放一些內存,所以推薦在內存較少的服務器或VPS上使用。具體最大數量根據 內存/20M 得到。比如說512M的VPS,建議pm.max_spare_servers設置爲20。至於pm.min_spare_servers,則建議根據服務器的負載情況來設置,比較合適的值在5~10之間。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章