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(調(diào)試信息). 默認: notice.
emergency_restart_threshold = 60
emergency_restart_interval = 60s
#表示在emergency_restart_interval所設值內(nèi)出現(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绷杜,如果為了調(diào)試可以改為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ù). 對于可能存在內(nèi)存泄漏的第三方模塊來說是非常有用的. 如果設置為 '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調(diào)用堆棧信息完整寫入到慢日志中. 設置為 '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ù)調(diào)優(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之間調(diào)整php-fpm進程數(shù)
那么氏捞,對于我們的服務器,選擇哪種pm方式比較好呢冒版?事實上液茎,跟Apache一樣,運行的PHP程序在執(zhí)行完成后辞嗡,或多或少會有內(nèi)存泄露的問題捆等。這也是為什么開始的時候一個php-fpm進程只占用3M左右內(nèi)存,運行一段時間后就會上升到20-30M的原因了续室。
對于內(nèi)存大的服務器(比如8G以上)來說栋烤,指定靜態(tài)的max_children實際上更為妥當,因為這樣不需要進行額外的進程數(shù)目控制挺狰,會提高效率明郭。因為頻繁開關php-fpm進程也會有時滯买窟,所以內(nèi)存夠大的情況下開靜態(tài)效果會更好。數(shù)量也可以根據(jù) 內(nèi)存/30M 得到薯定,比如8GB內(nèi)存可以設置為100始绍,那么php-fpm耗費的內(nèi)存就能控制在 2G-3G的樣子。如果內(nèi)存稍微小點话侄,比如1G亏推,那么指定靜態(tài)的進程數(shù)量更加有利于服務器的穩(wěn)定。這樣可以保證php-fpm只獲取夠用的內(nèi)存满葛,將不多的內(nèi)存分配給其他應用去使用径簿,會使系統(tǒng)的運行更加暢通。
對于小內(nèi)存的服務器來說嘀韧,比如256M內(nèi)存的VPS篇亭,即使按照一個20M的內(nèi)存量來算,10個php-cgi進程就將耗掉200M內(nèi)存锄贷,那系統(tǒng)的崩潰就應該很正常了译蒂。因此應該盡量地控制php-fpm進程的數(shù)量,大體明確其他應用占用的內(nèi)存后谊却,給它指定一個靜態(tài)的小數(shù)量柔昼,會讓系統(tǒng)更加平穩(wěn)一些⊙妆妫或者使用動態(tài)方式捕透,因為動態(tài)方式會結束掉多余的進程,可以回收釋放一些內(nèi)存碴萧,所以推薦在內(nèi)存較少的服務器或VPS上使用乙嘀。具體最大數(shù)量根據(jù) 內(nèi)存/20M 得到。比如說512M的VPS破喻,建議pm.max_spare_servers設置為20虎谢。至于pm.min_spare_servers,則建議根據(jù)服務器的負載情況來設置曹质,比較合適的值在5~10之間婴噩。
在4G內(nèi)存的服務器上200就可以(我的1G測試機,開64個是最好的羽德,建議使用壓力測試獲取最佳值)
pm.max_requests = 10240;
nginx php-fpm配置過程中最大問題是內(nèi)泄漏出問題:服務器的負載不大几莽,但是內(nèi)存占用迅速增加,很快吃掉內(nèi)存接著開始吃交換分區(qū)宅静,系統(tǒng)很快掛掉银觅!其實根據(jù)官方的介紹,php-cgi不存在內(nèi)存泄漏坏为,每個請求完成后php-cgi會回收內(nèi)存究驴,但是不會釋放給操作系統(tǒng)镊绪,這樣就會導致大量內(nèi)存被php-cgi占用。
官方的解決辦法是降低PHP_FCGI_MAX_REQUESTS的值洒忧,如果用的是php-fpm蝴韭,對應的php-fpm.conf中的就是max_requests,該值的意思是發(fā)送多少個請求后會重啟該線程熙侍,我們需要適當降低這個值榄鉴,用以讓php-fpm自動的釋放內(nèi)存,不是大部分網(wǎng)上說的51200等等蛉抓,實際上還有另一個跟它有關聯(lián)的值max_children庆尘,這個是每次php-fpm會建立多少個進程,這樣實際上的內(nèi)存消耗是max_children*max_requests*每個請求使用內(nèi)存巷送,根據(jù)這個我們可以預估一下內(nèi)存的使用情況驶忌,就不用再寫腳本去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ù)實際情況而定付魔,多測試幾次得出最佳配置方案