82

この奇妙なエラーが発生しています。CURLエラー:受信エラー:ピアによって接続がリセットされました

これがどのように発生するかです。サーバーに接続せず、PHPでCURLを介してサーバーに突然接続しようとすると、エラーが発生します。CURLスクリプトを再度実行すると、エラーが消えてずっと正常に機能します。リモートサーバーを約30分間アイドル状態のままにするか、リモートサーバーを再起動して再接続しようとすると、エラーが再度発生します。したがって、接続がアイドル状態になっているように見えますが、突然サーバーが起動してから動作し、再びスリープ状態になります。

これが私のCURLスクリプトの外観です。

$url = Yii::app()->params['pdfUrl'];
            $body = 'title='.urlencode($title).'&client_url='.Yii::app()->params['pdfClientURL'].'&client_id='.Yii::app()->params['pdfClientID'].'&content='.urlencode(htmlentities($content));

            $c = curl_init ($url);
            $body = array(
                "client_url"=>Yii::app()->params['pdfClientURL'],
                "client_id"=>Yii::app()->params['pdfClientID'],
                "title"=>urlencode($title),
                "content"=>urlencode($content)

            );
            foreach($body as $key=>$value) { $body_str .= $key.'='.$value.'&'; }
                rtrim($body_str,'&');

            curl_setopt ($c, CURLOPT_POST, true);
            curl_setopt ($c, CURLOPT_POSTFIELDS, $body_str);
            curl_setopt ($c, CURLOPT_RETURNTRANSFER, true);
            curl_setopt ($c, CURLOPT_CONNECTTIMEOUT , 0);
            curl_setopt ($c, CURLOPT_TIMEOUT  , 20);

            $pdf = curl_exec ($c);
            $errorCode = curl_getinfo($c, CURLINFO_HTTP_CODE);
            $curlInfo = curl_getinfo($c);
            $curlError = curl_error($c);

            curl_close ($c);

私は完全にアイデアと解決策がありません、助けてください、私はそれを感謝します!!!

出力を冗長化して、を使用して何が起こるかを確認すると

curl_setopt ($c, CURLOPT_VERBOSE, TRUE);
curl_setopt($c, CURLOPT_STDERR, $fp); 

私は次のようになります

