Nginx+FPM結(jié)構(gòu)模型剖析及優(yōu)化

Nginx+FPM結(jié)構(gòu)模型剖析及優(yōu)化

隨著php腳本語言使用的普及,目前webserice服務(wù)大部分都在用nginx+(php-fpm)的結(jié)構(gòu),了解了其工作過程后才可以在各個方面想辦法做調(diào)整優(yōu)化和故障排查懂衩,從以下幾點總結(jié)一下這種模型。

一法希、nginx和php-fpm的關(guān)系和分工

nginx是web服務(wù)器毛肋,php-fpm是一個PHPFastCGI進程管理器,兩者遵循fastcgi的協(xié)議進行通信,nginx負責(zé)靜態(tài)類似html文件的處理,php-fpm負責(zé)php腳本語言的執(zhí)行,這么設(shè)計的目的是為了解耦前端nginx和后端的php璃饱,不至于讓容易出問題的php腳本堵塞整個nginx的業(yè)務(wù)處理帜平,影響用戶體驗,因為php腳本語言的執(zhí)行是會比較容易出問題的。nginx之所以能處理成千上萬高并發(fā)業(yè)務(wù)茉帅,除其本身的異步非阻塞模式,在與和其他模塊的耦合擴展方法也是分不開的樱蛤,在nginx的設(shè)計里不能接受的就是阻塞,不過并非完全沒有梗便脊,比如說用到的最多的多進程單線程的模式遂赠,由于nginx日志沒有單獨的處理進程,如果收集日志時處理不當(dāng)就會把worker進程堵死。

對應(yīng)nginx+php-fpm的模型結(jié)構(gòu)圖如下:

1、nginx的工作簡介

接到php的腳本請求后,nginx通過fastcgi_pass指令將請求傳遞給后端php-fpm的worker進程處理绒瘦,在此過程中惰帽,nginx做了各種超時機制、緩存機制、buffer機制和長連接機制等來保障與后端的php-fpm能夠良性高效的合作爵嗅。

在超時機制方面控制nginx對后端php的等待時間,通過各種timeout指令進行控制,例如:

fastcgi_connect_timeout : ?后端鏈接時間

fastcgi_send_timeout ?: ?數(shù)據(jù)發(fā)送時間,兩次成功發(fā)送時間差键痛,不是整個發(fā)送時間

fastcgi_read_timeout ?: ?數(shù)據(jù)接收時間,兩次成功接收時間差,不是整個接收時間

當(dāng)超時后會返回504超時的狀態(tài)碼,在buffer機制指令也有很多,例如:

fastcgi_buffer_size 存放fastcgi傳過來的響應(yīng)頭,一般設(shè)置為分頁大小

fastcgi_buffers 存放fastcgi傳過來的相應(yīng)內(nèi)容,一般設(shè)置分頁的倍數(shù)备畦,格式例如 8 ?4k|8k

另外還有一些其它的緩存、長連接機制不做介紹莉恼,當(dāng)設(shè)置不合理時也會出現(xiàn)5XX錯誤拌喉,nginx的文章介紹寫了有很多的,不再做過多的說明俐银。

2尿背、php-fpm工作介紹

Php-fpm是一個PHPfastcgi進程管理器,在啟動后會有master和worker兩種進程捶惜,master負責(zé)接收外部信號和管理worker進程田藐,worker進程是負責(zé)干活的,處理nginx傳過來的任務(wù)。

master進程只有一個汽久,負責(zé)監(jiān)聽端口和管理worker進程鹤竭,每次傳來任務(wù),與前端的nginx建立3次握手后放入連接隊列景醇,供worker進程進行accept臀稚,當(dāng)worker進程出現(xiàn)錯誤或執(zhí)行超時時,負責(zé)將worker進程重啟或者殺掉三痰,是php-fpm模型中的大內(nèi)總管吧寺。

Worker進程是工作進程,每個worker進程都獨立的執(zhí)行php程序腳本散劫,然后把執(zhí)行的結(jié)果通過fastcgi協(xié)議交給nginx稚机,執(zhí)行過程中受master的管理。在工作中舷丹,worker進程去競爭accept管理進程master的鏈接隊列,accept函數(shù)將從連接請求隊列中獲得連接信息蜓肆,創(chuàng)建新的socket颜凯,并返回該套接字的fd,新創(chuàng)建的socket用于服務(wù)器與nginx的通信仗扬,而原來的套接字仍然處于監(jiān)聽狀態(tài)症概。

