PHP-FPM與Nginx通信報 502 Bad Gateway或504 Gateway Timeout終極解決方案(適用於PHP執行耗時任務情況下的報錯)

来源:https://www.cnblogs.com/phpphp/archive/2023/10/12/17759429.html
-Advertisement-
Play Games

前置條件: 適用於常規請求都沒問題,但是執行某些php腳本需要超過一分鐘的情況下的502/504,並不是任何請求都502/504的情況(這說明php-fpm或者nginx配置錯誤)。 出現502/504的原因 502 執行腳本時間太長,期間php沒有返回任何的數據。php-fpm超時,nginx沒超 ...


前置條件:

適用於常規請求都沒問題,但是執行某些php腳本需要超過一分鐘的情況下的502/504,並不是任何請求都502/504的情況(這說明php-fpm或者nginx配置錯誤)。

出現502/504的原因

502

執行腳本時間太長,期間php沒有返回任何的數據。php-fpm超時,nginx沒超時。nginx認為php-fpm罷工了,然後拋出了異常。

504

執行腳本時間太長,期間php沒有返回任何的數據。php-fpm沒超時,nginx超時。nginx認為php-fpm響應太慢,nginx沒憋住拋出了異常。

不生效的解決方案(防止各位師傅踩坑):

代碼

set_time_limit(0);
ignore_user_abort(true);
ini_set('max_execution_time', 600);

不生效原理剖析

以上代碼的作用設置了php代碼本身可以更長的時間處理任務並且不報致命錯誤,但不代表程式一定無限制的可以執行這麼久。因為Nginx與PHP進程通信方式是檢測到.php的文件交給php-fpm進程處理,php-fpm是一個fastcgi進程管理器,php-fpm一旦超時,php-fpm會強制終結掉這個進程,這就是報502的原因。
這段代碼又無法控制nginx fastcgi的一些機制,所以報504的原因。
意味著僅代碼層配置還不夠,伺服器也得配置。

官方文檔對這2個函數和1個配置的解釋:

##### set_time_limit:
Set the number of seconds a script is allowed to run. If this is reached, the script returns a fatal error. The default limit is 30 seconds or, if it exists, the max_execution_time value defined in the php.ini.

##### ignore_user_abort:
Set whether a client disconnect should abort script execution.When running PHP as a command line script, and the script's tty goes away without the script being terminated then the script will die the next time it tries to write anything, unless enable is set to true.

##### max_execution_time:
This sets the maximum time in seconds a script is allowed to run before it is terminated by the parser. This helps prevent poorly written scripts from tying up the server. The default setting is 30. When running PHP from the command line the default setting is 0.
On non Windows systems, the maximum execution time is not affected by system calls, stream operations etc. Please see the set_time_limit() function for more details.
**Your web server can have other timeout configurations that may also interrupt PHP execution..Apache has a Timeout directive and IIS has a CGI timeout function. Both default to 300 seconds. See your web server documentation for specific details.**
加粗字體意思是說:Web 伺服器可以有其它超時配置,這些配置也可能會中斷 PHP 執行。Apache 有一個 Timeout 指令,IIS 有一個 CGI 超時功能。 兩者都預設為 300 秒。(nginx也有一個fastcgi超時配置,預設60秒)。

502解決方案

再php-fpm.conf中添加request_terminate_timeout = 600即可,如下:

#編輯php-fpm配置
vim /usr/local/php/etc/php-fpm.conf
#添加此配置,單位預設為秒,多少秒請根據情況自行設定
request_terminate_timeout = 600
#保存後重啟
service php-fpm restart

504解決方案

再nginx配置中添加 fastcgi_connect_timeout 600; fastcgi_read_timeout 600; fastcgi_send_timeout 600; 即可,如下:

#編輯nginx某個站點的配置
vim /usr/local/nginx/conf/vhost/test.conf
#再location中添加以下配置,單位預設為秒,多少秒請根據情況自行設定,完整代碼塊如下:
location ~ \.php$ {
	fastcgi_pass   127.0.0.1:9000;
	fastcgi_index  index.php;
	fastcgi_param  SCRIPT_FILENAME $document_root/$fastcgi_script_name; 
	include        /usr/local/nginx/conf/fastcgi_params;
	fastcgi_connect_timeout 600; 
	fastcgi_read_timeout 600; 
	fastcgi_send_timeout 600; 
}

