相關關鍵詞
關于我們
最新文章
linux下的php-fpm參數(shù)配置介紹與參數(shù)優(yōu)化說明
php-fpm.conf重要參數(shù)詳解
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所設值內出現(xiàn)SIGSEGV或者SIGBUS錯誤的php-cgi進程數(shù)如果超過 emergency_restart_threshold個,php-fpm就會優(yōu)雅重啟。這兩個選項一般保持默認值。
process_control_timeout = 0
#設置子進程接受主進程復用信號的超時時間. 可用單位: s(秒), m(分), h(小時), 或者 d(天) 默認單位: s(秒). 默認值: 0.
daemonize = yes
#后臺執(zhí)行fpm,默認值為yes,如果為了調試可以改為no。在FPM中,可以使用不同的設置來運行多個進程池。 這些設置可以針對每個進程池單獨設置。
listen = 127.0.0.1:9000
#fpm監(jiān)聽端口,即nginx中php處理的地址,一般默認值即可。可用格式為: 'ip:port', 'port', '/path/to/unix/socket'. 每個進程池都需要設置.
listen.backlog = -1
#backlog數(shù),-1表示無限制,由操作系統(tǒng)決定,此行注釋掉就行。
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指定固定的子進程數(shù)。如果選擇dynamic,則由下開參數(shù)決定:
pm.max_children #,子進程最大數(shù)
pm.start_servers #,啟動時的進程數(shù)
pm.min_spare_servers #,保證空閑進程數(shù)最小值,如果空閑進程小于此值,則創(chuàng)建新的子進程
pm.max_spare_servers #,保證空閑進程數(shù)最大值,如果空閑進程大于此值,此進行清理
pm.max_requests = 1000
#設置每個子進程重生之前服務的請求數(shù). 對于可能存在內存泄漏的第三方模塊來說是非常有用的. 如果設置為 '0' 則一直接受請求. 等同于 PHP_FCGI_MAX_REQUESTS 環(huán)境變量. 默認值: 0.
pm.status_path = /status
#FPM狀態(tài)頁面的網(wǎng)址. 如果沒有設置, 則無法訪問狀態(tài)頁面. 默認值: none. munin監(jiān)控會使用到
ping.path = /ping
#FPM監(jiān)控頁面的ping網(wǎng)址. 如果沒有設置, 則無法訪問ping頁面. 該頁面用于外部檢測FPM是否存活并且可以響應請求. 請注意必須以斜線開頭 (/)。
ping.response = pong
#用于定義ping請求的返回相應. 返回為 HTTP 200 的 text/plain 格式文本. 默認值: pong.
request_terminate_timeout = 0
#設置單個請求的超時中止時間. 該選項可能會對php.ini設置中的'max_execution_time'因為某些特殊原因沒有中止運行的腳本有用. 設置為 '0' 表示 'Off'.當經(jīng)常出現(xiàn)502錯誤時可以嘗試更改此選項。
request_slowlog_timeout = 10s
#當一個請求該設置的超時時間后,就會將對應的PHP調用堆棧信息完整寫入到慢日志中. 設置為 '0' 表示 'Off'
slowlog = log/$pool.log.slow
#慢請求的記錄日志,配合request_slowlog_timeout使用
rlimit_files = 1024
#設置文件打開描述符的rlimit限制. 默認值: 系統(tǒng)定義值默認可打開句柄是1024,可使用 ulimit -n查看,ulimit -n 2048修改。
rlimit_core = 0
#設置核心rlimit最大限制值. 可用值: 'unlimited' 、0或者正整數(shù). 默認值: 系統(tǒng)定義值.
chroot =
#啟動時的Chroot目錄. 所定義的目錄需要是絕對路徑. 如果沒有設置, 則chroot不被使用.
chdir =
#設置啟動目錄,啟動時會自動Chdir到該目錄. 所定義的目錄需要是絕對路徑. 默認值: 當前目錄,或者/目錄(chroot時)
catch_workers_output = yes
#重定向運行過程中的stdout和stderr到主要的錯誤日志文件中. 如果沒有設置, stdout 和 stderr 將會根據(jù)FastCGI的規(guī)則被重定向到 /dev/null . 默認值: 空.
php-fpm參數(shù)調優(yōu)
pm = dynamic;
表示使用哪種進程數(shù)量管理方式
dynamic表示php-fpm進程數(shù)是動態(tài)的,最開始是pm.start_servers指定的數(shù)量,如果請求較多,則會自動增加,保證空閑的進程數(shù)不小于pm.min_spare_servers,如果進程數(shù)較多,也會進行相應清理,保證多余的進程數(shù)不多于pm.max_spare_servers
static表示php-fpm進程數(shù)是靜態(tài)的, 進程數(shù)自始至終都是pm.max_children指定的數(shù)量,不再增加或減少
pm.max_children = 300; 靜態(tài)方式下開啟的php-fpm進程數(shù)量
pm.start_servers = 20; 動態(tài)方式下的起始php-fpm進程數(shù)量
pm.min_spare_servers = 5; 動態(tài)方式下的最小php-fpm進程數(shù)量
pm.max_spare_servers = 35; 動態(tài)方式下的最大php-fpm進程數(shù)量
如果pm為static, 那么其實只有pm.max_children這個參數(shù)生效。系統(tǒng)會開啟設置數(shù)量的php-fpm進程
如果pm為dynamic, 那么pm.max_children參數(shù)失效,后面3個參數(shù)生效。系統(tǒng)會在php-fpm運行開始的時候啟動pm.start_servers個php-fpm進程,然后根據(jù)系統(tǒng)的需求動態(tài)在pm.min_spare_servers和pm.max_spare_servers之間調整php-fpm進程數(shù)
那么,對于我們的服務器,選擇哪種pm方式比較好呢?事實上,跟Apache一樣,運行的PHP程序在執(zhí)行完成后,或多或少會有內存泄露的問題。這也是為什么開始的時候一個php-fpm進程只占用3M左右內存,運行一段時間后就會上升到20-30M的原因了。
對于內存大的服務器(比如8G以上)來說,指定靜態(tài)的max_children實際上更為妥當,因為這樣不需要進行額外的進程數(shù)目控制,會提高效率。因為頻繁開關php-fpm進程也會有時滯,所以內存夠大的情況下開靜態(tài)效果會更好。數(shù)量也可以根據(jù) 內存/30M 得到,比如8GB內存可以設置為100,那么php-fpm耗費的內存就能控制在 2G-3G的樣子。如果內存稍微小點,比如1G,那么指定靜態(tài)的進程數(shù)量更加有利于服務器的穩(wěn)定。這樣可以保證php-fpm只獲取夠用的內存,將不多的內存分配給其他應用去使用,會使系統(tǒng)的運行更加暢通。
對于小內存的服務器來說,比如256M內存的VPS,即使按照一個20M的內存量來算,10個php-cgi進程就將耗掉200M內存,那系統(tǒng)的崩潰就應該很正常了。因此應該盡量地控制php-fpm進程的數(shù)量,大體明確其他應用占用的內存后,給它指定一個靜態(tài)的小數(shù)量,會讓系統(tǒng)更加平穩(wěn)一些。或者使用動態(tài)方式,因為動態(tài)方式會結束掉多余的進程,可以回收釋放一些內存,所以推薦在內存較少的服務器或VPS上使用。具體最大數(shù)量根據(jù) 內存/20M 得到。比如說512M的VPS,建議pm.max_spare_servers設置為20。至于pm.min_spare_servers,則建議根據(jù)服務器的負載情況來設置,比較合適的值在5~10之間。
在4G內存的服務器上200就可以(我的1G測試機,開64個是最好的,建議使用壓力測試獲取最佳值)
pm.max_requests = 10240;
nginx php-fpm配置過程中最大問題是內泄漏出問題:服務器的負載不大,但是內存占用迅速增加,很快吃掉內存接著開始吃交換分區(qū),系統(tǒng)很快掛掉!其實根據(jù)官方的介紹,php-cgi不存在內存泄漏,每個請求完成后php-cgi會回收內存,但是不會釋放給操作系統(tǒng),這樣就會導致大量內存被php-cgi占用。
官方的解決辦法是降低PHP_FCGI_MAX_REQUESTS的值,如果用的是php-fpm,對應的php-fpm.conf中的就是max_requests,該值的意思是發(fā)送多少個請求后會重啟該線程,我們需要適當降低這個值,用以讓php-fpm自動的釋放內存,不是大部分網(wǎng)上說的51200等等,實際上還有另一個跟它有關聯(lián)的值max_children,這個是每次php-fpm會建立多少個進程,這樣實際上的內存消耗是max_children*max_requests*每個請求使用內存,根據(jù)這個我們可以預估一下內存的使用情況,就不用再寫腳本去kill了。
request_terminate_timeout = 30;
最大執(zhí)行時間, 在php.ini中也可以進行配置(max_execution_time)
request_slowlog_timeout = 2; 開啟慢日志
slowlog = log/$pool.log.slow; 慢日志路徑
rlimit_files = 1024; 增加php-fpm打開文件描述符的限制
php-fpm.conf的參數(shù)明說大家只要多看幾遍應該就可能記住了,至于 php-fpm性能方案應該根據(jù)實際情況而定,多測試幾次得出最佳配置方案