91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

nginx+php-fpm服務HTTP狀態碼502怎么解決

發布時間:2022-06-02 11:37:05 來源:億速云 閱讀:242 作者:iii 欄目:大數據

這篇文章主要介紹“nginx+php-fpm服務HTTP狀態碼502怎么解決”,在日常操作中,相信很多人在nginx+php-fpm服務HTTP狀態碼502怎么解決問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”nginx+php-fpm服務HTTP狀態碼502怎么解決”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

我們的一個web項目,由于新上城市增多,導致訪問量增大,db壓力增大,作為提供接口的業務方,最近被下游反饋大量請求“502”。

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

我們的項目就是php執行時間設置過短導致的,對于這種情況,可以先適當增大php的執行時間,先保證清除502,優化的事情畢竟要花更多的時間。

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

下邊我就來詳細的分析一下為什么php腳本執行超出設置時間會導致nginx返回502。

先來布景,讓問題復現:

nginx和php分別只啟動一個worker,方便追蹤。

php-fpm的request_terminate_timeout設置為3s。

測試腳本test.php

sleep(20);
echo 'ok';

go go go:

在瀏覽器訪問www.v.com/test.php,3s后如期出現...404???what???

nginx+php-fpm服務HTTP狀態碼502怎么解決

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

nginx+php-fpm服務HTTP狀態碼502怎么解決

這個location配置是當發生5xx錯誤時跳轉到一個好看點的界面,但是我在/usr/share/nginx/html下并沒有50x.html這個文件。所以搞了個404出來。這不是很影響我判斷問題的準確性?直接注釋掉!再次訪問,等待3s,終于'正常'的界面出來了。

nginx+php-fpm服務HTTP狀態碼502怎么解決

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

nginx:

nginx+php-fpm服務HTTP狀態碼502怎么解決

報錯都是 recv() failed (104: connection reset by peer。

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

我們在看看php-fpm的錯誤日志:

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

nginx+php-fpm服務HTTP狀態碼502怎么解決

每一次請求都是產生2個warning和1個notice:

warning:腳本執行超時了,終止了。

warning:子進程收到sigterm信號退出了。

notice:啟了一個新的子進程(因為我設置的pm.min_spare_servers = 1)

看來如果php的worker進程執行超時,不僅終止腳本執行,而且worker進程也會退出。看來nginx的報錯連接被重置是因為php的worker進程退出了(在tcp連接中一方如果斷掉的話會發送rst給另一方)

通過日志已經可以知道php腳本執行超時,worker子進程退出,導致nginx報錯connection reset by peer,下邊我們通過strace來看看php和nginx的情況:

php:

nginx+php-fpm服務HTTP狀態碼502怎么解決

1.accept一個nginx的連接請求(socket,bind,listen都在master中完成 ),可以看到nginx的端口是47039,從fd0中讀取數據,就是從標準輸入中,這個是fast-cgi協議規定的。accept之后的已連接描述符是3。

2.從fd3中讀取nginx傳遞過來的數據,fastcgi協議格式,接收了856字節。為什么read5次呢?

因為fastcgi協議數據包是8字節對齊,由包頭和包體組成。并且都是會先發一個request數據包,包含一些請求id,版本,typpe等信息(包頭包體各占8字節),再發一個params數據包,傳遞get參數和環境變量(包頭8字節,包體變長),最后發送一個沒有包體只有包頭的params數據包,表示參數發送結束(包頭8字節)。所以前3個read用來讀出request包的包頭和包體,還有params包的包頭,第四個read是讀取真正的數據,最后一個read是讀取最后一個params包的包頭。所以nginx傳遞的數據應該是8+8+8+856+8=896字節(和下邊nginx的傳輸bytes能對應上)。注意如果是post方式,還會發送stdin數據包。

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

nginx:

nginx+php-fpm服務HTTP狀態碼502怎么解決

1.accept到瀏覽器的請求,可以看到瀏覽器端的端口是56434,ip是192.168.1.105,已建立連接的fd是3。

2.從fd3中接收數據,http協議。

3.創建一個socket,fd21,用于和php建立連接。

4.連接到fd21,可以看到連接的是本機的9000端口,這里nginx和php-fpm使用ip socket連接方式,nginx和php-fpm部署在一臺機器上可以考慮unix domain socket。

5.向fd21寫入數據,fast-cgi協議格式,我們看到寫入的長度是896,和上邊的php接收的長度是對應的。

6.recvfrom函數從fd21中返回 econnreset (connection reset by peer)

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

8.關閉和fd21的連接。

9.向fd3寫入502 bad gateway,就是返回給瀏覽器的信息。

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

來驗證一下nginx訪問日志和錯誤日志的推斷。可以看到的確是fd8,fd9,并處于寫入模式。

nginx+php-fpm服務HTTP狀態碼502怎么解決

那么在這個過程中整個網絡包的傳輸我們不妨也看一下:

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

因為只想看nginx和php的通訊,在上邊又知道nginx的端口是47039,可以通過tcp.srcport==47039過濾出對應的包。

nginx+php-fpm服務HTTP狀態碼502怎么解決

可以看到nginx和php-fpm數據交互的過程:47039->9000建立三次握手,接著向9000發送數據,9000回復ack,3s后9000回復rst。沒毛病。

注意:

syn,fin各占一個序列號

ack,rst不占序列號(28,29兩個包的reqnum和acknum都是相同的)

序列號是每一字節加1(29包發送896字節,同時29包seq為4219146879,30包的ack為4219147775,正好相差896)

rst不需要回復。

到此,關于“nginx+php-fpm服務HTTP狀態碼502怎么解決”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

光山县| 兰溪市| 东辽县| 资阳市| 时尚| 石城县| 合山市| 全州县| 定陶县| 宜良县| 施甸县| 清远市| 利津县| 文化| 眉山市| 固镇县| 阆中市| 集贤县| 南投市| 兖州市| 弋阳县| 柯坪县| 玉屏| 渭南市| 聂荣县| 大悟县| 克东县| 泽库县| 万源市| 宜良县| 岱山县| 堆龙德庆县| 资溪县| 潞城市| 商洛市| 鸡东县| 芒康县| 外汇| 乐亭县| 邵东县| 平塘县|