青草久久影院-青草久久伊人-青草久久久-青草久久精品亚洲综合专区-SM双性精跪趴灌憋尿调教H-SM脚奴调教丨踩踏贱奴

17站長(zhǎng)網(wǎng)

深入分析nginx+php-fpm服務(wù)HTTP狀態(tài)碼502

2022-10-12 13:54| 查看: 1378 |來源: 互聯(lián)網(wǎng)

我們的一個(gè)web項(xiàng)目,由于新上城市增多,導(dǎo)致訪問量增大,DB壓力增大,作為提供接口的業(yè)務(wù)方,最近被下游反饋大量請(qǐng)求“502”。 502,bad gateway,一般都是upstream(這里就是php)出錯(cuò),對(duì)于php,造成502的原因常

我們的一個(gè)web項(xiàng)目,由于新上城市增多,導(dǎo)致訪問量增大,DB壓力增大,作為提供接口的業(yè)務(wù)方,最近被下游反饋大量請(qǐng)求“502”。

502,bad gateway,一般都是upstream(這里就是php)出錯(cuò),對(duì)于php,造成502的原因常見的就是腳本執(zhí)行超過timeout設(shè)置時(shí)間,或者timeout設(shè)置過大,導(dǎo)致php進(jìn)程長(zhǎng)時(shí)間不能被釋放,沒有空閑worker進(jìn)程來接客。

我們的項(xiàng)目就是php執(zhí)行時(shí)間設(shè)置過短導(dǎo)致的,對(duì)于這種情況,可以先適當(dāng)增大php的執(zhí)行時(shí)間,先保證清除502,優(yōu)化的事情畢竟要花更多的時(shí)間。

控制php執(zhí)行時(shí)間的選項(xiàng)有兩個(gè),在php.ini中 max_execution_time 和php-fpm中 request_terminate_timeout,其中 request_terminate_timeout 可以覆蓋 max_execution_time,所以如果不想改全局的php.ini,那只改php-fpm的配置就可以了。

下邊我就來詳細(xì)的分析一下為什么php腳本執(zhí)行超出設(shè)置時(shí)間會(huì)導(dǎo)致nginx返回502。

先來布景,讓問題復(fù)現(xiàn):

nginx和php分別只啟動(dòng)一個(gè)worker,方便追蹤。

php-fpm的request_terminate_timeout設(shè)置為3S。

測(cè)試腳本test.php

sleep(20); echo 'ok';

go go go:

在瀏覽器訪問www.v.com/test.php,3S后如期出現(xiàn)...404???what???

出師不利啊,趕緊看看nginx的配置文件

這個(gè)location配置是當(dāng)發(fā)生5xx錯(cuò)誤時(shí)跳轉(zhuǎn)到一個(gè)好看點(diǎn)的界面,但是我在/usr/share/nginx/html下并沒有50x.html這個(gè)文件。所以搞了個(gè)404出來。這不是很影響我判斷問題的準(zhǔn)確性?直接注釋掉!再次訪問,等待3S,終于'正常'的界面出來了。

環(huán)境好了,下邊就上套路,按照web問題的排查套路走一遍,先看看錯(cuò)誤日志吧:

nginx:

報(bào)錯(cuò)都是 recv() failed (104: Connection reset by peer。

recv時(shí)失敗了,連接被重置了。為啥連接被重置了?難道一言不合。

我們?cè)诳纯磒hp-fpm的錯(cuò)誤日志:

(注意php-fpm中php_admin_value[error_log]選項(xiàng)指定php的錯(cuò)誤日志,會(huì)覆蓋php.ini中的。但是這里不是看php的錯(cuò)誤,而是看php-fpm的錯(cuò)誤。php-fpm的錯(cuò)誤日志由php-fpm.conf中的error_log選項(xiàng)指定。)

每一次請(qǐng)求都是產(chǎn)生2個(gè)WARNING和1個(gè)NOTICE:

WARNING:腳本執(zhí)行超時(shí)了,終止了。

WARNING:子進(jìn)程收到SIGTERM信號(hào)退出了。

NOTICE:?jiǎn)⒘艘粋(gè)新的子進(jìn)程(因?yàn)槲以O(shè)置的pm.min_spare_servers = 1)

