WebService之nginx+(php-fpm)結(jié)構(gòu)模型剖析及優(yōu)化
一、nginx和php-fpm的關(guān)系和分工
對(duì)應(yīng)nginx+php-fpm的模型結(jié)構(gòu)圖如下:
(圖 1)
1、nginx的工作簡(jiǎn)介(對(duì)應(yīng)圖1看)
在接到php的腳本請(qǐng)求后,nginx通過(guò)fastcgi_pass指令將請(qǐng)求傳遞給后端php-fpm的worker進(jìn)程處理,在此過(guò)程中,nginx做了各種超時(shí)機(jī)制、緩存機(jī)制、buffer機(jī)制和長(zhǎng)連接機(jī)制等來(lái)保障與后端的php-fpm能夠良性高效的合作。
在超時(shí)機(jī)制方面控制nginx對(duì)后端php的等待時(shí)間,通過(guò)各種timeout指令進(jìn)行控制,例如:
fastcgi_connect_timeout 后端鏈接時(shí)間
fastcgi_send_timeout 數(shù)據(jù)發(fā)送時(shí)間,兩次成功發(fā)送時(shí)間差,不是整個(gè)發(fā)送時(shí)間
fastcgi_read_timeout 數(shù)據(jù)接收時(shí)間,兩次成功接收時(shí)間差,不是整個(gè)接收時(shí)間
當(dāng)超時(shí)后會(huì)返回504超時(shí)的狀態(tài)碼,在buffer機(jī)制指令也有很多,例如:
fastcgi_buffer_size 存放fastcgi傳過(guò)來(lái)的響應(yīng)頭,一般設(shè)置為分頁(yè)大小
fastcgi_buffers 存放fastcgi傳過(guò)來(lái)的相應(yīng)內(nèi)容,一般設(shè)置分頁(yè)的倍數(shù),格式例如 8 4k|8k
另外還有一些其它的緩存、長(zhǎng)連接機(jī)制不做介紹,當(dāng)設(shè)置不合理時(shí)也會(huì)出現(xiàn)5XX錯(cuò)誤,nginx的文章介紹寫了有很多的,不再做過(guò)多的說(shuō)明。
2、php-fpm工作介紹(對(duì)應(yīng)圖1看)
Php-fpm是一個(gè)PHPfastcgi進(jìn)程管理器,在啟動(dòng)后會(huì)有master和worker兩種進(jìn)程,master負(fù)責(zé)接收外部信號(hào)和管理worker進(jìn)程,worker進(jìn)程是負(fù)責(zé)干活的,處理nginx傳過(guò)來(lái)的任務(wù)。
master進(jìn)程只有一個(gè),負(fù)責(zé)監(jiān)聽(tīng)端口和管理worker進(jìn)程,每次傳來(lái)任務(wù),與前端的nginx建立3次握手后放入連接隊(duì)列,供worker進(jìn)程進(jìn)行accept,當(dāng)worker進(jìn)程出現(xiàn)錯(cuò)誤或執(zhí)行超時(shí)時(shí),負(fù)責(zé)將worker進(jìn)程重啟或者殺掉,是php-fpm模型中的大內(nèi)總管。
Worker進(jìn)程是工作進(jìn)程,每個(gè)worker進(jìn)程都獨(dú)立的執(zhí)行php程序腳本,然后把執(zhí)行的結(jié)果通過(guò)fastcgi協(xié)議交給nginx,執(zhí)行過(guò)程中受master的管理。在工作中,worker進(jìn)程去競(jìng)爭(zhēng)accept管理進(jìn)程master的鏈接隊(duì)列,accept函數(shù)將從連接請(qǐng)求隊(duì)列中獲得連接信息,創(chuàng)建新的socket,并返回該套接字的fd,新創(chuàng)建的socket用于服務(wù)器與nginx的通信,而原來(lái)的套接字仍然處于監(jiān)聽(tīng)狀態(tài)。
php-fpm可以配置多個(gè)pool,所有pool由master統(tǒng)一管理監(jiān)聽(tīng)不同端口并分配不同worker進(jìn)程池,worker進(jìn)程池支持動(dòng)態(tài)prefork同時(shí)也支持靜態(tài)開(kāi)啟,服務(wù)器內(nèi)存較大時(shí)建議直接計(jì)算后配置靜態(tài)資源池,可以減少頻繁prefork進(jìn)程所帶來(lái)的開(kāi)銷,提高服務(wù)質(zhì)量,由于進(jìn)程模型越跑程序耗費(fèi)越大,因?yàn)槊總€(gè)worker進(jìn)程可以配置執(zhí)行多少個(gè)請(qǐng)求后進(jìn)行重啟,對(duì)應(yīng)的池子的指令和執(zhí)行多少個(gè)請(qǐng)求的指令如下:
pm = static | dynamic | ondemand 靜態(tài)池、服務(wù)優(yōu)先、內(nèi)存優(yōu)先
pm.max_children = 256 開(kāi)啟的最大php進(jìn)程數(shù)
pm.max_requests = 1024 在執(zhí)行了1024個(gè)請(qǐng)求后重啟worker進(jìn)程
這也是我們線上服務(wù)器的配置,我們線上用的web服務(wù)的機(jī)器是12核cpu、12G內(nèi)存,nginx開(kāi)啟12個(gè)worker進(jìn)程,php開(kāi)啟256個(gè)進(jìn)程,跑起來(lái)后每個(gè)進(jìn)程大概占用30M內(nèi)存,也就是(256+12)*30=8G ,另外還跑了一些配管、監(jiān)控、統(tǒng)計(jì)、日志收集等七七八八的軟件,整體業(yè)務(wù)是比較輕松的,這種靜態(tài)池的配置大大減少了prefork進(jìn)程帶來(lái)的開(kāi)銷,RT時(shí)間100ms以內(nèi)的占到90%以上(這個(gè)與程序?qū)懙娜绾斡嘘P(guān)),運(yùn)行一段時(shí)間后的開(kāi)銷截圖如下:
二、此模型結(jié)構(gòu)常見(jiàn)的5XX服務(wù)器端錯(cuò)誤及優(yōu)化(對(duì)應(yīng)圖1看)
1、nginx日志里產(chǎn)生502錯(cuò)誤
第一種情況,php-fpm的worker進(jìn)程執(zhí)行php程序腳本時(shí),超過(guò)了配置的最長(zhǎng)執(zhí)行時(shí)間,master進(jìn)程將worker進(jìn)程殺掉,直接返回502。返回502后nginx對(duì)應(yīng)的error日志是104: Connection reset by peer對(duì)應(yīng)的php執(zhí)行時(shí)間的配置如下,一些版本中php-fpm的配置會(huì)覆蓋php.ini的配置,使php.ini的配置不起作用:
php.ini中默認(rèn)30s:max_execution_time =
php-fpm中:request_terminate_timeout =
第二種情況,連接請(qǐng)求數(shù)(accpet之前)超出了端口所能監(jiān)聽(tīng)的tcp連接的最大值(backlog的值),進(jìn)不了fpm等待accept的鏈接隊(duì)列,直接返回502,這里可能會(huì)產(chǎn)生tcp重傳;
返回502后nginx對(duì)應(yīng)的error日志是111: Connection refused
backlog的值是半連接和全連接的總和,他的存在也有短時(shí)間緩沖解耦nginx請(qǐng)求與fpm處理的作用,半連接指收到了syn請(qǐng)求,3次握手尚未建立,全連接指的是3次握手已經(jīng)成功,不過(guò)尚未被accpet的請(qǐng)求,fpm里面有調(diào)節(jié)的參數(shù),如果fpm的參數(shù)設(shè)置為-1,則默認(rèn)走的是系統(tǒng)內(nèi)核參數(shù)net.core.somaxconn的設(shè)置值,如果不設(shè)置可以在/proc/sys/net/core/somaxconn里查看,默認(rèn)值是128,所以在連接請(qǐng)求較高的業(yè)務(wù)里要增大這個(gè)值。
第三種情況,網(wǎng)絡(luò)卡時(shí),客戶端斷開(kāi)連接,nginx處顯示499,然后php檢查到前端nginx產(chǎn)生abort后,又master結(jié)束此條任務(wù)的繼而產(chǎn)生502,一般此種情況的報(bào)警,先是499,過(guò)會(huì)兒變成502,再過(guò)一會(huì)變成504.
-
減少避免502報(bào)錯(cuò)優(yōu)化建議
502主要從php-fpm的配置方考慮,根據(jù)服務(wù)器情況,適量增大php-fpm的工作進(jìn)程數(shù),適當(dāng)增加php的執(zhí)行時(shí)間,適當(dāng)增加backlog值。
php的工作進(jìn)程數(shù)也不是越大越好,這種進(jìn)程模型運(yùn)行時(shí)間長(zhǎng)了占的內(nèi)存會(huì)增大,一般一個(gè)php進(jìn)程是占到30M左右的內(nèi)存,開(kāi)多少合適自己算吧,nginx的worker進(jìn)程一般也能跑到30M的內(nèi)存,綜合計(jì)算一下;php的執(zhí)行時(shí)間可以根據(jù)你的服務(wù)標(biāo)準(zhǔn)來(lái)設(shè)定,超過(guò)服務(wù)時(shí)間瀏覽器返回的是502錯(cuò)誤,這個(gè)按照實(shí)際的情況處理吧,一般情況要設(shè)置超時(shí)時(shí)間,避免某些請(qǐng)求慢,將整個(gè)業(yè)務(wù)堵死;至于backlog值,當(dāng)程序?qū)懙谋容^好時(shí),建議設(shè)置其數(shù)量為php工作進(jìn)程的1到2倍。
2、nginx日志里產(chǎn)生504錯(cuò)誤
第一種情況,php的worker進(jìn)程池處理慢,無(wú)法盡快處理等待accept的鏈接隊(duì)列,導(dǎo)致3次握手后的鏈接隊(duì)列長(zhǎng)時(shí)間沒(méi)有被accept,nginx鏈接等待超時(shí);
返回504后nginx對(duì)應(yīng)的error日志是110: Connection timed out
第二種情況,后端php-fpm執(zhí)行腳本的時(shí)間太長(zhǎng),超過(guò)了nginx配置的超時(shí)機(jī)制,這個(gè)時(shí)候也是會(huì)報(bào)出504錯(cuò)誤的。
第三種情況,客戶端的網(wǎng)絡(luò)及其差,php將請(qǐng)求處理完交給nginx后,nginx沒(méi)能在超時(shí)時(shí)間內(nèi)將內(nèi)容全部吐給用戶,這時(shí)也會(huì)超時(shí),只有504而沒(méi)有502。
-
減少避免504報(bào)錯(cuò)的優(yōu)化建議
504主要從nginx的配置方考慮,根據(jù)業(yè)務(wù)情況配置好超時(shí)的各種機(jī)制,包含但不限于下屬參數(shù):
fastcgi_connect_timeout
fastcgi_send_timeout
fastcgi_read_timeout
......
另外:在配置過(guò)程中,比如遇到大并發(fā)或者是特殊業(yè)務(wù)的場(chǎng)景,不合理的fd、buffer等設(shè)置也會(huì)帶來(lái)5XX錯(cuò)誤,比如說(shuō)大并發(fā)連接的業(yè)務(wù)要增大系統(tǒng)和單個(gè)程序的fd數(shù)量,如果是上傳業(yè)務(wù)要增大頭buffer等,這些要視情況而做優(yōu)化,正所謂道法自然,術(shù)變?nèi)f千,要以不變應(yīng)萬(wàn)變。

