2009-11-14 126 views
16

我使用nginx以及fastcgi。我看到很多錯誤以下錯誤的記錄nginx錯誤readv()和recv()失敗

readv() failed (104: Connection reset by peer) while reading upstream and recv() failed (104: Connection reset by peer) while reading response header from upstream

我不使用的應用程序看不出什麼問題。這些錯誤是嚴重的還是如何擺脫它們。

回答

10

我在後臺使用php-fpm,並且緩慢的腳本在所述超時後被殺死,因爲它是以這種方式配置的。因此,當連接從php-fpm引擎/進程關閉時,花費比指定時間更長的腳本會被殺死,並且nginx會報告recv或readv錯誤。

+1

您是否曾經找到一種方法來實際獲取PHP錯誤日誌或消息? – Bretticus 2011-04-18 20:48:03

+0

是的php-fpm-慢日誌。要啓用這個日誌,你應該配置php-fpm.conf – rampr 2011-04-19 05:53:24

2

這是一個非常模糊的錯誤,因爲它可能意味着一些事情。關鍵是要查看所有可能的日誌並弄清楚。 在我的情況下,這可能有點獨特,我有一個工作的nginx + php/fastcgi配置。我想用PHP-FPM編譯一個新的PHP更新版本,我這樣做了。原因是我正在一個無法承受停機時間的現場服務器上工作。所以我必須儘可能無縫升級並轉向PHP-FPM。

因此我有2個PHP實例。

  • 1的fastcgi直接對話(PHP 5.3.4) - 使用TCP/127.0.0.1:9000(PHP 5.3.4)
  • 1配置有PHP-FPM - 使用Unix套接字 - UNIX:/ DIR /到/插座FPM (PHP 5.3.8)

一旦我使用套接字連接,而不是TCP我開始對這個上行錯誤上的虛擬主機nginx的啓動PHP-FPM(PHP 5.3.8)無論是否使用FPM,任何fastcgi頁面都會花費超過x分鐘。通常情況下,這是頁面在MySQL中執行大型SELECTS,花費大約2分鐘才能加載。不好,我知道,但這是因爲後端數據庫設計。

我做了什麼來解決它是在我的虛擬主機配置中添加: fastcgi_read_timeout 5m; 現在可以在nginx全局fastcgi設置中添加它。這取決於你的設置。 http://wiki.nginx.org/HttpFcgiModule

1

答案#2。 有趣的是fastcgi_read_timeout 5m;爲我修復了一個虛擬主機。 但是,我仍然在另一個虛擬主機中發現錯誤,只需運行phpinfo(); 對我來說這個修正是通過複製一個默認的生產php.ini文件並添加我需要的配置。 我所做的是從以前的PHP安裝我的php.ini舊副本。 一旦我把默認的php.ini從'shared'添加到我需要的擴展和配置中,這就解決了我的問題,並且不再有nginx錯誤readv()和recv()失敗。

我希望這兩個修復程序中的一個可以幫助某人。

3

關於此錯誤:

readv() failed (104: Connection reset by peer) while reading upstream and recv() failed (104: Connection reset by peer) while reading response header from upstream

有1更多的情況下我仍然可以看到這一點。 快速設置概述:

  • 的CentOS 5.5
  • PHP與PHP-FPM 5.3。8(從頭開始編寫一些第三方 模塊)
  • Nginx的1.0.5

在PHP-FPM錯誤日誌中尋找,以及和啓用catch_workers_output後= YES在php-fpm的池配置,我發現在這種情況下的根本原因實際上是amfext模塊(用於Flash的PHP模塊)。 有a known bug and fix for this module可以通過更改amf.c文件來糾正。

修復此PHP擴展問題後,上述錯誤不再是問題。

0

另外它也可能是一個非常簡單的問題 - 代碼中有一個無限遠的cicle,或者是無窮無盡的嘗試連接頁面上的外部主機。

0

有時候這個問題是由於大量的請求而發生的。默認情況下,php5-fpm中的pm.max_requests可能爲100或更低。

爲了解決它增加其價值取決於你的網站的請求,例如500

,後必須重新啓動

sudo service php5-fpm restart 
0

其他人所說的fastcgi_read_timeout參數的服務,它位於nginx.conf文件中:

http { 
    ... 
    fastcgi_read_timeout 600s; 
    ... 
} 

除此之外,我還有t Ø更改的設置request_terminate_timeout文件中:/etc/php5/fpm/pool.d/www.conf

request_terminate_timeout = 0 

來源的信息(也有一些改變的php.ini參數的其他建議,這在某些情況下可能是相關的):https://ma.ttias.be/nginx-and-php-fpm-upstream-timed-out-failed-110-connection-timed-out-or-reset-by-peer-while-reading/

相關問題