看來如果php的worker進(jìn)程執(zhí)行超時(shí),不僅終止腳本執(zhí)行,而且worker進(jìn)程也會(huì)退出。看來nginx的報(bào)錯(cuò)連接被重置是因?yàn)閜hp的worker進(jìn)程退出了(在TCP連接中一方如果斷掉的話會(huì)發(fā)送RST給另一方)

通過日志已經(jīng)可以知道php腳本執(zhí)行超時(shí),worker子進(jìn)程退出,導(dǎo)致nginx報(bào)錯(cuò)Connection reset by peer,下邊我們通過strace來看看php和nginx的情況:

php:

1.accept一個(gè)nginx的連接請(qǐng)求(socket,bind,listen都在master中完成 ),可以看到nginx的端口是47039,從FD0中讀取數(shù)據(jù),就是從標(biāo)準(zhǔn)輸入中,這個(gè)是fast-cgi協(xié)議規(guī)定的。accept之后的已連接描述符是3。

2.從FD3中讀取nginx傳遞過來的數(shù)據(jù),fastcgi協(xié)議格式,接收了856字節(jié)。為什么read5次呢?

因?yàn)閒astcgi協(xié)議數(shù)據(jù)包是8字節(jié)對(duì)齊,由包頭和包體組成。并且都是會(huì)先發(fā)一個(gè)request數(shù)據(jù)包,包含一些請(qǐng)求ID,版本,typpe等信息(包頭包體各占8字節(jié)),再發(fā)一個(gè)params數(shù)據(jù)包,傳遞get參數(shù)和環(huán)境變量(包頭8字節(jié),包體變長(zhǎng)),最后發(fā)送一個(gè)沒有包體只有包頭的params數(shù)據(jù)包,表示參數(shù)發(fā)送結(jié)束(包頭8字節(jié))。所以前3個(gè)read用來讀出request包的包頭和包體,還有params包的包頭,第四個(gè)read是讀取真正的數(shù)據(jù),最后一個(gè)read是讀取最后一個(gè)params包的包頭。所以nginx傳遞的數(shù)據(jù)應(yīng)該是8+8+8+856+8=896字節(jié)(和下邊nginx的傳輸bytes能對(duì)應(yīng)上)。注意如果是post方式,還會(huì)發(fā)送stdin數(shù)據(jù)包。

3.設(shè)置休眠20S,就是php程序中的sleep(20),之后由于進(jìn)程被終止了,所以后邊就沒啦。strace程序也退出啦。

nginx:

1.accept到瀏覽器的請(qǐng)求,可以看到瀏覽器端的端口是56434,IP是192.168.1.105,已建立連接的FD是3。

2.從FD3中接收數(shù)據(jù),HTTP協(xié)議。

3.創(chuàng)建一個(gè)socket,F(xiàn)D21,用于和php建立連接。

4.連接到FD21,可以看到連接的是本機(jī)的9000端口,這里nginx和php-fpm使用IP socket連接方式,nginx和php-fpm部署在一臺(tái)機(jī)器上可以考慮unix domain socket。

5.向FD21寫入數(shù)據(jù),fast-cgi協(xié)議格式,我們看到寫入的長(zhǎng)度是896,和上邊的php接收的長(zhǎng)度是對(duì)應(yīng)的。

6.recvfrom函數(shù)從FD21中返回 ECONNRESET (Connection reset by peer)

7.向FD9中寫入錯(cuò)誤信息,可以推斷FD9就是nginx錯(cuò)誤日志的文件描述符。

8.關(guān)閉和FD21的連接。

9.向FD3寫入502 Bad Gateway,就是返回給瀏覽器的信息。

10.向FD8寫入一條訪問日志,可以推斷FD8就是nginx訪問日志的文件描述符。

來驗(yàn)證一下nginx訪問日志和錯(cuò)誤日志的推斷。可以看到的確是FD8,F(xiàn)D9,并處于寫入模式。

那么在這個(gè)過程中整個(gè)網(wǎng)絡(luò)包的傳輸我們不妨也看一下:

通過tcpdump抓包,用神器看比較方便。

因?yàn)橹幌肟磏ginx和php的通訊,在上邊又知道nginx的端口是47039,可以通過tcp.srcport==47039過濾出對(duì)應(yīng)的包。

