欧美日操-欧美日韩91-欧美日韩99-欧美日韩ay在线观看-xxxx色-xxxx视频在线

WebService之nginx+(php-fpm)結(jié)構(gòu)模型剖析及優(yōu)化

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

 

一、nginxphp-fpm的關(guān)系和分工


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

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

 

wKioL1fOU-fiLC8nAAEc-FGrRjo932.png

(圖 1)

 

1、nginx的工作簡介(對應(yīng)圖1看)
    在接到php的腳本請求后,nginx通過fastcgi_pass指令將請求傳遞給后端php-fpmworker進(jìn)程處理,在此過程中,nginx做了各種超時機(jī)制、緩存機(jī)制、buffer機(jī)制和長連接機(jī)制等來保障與后端的php-fpm能夠良性高效的合作。
    在超時機(jī)制方面控制nginx對后端php的等待時間,通過各種timeout指令進(jìn)行控制,例如:

    fastcgi_connect_timeout   后端鏈接時間

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

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

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

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

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

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

 

2、php-fpm工作介紹(對應(yīng)圖1看)
    Php-fpm是一個PHPfastcgi進(jìn)程管理器,在啟動后會有masterworker兩種進(jìn)程,master負(fù)責(zé)接收外部信號和管理worker進(jìn)程,worker進(jìn)程是負(fù)責(zé)干活的,處理nginx傳過來的任務(wù)。    
    master進(jìn)程只有一個,負(fù)責(zé)監(jiān)聽端口和管理worker進(jìn)程,每次傳來任務(wù),與前端的nginx建立3次握手后放入連接隊列,供worker進(jìn)程進(jìn)行accept,當(dāng)worker進(jìn)程出現(xiàn)錯誤或執(zhí)行超時時,負(fù)責(zé)將worker進(jìn)程重啟或者殺掉,是php-fpm模型中的大內(nèi)總管。
    Worker進(jìn)程是工作進(jìn)程,每個worker進(jìn)程都獨立的執(zhí)行php程序腳本,然后把執(zhí)行的結(jié)果通過fastcgi協(xié)議交給nginx,執(zhí)行過程中受master的管理。在工作中,worker進(jìn)程去競爭accept管理進(jìn)程master的鏈接隊列,accept函數(shù)將從連接請求隊列中獲得連接信息,創(chuàng)建新的socket,并返回該套接字的fd,新創(chuàng)建的socket用于服務(wù)器與nginx的通信,而原來的套接字仍然處于監(jiān)聽狀態(tài)。
    php-fpm可以配置多個pool,所有poolmaster統(tǒng)一管理監(jiān)聽不同端口并分配不同worker進(jìn)程池,worker進(jìn)程池支持動態(tài)prefork同時也支持靜態(tài)開啟,服務(wù)器內(nèi)存較大時建議直接計算后配置靜態(tài)資源池,可以減少頻繁prefork進(jìn)程所帶來的開銷,提高服務(wù)質(zhì)量,由于進(jìn)程模型越跑程序耗費越大,因為每個worker進(jìn)程可以配置執(zhí)行多少個請求后進(jìn)行重啟,對應(yīng)的池子的指令和執(zhí)行多少個請求的指令如下:

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

    pm.max_children = 256  開啟的最大php進(jìn)程數(shù)

    pm.max_requests = 1024   在執(zhí)行了1024個請求后重啟worker進(jìn)程
 這也是我們線上服務(wù)器的配置,我們線上用的web服務(wù)的機(jī)器是12cpu、12G內(nèi)存,nginx開啟12worker進(jìn)程,php開啟256個進(jìn)程,跑起來后每個進(jìn)程大概占用30M內(nèi)存,也就是(256+12*30=8G ,另外還跑了一些配管、監(jiān)控、統(tǒng)計、日志收集等七七八八的軟件,整體業(yè)務(wù)是比較輕松的,這種靜態(tài)池的配置大大減少了prefork進(jìn)程帶來的開銷,RT時間100ms以內(nèi)的占到90%以上(這個與程序?qū)懙娜绾斡嘘P(guān)),運行一段時間后的開銷截圖如下:

 