php-fpm可以配置多個pool,所有pool由master統(tǒng)一管理監(jiān)聽不同端口并分配不同worker進程池早芭,worker進程池支持動態(tài)prefork同時也支持靜態(tài)開啟彼城,服務(wù)器內(nèi)存較大時建議直接計算后配置靜態(tài)資源池,可以減少頻繁prefork進程所帶來的開銷退个,提高服務(wù)質(zhì)量募壕,由于進程模型越跑程序耗費越大,因為每個worker進程可以配置執(zhí)行多少個請求后進行重啟语盈,對應(yīng)的池子的指令和執(zhí)行多少個請求的指令如下:

pm = static | dynamic | ondemand :靜態(tài)池舱馅、服務(wù)優(yōu)先、內(nèi)存優(yōu)先

pm.max_children = 256 ?: 開啟的最大php進程數(shù)

pm.max_requests = 1024 ?: 在執(zhí)行了1024個請求后重啟worker進程

這也是我們線上服務(wù)器的配置刀荒,我們線上用的web服務(wù)的機器是12核cpu代嗤、16G內(nèi)存,nginx開啟12個worker進程缠借,php開啟256個進程干毅,跑起來后每個進程大概占用30M內(nèi)存,也就是(256+12)*30=8G 泼返,另外還跑了一些配管硝逢、監(jiān)控、統(tǒng)計、日志收集等七七八八的軟件趴捅,整體業(yè)務(wù)是比較輕松的垫毙,這種靜態(tài)池的配置大大減少了prefork進程帶來的開銷,RT時間100ms以內(nèi)的占到90%以上(這個與程序?qū)懙娜绾斡嘘P(guān))拱绑,運行一段時間后的開銷截圖如下:

二综芥、此模型結(jié)構(gòu)常見的5XX

服務(wù)器端錯誤及優(yōu)化

1、nginx日志里產(chǎn)生502錯誤

第一種情況猎拨,php-fpm的worker進程執(zhí)行php程序腳本時膀藐,超過了配置的最長執(zhí)行時間,master進程將worker進程殺掉红省,直接返回502额各。返回502后nginx對應(yīng)的error日志是104: Connection reset by peer,對應(yīng)的php執(zhí)行時間的配置如下,一些版本中php-fpm的配置會覆蓋php.ini的配置吧恃,使php.ini的配置不起作用:

php.ini中默認30s:max_execution_time =

php-fpm中:request_terminate_timeout =

第二種情況虾啦,連接請求數(shù)(accpet之前)超出了端口所能監(jiān)聽的tcp連接的最大值(backlog的值),進不了fpm等待accept的鏈接隊列痕寓,直接返回502傲醉,這里可能會產(chǎn)生tcp重傳;返回502后nginx對應(yīng)的error日志是111: Connection refused, backlog的值是半連接和全連接的總和呻率,他的存在也有短時間緩沖解耦nginx請求與fpm處理的作用硬毕,半連接指收到了syn請求,3次握手尚未建立礼仗,全連接指的是3次握手已經(jīng)成功吐咳,不過尚未被accpet的請求,fpm里面有調(diào)節(jié)的參數(shù)元践,如果fpm的參數(shù)設(shè)置為-1韭脊,則默認走的是系統(tǒng)內(nèi)核參數(shù)net.core.somaxconn的設(shè)置值,如果不設(shè)置可以在/proc/sys/net/core/somaxconn里查看单旁,默認值是128乾蓬,所以在連接請求較高的業(yè)務(wù)里要增大這個值。

第三種情況慎恒,網(wǎng)絡(luò)卡時任内,客戶端斷開連接,nginx處顯示499融柬,然后php檢查到前端nginx產(chǎn)生abort后死嗦,又master結(jié)束此條任務(wù)的繼而產(chǎn)生502,一般此種情況的報警粒氧,先是499越除,過會兒變成502,再過一會變成504.

減少避免502報錯優(yōu)化建議

502主要從php-fpm的配置方考慮,根據(jù)服務(wù)器情況摘盆,適量增大php-fpm的工作進程數(shù)翼雀,適當(dāng)增加php的執(zhí)行時間,適當(dāng)增加backlog值孩擂。

php的工作進程數(shù)也不是越大越好狼渊,這種進程模型運行時間長了占的內(nèi)存會增大,一般一個php進程是占到30M左右的內(nèi)存类垦,開多少合適自己算吧狈邑,nginx的worker進程一般也能跑到30M的內(nèi)存,綜合計算一下蚤认;php的執(zhí)行時間可以根據(jù)你的服務(wù)標準來設(shè)定米苹,超過服務(wù)時間瀏覽器返回的是502錯誤,這個按照實際的情況處理吧砰琢,反正我是覺得執(zhí)行的慢有返回結(jié)果總比直接返回502錯誤的強蘸嘶;至于backlog值,當(dāng)程序?qū)懙谋容^好時陪汽,建議設(shè)置其數(shù)量為php工作進程的1到2倍训唱。