可以看到nginx和php-fpm數(shù)據(jù)交互的過程:47039->9000建立三次握手,接著向9000發(fā)送數(shù)據(jù),9000回復(fù)ACK,3S后9000回復(fù)RST。沒毛病。

注意:

SYN,F(xiàn)IN各占一個(gè)序列號(hào)

ACK,RST不占序列號(hào)(28,29兩個(gè)包的reqnum和acknum都是相同的)

序列號(hào)是每一字節(jié)加1(29包發(fā)送896字節(jié),同時(shí)29包seq為4219146879,30包的ack為4219147775,正好相差896)

RST不需要回復(fù)。

以上所述是小編給大家介紹的深入分析nginx+php-fpm服務(wù)HTTP狀態(tài)碼502,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)17站長(zhǎng)網(wǎng)的支持!

本文最后更新于 2022-10-12 13:54,某些文章具有時(shí)效性,若有錯(cuò)誤或已失效,請(qǐng)?jiān)诰W(wǎng)站留言或聯(lián)系站長(zhǎng):17tui@17tui.com
·END·
站長(zhǎng)網(wǎng)微信號(hào):w17tui,關(guān)注站長(zhǎng)、創(chuàng)業(yè)、關(guān)注互聯(lián)網(wǎng)人 - 互聯(lián)網(wǎng)創(chuàng)業(yè)者營(yíng)銷服務(wù)中心

免責(zé)聲明:本站部分文章和圖片均來自用戶投稿和網(wǎng)絡(luò)收集,旨在傳播知識(shí),文章和圖片版權(quán)歸原作者及原出處所有,僅供學(xué)習(xí)與參考,請(qǐng)勿用于商業(yè)用途,如果損害了您的權(quán)利,請(qǐng)聯(lián)系我們及時(shí)修正或刪除。謝謝!

17站長(zhǎng)網(wǎng)微信二維碼

始終以前瞻性的眼光聚焦站長(zhǎng)、創(chuàng)業(yè)、互聯(lián)網(wǎng)等領(lǐng)域,為您提供最新最全的互聯(lián)網(wǎng)資訊,幫助站長(zhǎng)轉(zhuǎn)型升級(jí),為互聯(lián)網(wǎng)創(chuàng)業(yè)者提供更加優(yōu)質(zhì)的創(chuàng)業(yè)信息和品牌營(yíng)銷服務(wù),與站長(zhǎng)一起進(jìn)步!讓互聯(lián)網(wǎng)創(chuàng)業(yè)者不再孤獨(dú)!

掃一掃,關(guān)注站長(zhǎng)網(wǎng)微信

大家都在看

熱門排行

    最近更新

      返回頂部
      主站蜘蛛池模板: 日韩内射美女人妻一区二区三区 | 99在线免费| 欧美v1deossexo高清 | 亚洲国产精品第一影院在线观看 | 国内精品伊人久久久久 | 成人国产在线看不卡 | 色www永久免费 | 国际老妇高清在线观看 | 2019午夜福利757视频第12集 | 久久婷婷五月综合色情 | 国产精品久久久久a影院 | 乌克兰14一18处交见血 | 国产精品99久久久精品无码 | 2012中文字幕手机在线 | 中文无码熟妇人妻AV在线 | 丰满少妇69激懒啪啪无码 | 花蝴蝶高清在线视频免费观看 | 久久久无码AV精品亚洲A片软件 | 国产精品亚洲国产三区 | 国产成人无码精品久久久影院 | 无码成人AAAAA毛片含羞草 | 九九夜夜妹子 | a级销魂美女 | 欧美精品色视频 | 午夜DJ国产精华日本无码 | 国产欧美一区二区三区免费 | 亚洲精品久久久久69影院 | 一个人免费视频在线观看高清版 | 精品一卡2卡三卡4卡乱码精品视频 | 久久机热免费视频 | 欧美精品成人一区二区在线观看 | 蜜桃传媒在线观看 | 91麻豆久久| 善良的女房东味道2在线观看 | 国产高清免费视频免费观看 | 99久久国产露脸精品国产麻豆 | 久久五月综合婷婷中文云霸高清 | 粗好大用力好深快点漫画 | 热九九99香蕉精品品 | 国产区免费在线观看 | 亚洲欧美一级久久精品 |