* About to connect() to 196.41.139.168 port 80 (#0)
*   Trying 196.x.x.x... * connected
* Connected to 196.x.x.x (196.x.x.x) port 80 (#0)
> POST /serve/?r=pdf/generatePdf HTTP/1.1
Host: 196.x.x.x
Accept: */*
Content-Length: 7115
Content-Type: application/x-www-form-urlencoded
Expect: 100-continue

* Recv failure: Connection reset by peer
* Closing connection #0
012 20:23:49 GMT
< Server: Apache/2.2.15 (CentOS)
< X-Powered-By: PHP/5.3.3
< Connection: close
< Transfer-Encoding: chunked
< Content-Type: text/html; charset=UTF-8
< 
* Closing connection #0

私は次のつま先にデフォルトのヘッダーを削除するように追加しましたが、それでも運がありません:

curl_setopt ($c, CURLOPT_HTTPHEADER, array( 'Expect:' ) );

> Accept: */* Content-Length: 8414 Content-Type:
> application/x-www-form-urlencoded
> 
> * Recv failure: Connection reset by peer
> * Closing connection #0 r: Apache/2.2.15 (CentOS) < X-Powered-By: PHP/5.3.3 < Connection: close < Transfer-Encoding: chunked <
> Content-Type: text/html; charset=UTF-8 < 
> * Closing connection #0
4

7 に答える 7

121

序章

リモートサーバーからRSTパケットが送信されました。これは、通常のハンドシェイクではなく、接続がすぐに切断されたことを示します。

考えられる原因

A. TCP / IP

これは、ホストで解決するか、OSをアップグレードする必要があるTCP / IPの問題である可能性があります。ほとんどの場合、コンテンツのダウンロードが完了する前にリモートサーバーとの接続が閉じられ、結果としてConnection reset by peer.....

B.カーネルのバグ

v2.6.17以降の一部のLinuxカーネルではTCPウィンドウスケーリングにいくつかの問題があることに注意してください。詳細については、次のバグレポートを参照してください。

https://bugs.launchpad.net/ubuntu/+source/linux-source-2.6.17/+bug/59331

https://bugs.launchpad.net/ubuntu/+source/linux-source-2.6.20/+bug/89160

C.PHPとCURLのバグ

あなたはPHP/5.3.3いくつかの深刻なバグも持っているものを使用しています...私はあなたがより新しいバージョンで作業することをお勧めしPHPますCURL

https://bugs.php.net/bug.php?id=52828

https://bugs.php.net/bug.php?id=52827

https://bugs.php.net/bug.php?id=52202

https://bugs.php.net/bug.php?id=50410

D.最大伝送ユニット

このエラーの一般的な原因の1つは、ネットワーク接続を通過するパケットのMTU(Maximum Transmission Unit)サイズがデフォルトの1500バイトから変更されたことです。これを構成した場合、VPNこれは構成中に変更する必要があります

D.ファイアウォール:iptables

あなたがこれらの人の周りのあなたの方法を知らないならば、彼らはいくつかの深刻な問題を引き起こす可能性があります..あなたが接続しているサーバーにアクセスして以下をチェックしてみてください

  • そのサーバーのポート80にアクセスできます

 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT`
  • 以下は、他のACCEPTの前ではなく最後の行にあります

  -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited 
  • ALL DROP、REJECTをチェックし、それらが接続をブロックしていないことを確認します

  • 一時的にすべての接続を許可して、敵が通過するかどうかを確認します

実験

別のサーバーまたはリモートサーバー(オンラインでホスティングしている無料のクラウドが非常に多い)で試して、同じスクリプトをテストしてください。それがうまくいくなら、私の推測は正しいです...You need to update your system

その他のコード関連

A.SSL _

Yii::app()->params['pdfUrl']適切なSSL設定が含まれていないURLの場合https、古いバージョンのcurlでもこのエラーが発生する可能性があります

解決策:OpenSSLがインストールされて有効になっていることを確認してから、これをコードに追加します

curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($c, CURLOPT_SSL_VERIFYHOST, false);
于 2012-04-27T11:35:01.627 に答える
18

通常、このエラーは、サーバーとの接続が確立されたが、その接続がリモートサーバーによって閉じられたことを意味します。これは、サーバーの速度が遅い、リモートサーバーの問題、ネットワークの問題、または(おそらく)データがリモートサーバーに送信される際の何らかのセキュリティエラーが原因である可能性がありますが、その可能性は低いと思います。

通常、ネットワークエラーは少し時間があれば解決しますが、もう少し時間があれば解決しているようです。

cURLでSSLおよびSSL証明書に問題が発生することがあります。ApacheやPHPは、最新バージョンのcURLおよびcURL SSLライブラリでコンパイルされていると思います。さらに、OpenSSLがWebサーバーにインストールされているとは思いません。

確かではありませんが、cURLは歴史的にSSL証明書を使用するのが難しいと思いますが、OpenSSLはそうではありません。

とにかく、サーバーにOpen SSLをインストールして再試行すると、このエラーを取り除くのに役立ちます。

于 2012-04-30T18:00:54.270 に答える
4

それで、Yii::app()->params['pdfUrl']与えるURLは何ですか?httpsである必要があると言いますが、ログにはポート80で接続していることが示されています...https接続を受け入れるように設定されているサーバーはほとんどありません。cURLは、httpsがポート443にある必要があることを知るのに十分賢いです...これは、URLに次のような奇妙なものが含まれていることを示唆します。https://196.41.139.168:80/serve/?r=pdf/generatePdf

これにより、相手側のApacheがそのポートでhttps通信を実行できない場合に、接続が終了します。

2行後に配列$bodyに設定すると、最初の定義が置き換えられることに気づきましたか?$body{おそらく問題を解決しようとしているあなたのアーティファクト}あなたはclient_urlandclient_id値もエンコードしていません(前者はエスケープが必要な文字を含んでいる可能性が非常に高いです!)ああ、$body_str最初に初期化せずに追加しています。

詳細な出力から、cURLがcontent-lengthヘッダーを追加していることがわかりますが、それは正しいですか?その番号が間違っているというインターネット上のコメントをいくつか見ることができます(特に古いバージョンの場合)...その番号が小さすぎる場合(たとえば)、すべてのデータが送信される前に接続がリセットされます。ヘッダーは手動で挿入できます。

curl_setopt ($c, CURLOPT_HTTPHEADER, 
   array("Content-Length: ". strlen($body_str))); 

ああ、http_build_query 名前と値のペアの配列をURLエンコードされた文字列に変換する便利な関数があります。

これはすべて、最終的なコードにまとめられます。

$post=http_build_query(array(
  "client_url"=>Yii::app()->params['pdfClientURL'],
  "client_id"=>Yii::app()->params['pdfClientID'],
  "title"=>$title,
  "content"=>$content));

//Open to URL
$c=curl_init(Yii::app()->params['pdfUrl']);
//Send post
curl_setopt ($c, CURLOPT_POST, true);
//Optional: [try with/without]
curl_setopt ($c, CURLOPT_HTTPHEADER, array("Content-Length: ".strlen($post))); 
curl_setopt ($c, CURLOPT_POSTFIELDS, $post);
curl_setopt ($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt ($c, CURLOPT_CONNECTTIMEOUT , 0);
curl_setopt ($c, CURLOPT_TIMEOUT  , 20);
//Collect result
$pdf = curl_exec ($c);
$curlInfo = curl_getinfo($c);
curl_close($c);
于 2012-04-27T17:31:24.593 に答える
4

私は同じエラーに直面しましたが、方法が異なります。

特定のSSLプロトコルでページをカールするとき。

curl --sslv3 https://example.com

--sslv3がターゲットサーバーでサポートされていない場合、エラーは次のようになります。

curl:(35)ピアによってTCP接続がリセットされました

サポートされているプロトコルを使用すると、エラーはなくなります。

curl --tlsv1.2 https://example.com
于 2018-03-19T19:44:18.987 に答える
2

これはファイアウォールの問題です。VMwareアプリケーションを使用している場合は、アンチウイルスのファイアウォールがオフになっているか、接続が許可されていることを確認してください。

このサーバーが安全なネットワーク上にある場合は、サーバーのファイアウォールルールを確認してください。

ありがとうガネーシュPNS

于 2015-10-13T05:30:47.867 に答える
1

ロードバランサーへのWebSocket接続を行う際にも、同じ問題が発生しました。問題はLBにあり、ポート80でhttp接続を受け入れ、要求をノード(ポート8080のtomcatアプリ)に転送します。これを変更して、ポート80でtcp(httpは「tcp」として変更されました)接続を受け入れます。したがって、最初のハンドシェイク要求がノードに転送され、WebSocket接続がランダムに正常に確立されます(私が知る限り、間違った)ポート。

以下のコマンドは、WebSocketハンドシェイクプロセスをテストするために使用されています。

curl -v -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" -H "Host: localhost" -H "Origin: http://LB URL:80" http://LB URL

  • 次のURLに再構築:http:LB URL /
  • LBURLを試しています...
  • TCP_NODELAYセット
  • LB URL(LB URL)ポート80(#0)に接続

    GET / HTTP / 1.1ホスト:localhostユーザーエージェント:curl / 7.60.0承認:/ 接続:アップグレードアップグレード:websocketオリジン:http:// LB URL:80

  • 受信障害:ピアによって接続がリセットされました
  • 接続を閉じる0curl:(56)受信エラー:ピアによって接続がリセットされました
于 2019-12-04T05:31:46.507 に答える
0

私の場合、URLに問題がありました。私はhttps://example.comを使用しましたが、「www」を保証します。-だから私がhttps://www.example.comに切り替えたとき、すべてが大丈夫だった。適切なヘッダーが「ホスト:www.example.com」に送信されました。

Firefox brwoserでリクエストを作成し、それを永続化してcURLとしてコピーすることができます-それが私が見つけた方法です。

于 2016-02-04T20:59:09.253 に答える