2、nginx日志里產(chǎn)生504錯誤

第一種情況掩缓,php的worker進程池處理慢雪情,無法盡快處理等待accept的鏈接隊列遵岩,導(dǎo)致3次握手后的鏈接隊列長時間沒有被accept你辣,nginx鏈接等待超時;返回504后nginx對應(yīng)的error日志是110: Connection timed out

第二種情況尘执,后端php-fpm執(zhí)行腳本的時間太長舍哄,超過了nginx配置的超時機制,這個時候也是會報出504錯誤的誊锭。

第三種情況表悬,客戶端的網(wǎng)絡(luò)及其差,php將請求處理完交給nginx后丧靡,nginx沒能在超時時間內(nèi)將內(nèi)容全部吐給用戶蟆沫,這時也會超時,只有504而沒有502温治。

減少避免504報錯的優(yōu)化建議

504主要從nginx的配置方考慮饭庞,根據(jù)業(yè)務(wù)情況配置好超時的各種機制,包含但不限于下屬參數(shù):

fastcgi_connect_timeout

fastcgi_send_timeout

fastcgi_read_timeout

另外:在配置過程中熬荆,比如遇到大并發(fā)或者是特殊業(yè)務(wù)的場景舟山,不合理的fd、buffer等設(shè)置也會帶來5XX錯誤,比如說大并發(fā)連接的業(yè)務(wù)要增大系統(tǒng)和單個程序的fd數(shù)量累盗,如果是上傳業(yè)務(wù)要增大頭buffer等寒矿,這些要視情況而做優(yōu)化,正所謂道法自然若债,術(shù)變?nèi)f千符相,要以不變應(yīng)萬變。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拆座,一起剝皮案震驚了整個濱河市主巍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挪凑,老刑警劉巖孕索,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異躏碳,居然都是意外死亡搞旭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門菇绵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肄渗,“玉大人,你說我怎么就攤上這事咬最◆岬眨” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵永乌,是天一觀的道長惑申。 經(jīng)常有香客問我,道長翅雏,這世上最難降的妖魔是什么圈驼? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮望几,結(jié)果婚禮上绩脆,老公的妹妹穿的比我還像新娘。我一直安慰自己橄抹,他們只是感情好靴迫,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著楼誓,像睡著了一般玉锌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上慌随,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天芬沉,我揣著相機與錄音躺同,去河邊找鬼。 笑死丸逸,一個胖子當(dāng)著我的面吹牛蹋艺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播黄刚,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼捎谨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了憔维?” 一聲冷哼從身側(cè)響起涛救,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎业扒,沒想到半個月后检吆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡程储,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年蹭沛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片章鲤。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡摊灭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出败徊,到底是詐尸還是另有隱情帚呼,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布皱蹦,位于F島的核電站煤杀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏根欧。R本人自食惡果不足惜怜珍,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一端蛆、第九天 我趴在偏房一處隱蔽的房頂上張望凤粗。 院中可真熱鬧,春花似錦今豆、人聲如沸嫌拣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽异逐。三九已至,卻和暖如春插掂,著一層夾襖步出監(jiān)牢的瞬間灰瞻,已是汗流浹背腥例。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留酝润,地道東北人燎竖。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像要销,于是被迫代替她去往敵國和親构回。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 1. Nginx的模塊與工作原理 Nginx由內(nèi)核和模塊組成疏咐,其中纤掸,內(nèi)核的設(shè)計非常微小和簡潔,完成的工作也非常簡單...
    rosekissyou閱讀 10,221評論 5 124
  • Nginx簡介 解決基于進程模型產(chǎn)生的C10K問題,請求時即使無狀態(tài)連接如web服務(wù)都無法達到并發(fā)響應(yīng)量級一萬的現(xiàn)...
    魏鎮(zhèn)坪閱讀 2,007評論 0 9
  • Nginx的工作原理 1.Nginx的模塊與工作原理 Nginx由內(nèi)核和模塊組成浑塞,其中借跪,內(nèi)核的設(shè)計非常微小和簡潔,...
    架構(gòu)飛毛腿閱讀 6,033評論 1 27
  • 《老男孩Linux運維》筆記 隱藏Nginx軟件版本號 一般來說酌壕,軟件的漏洞都和版本有關(guān)垦梆。因此要盡量隱藏對訪問用戶...
    Zhang21閱讀 3,653評論 0 28
  • 在實際的開發(fā)和應(yīng)用中偶發(fā)的502,504讓人頭痛仅孩,下面轉(zhuǎn)發(fā)一個寫的比較全面的托猩。 PHP-fpm PHP-FPM是一...
    daos閱讀 2,358評論 2 18