wKiom1fOVyGwRrByAAB0HEoKVdw112.png

 

 

二、此模型結(jié)構(gòu)常見的5XX服務(wù)器端錯誤及優(yōu)化(對應(yīng)圖1看)

 

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

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

    php.ini中默認(rèn)30smax_execution_time =

    php-fpm中:request_terminate_timeout =

    第二種情況,連接請求數(shù)(accpet之前)超出了端口所能監(jiān)聽的tcp連接的最大值(backlog的值),進(jìn)不了fpm等待accept的鏈接隊列,直接返回502,這里可能會產(chǎn)生tcp重傳;

返回502nginx對應(yīng)的error日志是111: Connection refused

    backlog的值是半連接和全連接的總和,他的存在也有短時間緩沖解耦nginx請求與fpm處理的作用,半連接指收到了syn請求,3次握手尚未建立,全連接指的是3次握手已經(jīng)成功,不過尚未被accpet的請求,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,所以在連接請求較高的業(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的工作進(jìn)程數(shù),適當(dāng)增加php的執(zhí)行時間,適當(dāng)增加backlog。
    php的工作進(jìn)程數(shù)也不是越大越好,這種進(jìn)程模型運行時間長了占的內(nèi)存會增大,一般一個php進(jìn)程是占到30M左右的內(nèi)存,開多少合適自己算吧,nginxworker進(jìn)程一般也能跑到30M的內(nèi)存,綜合計算一下;php的執(zhí)行時間可以根據(jù)你的服務(wù)標(biāo)準(zhǔn)來設(shè)定,超過服務(wù)時間瀏覽器返回的是502錯誤,這個按照實際的情況處理吧,一般情況要設(shè)置超時時間,避免某些請求慢,將整個業(yè)務(wù)堵死;至于backlog值,當(dāng)程序?qū)懙谋容^好時,建議設(shè)置其數(shù)量為php工作進(jìn)程的12倍。

 

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

    第一種情況,phpworker進(jìn)程池處理慢,無法盡快處理等待accept的鏈接隊列,導(dǎo)致3次握手后的鏈接隊列長時間沒有被accept,nginx鏈接等待超時;

返回504nginx對應(yīng)的error日志是110: Connection timed out

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

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

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

     

    504主要從nginx的配置方考慮,根據(jù)業(yè)務(wù)情況配置好超時的各種機(jī)制,包含但不限于下屬參數(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)萬變。

大云網(wǎng)官方微信售電那點事兒

責(zé)任編輯:售電衡衡

免責(zé)聲明:本文僅代表作者個人觀點,與本站無關(guān)。其原創(chuàng)性以及文中陳述文字和內(nèi)容未經(jīng)本站證實,對本文以及其中全部或者部分內(nèi)容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,并請自行核實相關(guān)內(nèi)容。
我要收藏
個贊
?
主站蜘蛛池模板: 欧美一级片免费在线观看| 欧美激情在线播放第16页 | 日韩污视频在线观看| 午夜欧美日韩在线视频播放| 四川一级毛片| 亚洲观看视频| 亚洲精品午夜国产va久久| 亚洲国产精品高清在线一区| 天天更新天天久久久更新影院| 亚洲精品综合在线| 人人上人人干| 亚洲视频播放| 欧美在线aa| 亚洲国产成人久久精品动漫| 三极片免费| 亚洲a在线播放| 热久久精品免费视频| 亚洲美女黄视频| 午夜网站在线| 天天色国产| 色综合视频| 欧美日韩亚洲综合久久久| 香蕉久热| 欧美精品人爱c欧美精品| 欧美成人专区| 亚洲天天更新| 日本国产在线视频| 欧美日韩国产免费一区二区三区| 欧美久久一区二区三区| 青青青国产| 天天亚洲综合| 午夜视频在线观看一区| 热99精品只有里视频最新| 日韩成人高清| 青草青草伊人精品视频| 日本a级特黄三级三级三级| 亚洲精品自在在线观看| 闲人综合网| 日韩黄色网| 日本高清观看视频| 婷婷亚洲综合一区二区|