Nginx
使用 fastcgi_finish_request() 時,Nginx 在每個頁面上間歇性地拋出 502
我最近在 AWS 中繼承了對 2 個 Nginx 機器的管理,並且非常不熟悉 PHP-FPM 的工作原理(並且不起作用)。我最近集成了 Keen.IO 用於後端使用者日誌記錄,使用:
fastcgi_finish_request();
在 php 中完成請求,然後繼續登錄到 Keen。這似乎工作得很好,除了一些更高的延遲,我認為使用者沒有經歷,因為他們已經斷開連接。
然而今天,隨著流量的增加,我們開始收到 502 網關錯誤,並且兩台伺服器都有以下錯誤:
[error] 2356#0: *70245 upstream sent unexpected FastCGI record: 3 while reading response header from upstream, client: (ADDRESS), server: igun-api-slaves.crimson-moon.com, request: "GET (Address)", upstream: "fastcgi://unix:/var/run/php-fpm/product1.socket:", host: "ADDRESS"
這發生在我們所有的頁面上,而不僅僅是我通過日誌修改的頁面。我完全迷失了,因為這對我來說是全新的。這個錯誤到底是什麼意思?
- 編輯
我現在在 AWS cloud watch 中看到,自從程式碼被編輯後,錯誤就一直在出現,而不僅僅是在流量建立時。
此錯誤似乎是由 PHP 中的錯誤引起的,該錯誤無法正確處理 fastcgi_finish_request()
https://bugs.php.net/bug.php?id=67583
這可以通過在 Ngynx 設置中關閉 fastcgi_keep_conn 來解決,直到修補。
日誌消息意味著 PHP-FPM 正在發送一個 nginx 不理解的記錄類型 ID。事實證明,正如您可能已經猜到的那樣,記錄類型 3 對應於 FCGI_END_REQUEST。因此,似乎 nginx 的 FCGI 支持是不完整的,因為它不能辨識和正確處理這種記錄類型。
我建議要麼打開你的編輯器並修補 nginx,要麼停止呼叫
fastcgi_finish_request()
,並找出其他方法來實現你想做的事情。