web-dev-qa-db-ja.com

nginxエラーreadv()およびrecv()が失敗しました

私はfastcgiと一緒にnginxを使用しています。エラーログに次のエラーがたくさん表示されます

上流からの読み取り中にreadv()が失敗しました(104:ピアによる接続のリセット)。上流からの応答ヘッダーの読み取り中にrecv()が失敗しました(104:ピアによる接続のリセット)

アプリケーションの使用に問題はありません。これらのエラーは深刻ですか、それともそれらを取り除く方法ですか?.

21
rampr

私はphp-fpmをバックグラウンドで使用しており、遅いスクリプトはそのように構成されているため、上記のタイムアウト後に強制終了されていました。したがって、指定された時間より長くかかるスクリプトは強制終了され、php-fpmエンジン/プロセスからの接続が閉じられると、nginxはrecvまたはreadvエラーを報告します。

11
rampr

このエラーについて:

上流からの読み取り中にreadv()が失敗しました(104:ピアによる接続のリセット)。上流からの応答ヘッダーの読み取り中にrecv()が失敗しました(104:ピアによる接続のリセット)

私がまだこれを見ることができたもう1つのケースがありました。クイックセットアップの概要:

  • CentOS 5.5
  • PHP-FPM 5.3.8を使用したPHP(サードパーティのモジュールを使用してゼロからコンパイル)
  • Nginx 1.0.5

PHP-FPMエラーログも確認し、php-fpmプール構成でcatch_workers_output = yesを有効にした後、この場合の根本的な原因を見つけました実際にはamfextモジュール(Flash用のPHPモジュール)でした。 amf.cファイルを変更することで修正できる このモジュールの既知のバグと修正 があります。

このPHP拡張機能の問題を修正した後、上記のエラーは問題ではなくなりました。

4
Paul G.

これはいくつかのことを意味する可能性があるため、非常にあいまいなエラーです。重要なのは、考えられるすべてのログを見て、それを理解することです。私の場合、おそらくややユニークですが、nginx + php/fastcgi設定が機能していました。私はPHPの新しい更新バージョンをPHP-FPMでコンパイルしたかったのでコンパイルしました。その理由は、ダウンタイムが許されないライブサーバーで作業していたためです。可能な限りシームレスにPHP-FPMにアップグレードして移動します。

したがって、PHPのインスタンスが2つありました。

  • 1 fastcgiと直接対話する(PHP 5.3.4)-TCP/127.0.0.1:9000(PHP 5.3.4)を使用
  • 1 PHP-FPMで構成-Unixソケットを使用-unix:/ dir/to/socket-fpm(PHP 5.3.8)

TCPの代わりにソケット接続を使用してnginx vhostでPHP-FPM(PHP 5.3.8)を起動すると、fastcgiページでこのアップストリームエラーが発生し始めました。 FPMを使用しているかどうか。通常、mysqlで大規模なSELECTSを実行しているページで、ロードに約2分かかりました。悪いことですが、これはバックエンドのDB設計が原因です。

これを修正するために行ったのは、vhost構成にこれを追加することです:fastcgi_read_timeout 5m;これで、nginxグローバルfastcgi設定にも追加できます。それはあなたのセットアップに依存します。 http://wiki.nginx.org/HttpFcgiModule

3
Paul Greene

Nginxを使用してphp-fpmに接続している場合、考えられる原因の1つは、nginx 'fastcgi_keep_connパラメータをonに設定していることです(特に、低レベルの場合pm.max_requests php-fpmの設定):

http|server|location {
    ...
    fastcgi_keep_conn on;
    ...
}

これは、nginxがまだ接続されているときにphp-fpmの子プロセスが再起動するたびに(pm.max_requestsに到達したため)、説明されたエラーを引き起こす可能性があります。これをテストするには、pm.max_requestsを非常に小さい値(1など)に設定し、上記のエラーがさらに発生するかどうかを確認します。

修正は非常に簡単です-非アクティブ化fastcgi_keep_conn

fastcgi_keep_conn off;

または、パラメーターを完全に削除します(デフォルト値はoffであるため)。これは、nginxがすべてのリクエストでphp-fpmに再接続することを意味しますが、nginxとphp-fpmの両方が同じマシン上にあり、UNIXソケット経由で接続している場合、パフォーマンスへの影響は無視できます。

3
FoxEcho

回答#2.興味深いことに、fastcgi_read_timeout 5m; 1つの仮想ホストを修正しました。しかし、phpinfo()を実行しただけで、別の仮想ホストでエラーが発生していました。これを修正したのは、デフォルトの本番php.iniファイルをコピーし、それに必要な構成を追加することでした。私が持っていたのは、以前のPHPインストールからのphp.iniの古いコピーです。デフォルトのphp.iniを「共有」から配置して、必要な拡張機能と構成に追加しただけです。これで問題が解決し、nginxエラーreadv()とrecv()が失敗しなくなりました。

これら2つの修正のうちの1つが誰かを助けることを願っています。

1
Paul Greene

また、それは非常に単純な問題になる可能性があります-コードのどこかに無限のシクルがあるか、無限がページ上の外部ホストに接続しようとしています。

0
Funcraft

他の人はnginx.confファイルにあるfastcgi_read_timeoutパラメータについて言及しています:

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

それに加えて、ファイル/etc/php5/fpm/pool.d/www.confの設定request_terminate_timeoutも変更する必要がありました。

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 /

0
Rauni Lillemets

リクエストが多すぎるために、この問題が発生する場合があります。デフォルトではpm.max_requests php5-fpmで100以下かもしれません。

それを解決するためにその値を増加させることはあなたのサイトの要求、例えば500に依存します。

そして、あなたはサービスを再起動する必要があります後

Sudo service php5-fpm restart
0
shgnInc