#保存後測試配置是否有問題,如果有問題,請修改好後再次嘗試。
../../sbin/nginx -t
#確認配置正常,重啟
service nginx restart

配置含義官方說明:

PHP-FPM:
request_terminate_timeout
The timeout for serving a single request after which the worker process will be killed. This option should be used when the 'max_execution_time' ini option does not stop script execution for some reason. A value of '0' means 'Off'. Available units: s(econds)(default), m(inutes), h(ours), or d(ays). Default value: 0.


Nginx:
fastcgi_connect_timeout 60s;
Defines a timeout for establishing a connection with a FastCGI server. It should be noted that this timeout cannot usually exceed 75 seconds.

fastcgi_read_timeout 60s;
Defines a timeout for reading a response from the FastCGI server. The timeout is set only between two successive read operations, not for the transmission of the whole response. If the FastCGI server does not transmit anything within this time, the connection is closed.

fastcgi_send_timeout 60s;
Sets a timeout for transmitting a request to the FastCGI server. The timeout is set only between two successive write operations, not for the transmission of the whole request. If the FastCGI server does not receive anything within this time, the connection is closed.

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近很多小伙伴說,不會用瀏覽器開發者工具,今天我們就一起來深入瞭解一下開發者工具。 以谷歌瀏覽器為例 谷歌瀏覽器開發者工具中的Network 是我們學習經常用到的,那麼你都知道他們每個功能的意義嗎? 因本人經常有360極速瀏覽器,谷歌內核,所以本文以360極速瀏覽器的開發者工具Network為例,基 ...
  • 本方法適用於Linux環境下: 1.安裝庫Cython pip3 install Cython==3.0.0a10 2.編寫待加密文件:hello.py import random def ac(): i = random.randint(0, 5) if i > 2: print('success ...
  • 在Redis和MySQL的實際應用過程中,如何保證Redis和MySQL雙寫時的數據一致性問題成為了開發者們面臨的重要挑戰 ...
  • 本文已收錄至GitHub,推薦閱讀 👉 Java隨想錄 微信公眾號:Java隨想錄 原創不易,註重版權。轉載請註明原作者和原文鏈接 目錄Pipeline介紹原生批命令(MSET, MGET) VS PipelinePipeline的優缺點一些疑問Pipeline代碼實現 當我們談論Redis數據處 ...
  • 基於java醫院管理系統設計與實現,可適用於醫院信息管理系統,醫院掛號系統,醫院醫生排班系統,醫院患者管理系統,醫院醫生預約系統,醫院預約系統,醫院藥物信息系統,醫院預約掛號系統,醫療管理系統,醫療系統等等; ...
  • 除了Vue 3這個庫,還需Vue 3 最新全家桶。 1 環境準備 之前語法演示直接使用script引入Vue 3,從而在瀏覽器里實現所有調試功能。但實際項目中,使用專門調試工具。在項目上線之前,代碼也需打包壓縮,並考慮到研發效率和代碼可維護性,所以在下麵,需建立一個工程化項目實現這些功能。 工具 V ...
  • 出於安全的考慮,瀏覽器會禁止 Ajax 訪問不同域的地址,在現如今微服務橫行的年代,跨域訪問是非常常見的。W3C 的 CORS (Cross-origin-resource-sharing) 規範中也已經允許跨域訪問, 並被主流瀏覽器所支持,它們包括: Chrome 3+; Firefox 3.5+ ...
  • 分散式架構的演進 在軟體行業,一個應用服務隨著功能越來越複雜,用戶量越來越大,尤其是互聯網行業流量爆髮式的增長,導致我們需要不斷的重構應用的結構來支撐龐大的用戶量,最終從一個簡單的系統主鍵演變成了一個非常複雜的可以支撐高併發的高可用的分散式架構,但是一個系統再複雜也是不斷演變來的,所以從另一方面來說 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...