責(zé)任編輯:售電衡衡
- 相關(guān)閱讀
- 碳交易
- 節(jié)能環(huán)保
- 電力法律
- 電力金融
- 綠色電力證書(shū)
-
碳中和戰(zhàn)略|趙英民副部長(zhǎng)致辭全文
2020-10-19碳中和,碳排放,趙英民 -
兩部門:推廣不停電作業(yè)技術(shù) 減少停電時(shí)間和停電次數(shù)
2020-09-28獲得電力,供電可靠性,供電企業(yè) -
國(guó)家發(fā)改委、國(guó)家能源局:推廣不停電作業(yè)技術(shù) 減少停電時(shí)間和停電次數(shù)
2020-09-28獲得電力,供電可靠性,供電企業(yè)
-
碳中和戰(zhàn)略|趙英民副部長(zhǎng)致辭全文
2020-10-19碳中和,碳排放,趙英民 -
深度報(bào)告 | 基于分類監(jiān)管與當(dāng)量協(xié)同的碳市場(chǎng)框架設(shè)計(jì)方案
2020-07-21碳市場(chǎng),碳排放,碳交易 -
碳市場(chǎng)讓重慶能源轉(zhuǎn)型與經(jīng)濟(jì)發(fā)展并進(jìn)
2020-07-21碳市場(chǎng),碳排放,重慶
-
兩部門:推廣不停電作業(yè)技術(shù) 減少停電時(shí)間和停電次數(shù)
2020-09-28獲得電力,供電可靠性,供電企業(yè) -
國(guó)家發(fā)改委、國(guó)家能源局:推廣不停電作業(yè)技術(shù) 減少停電時(shí)間和停電次數(shù)
2020-09-28獲得電力,供電可靠性,供電企業(yè) -
2020年二季度福建省統(tǒng)調(diào)燃煤電廠節(jié)能減排信息披露
2020-07-21火電環(huán)保,燃煤電廠,超低排放
-
四川“專線供電”身陷違法困境
2019-12-16專線供電 -
我國(guó)能源替代規(guī)范法律問(wèn)題研究(上)
2019-10-31能源替代規(guī)范法律 -
區(qū)域鏈結(jié)構(gòu)對(duì)于數(shù)據(jù)中心有什么影響?這個(gè)影響是好是壞呢!