2

アップデート

理論に取り組んでLWP/Protocol/http.pm、サブルーチンに sleep ステートメントを含めるように編集しましたrequest

if (!$has_content || $write_wait || $has_content > 8*1024) {
  WRITE:
    {
        # Since this just writes out the header block it should almost
        # always succeed to send the whole buffer in a single write call.
        my $n = $socket->syswrite($req_buf, length($req_buf));
        sleep 2;   ## <----- NEW 
        unless (defined $n) {
        ...

そしてgetステートメントは機能し、 . を返しました200 OK。コード内のこの特定の場所をデバッグして見つけるのを手伝ってくれたAlan Curryに感謝します。

それが質問に完全に答えるかどうか、または解決策が長期的に機能するかどうかはわかりません。さらにチェックを行う必要があります。

概要:

  • サブルーチンを使用するLWP::UserAgentモジュールgetが一部の URL で失敗し、500 タイムアウトが報告されます。
  • 一部のURLのみが失敗します。たとえばwww.google.com、失敗しますが、www.google.se成功します。
  • 他に接続の問題はありません。すべての URL は、ブラウザや ping などの cmd プログラムからアクセスできます。
  • この問題のため、CPAN や ActivePerl の ppm で perl のモジュールをインストールできません。
  • 別の perl ディストリビューションをインストールした後も問題は解決しませんでした。
  • 奇妙なことに、デバッガーを使用してコードをステップ実行すると、失敗した URL が成功します。
  • 私はファイアウォールを使用しており、perl は接続を許可されています。(一部の URL は成功するため、関係ありません)
  • ファイアウォール ログは、perl が失敗した URL と失敗していない URL の両方で接続を許可されていることを示しています。(以下を参照) ログにはリッスンするために開いているソケットも示されますが、失敗した接続のタイムスタンプが一致しません。

ゴール

  • 私は主に、モジュールをインストールできるソリューションを探しています。
  • 問題をデバッグする方法に関するすべての提案に興味があります。完全な解決策は必要ありません。ヒントやヒントは大歓迎です。

推敲

しばらくの間、ActivePerl v5.14 を使用しています。Perl Package Managerppmコマンドと GUI を使用したモジュールのインストールは非常にうまく機能しましたが、ある時点で機能しなくなり、500 タイムアウトが報告されました。cpan シェルはまったく同じことを報告しました。

私はこの問題を広範囲にグーグルで検索しましたが、私の問題に関連するもの、または何らかの形で役立つものは何も見つかりませんでした.

ActivePerl サポートは、ばかげているプロキシ設定である可能性があると主張しています。プロキシ設定を必要としないインターネットに接続するプログラムがたくさんありますが、私の知る限り、これを行う必要はありません。プロキシ設定がある場合はそれを見つけようとしましたが、「システム設定を使用する」、「プロキシは必要ありません」、「プロキシは IP と同じです」などの漠然とした参照しか見つかりませんでした。

そのため、昨夜は十分な量のストロベリー perl を代わりにインストールしましたが、同じ問題に悩まされています。その後、ActivePerl をアンインストールしました。

とにかく、LWP モジュールを試してみたところ、そこでエラーを再現できることがわかりました。特定の Web サイトに限定されているようで、cpan もその 1 つ (?) です。テスト用に次のスクリプトを作成しました。

use strict;
use warnings;

use LWP::UserAgent;
use URI;

my $ua = LWP::UserAgent->new;
my $url = shift;
my $u = URI->new($url);
$ua->no_proxy('cpan.strawberryperl.com','cpan.com',$u->host);
$ua->timeout(30);
my $r = $ua->get($url);
if ($r->is_success) {
    print $r->decoded_content;
} else {
    die $r->status_line;
}

そして、いくつかのテストを行いました:

tx.pl http://cpan.strawberryperl.com/authors/01mailrc.txt.gz
500 read timeout at tx.pl line 23.

tx.pl http://stackoverflow.com
500 read timeout at tx.pl line 23.

tx.pl http://www.google.se
<!doctype html><html itemscope itemtype="http://schema.org/WebPage"><head><meta
http-equiv="content-type" content="text/html; charset=ISO-8859-1"><meta ...

したがって、google は機能し、www.youtube.com も機能しますが、www.yahoo.com と search.cpan.com は機能しません。デフォルトの 180 秒のタイムアウトにより、デバッグが非常に煩わしくなります。そのため、スクリプトでタイムアウトを減らしました。言うまでもなく、これらの URL はすべて、Firefox または ping でアクセスしようとすると到達可能です。


到着予定時刻:

奇妙なことに、スクリプトをデバッガーで実行し、トレースをオンにして最後までスキップすると、以前に失敗した接続が成功します。

数千行のトレース コードを出力するためにスクリプトの実行速度が遅くなると、ある種の問題やタイミングのずれが「修正」されていることを暗示しているように思われます。


この問題は、一部の ActivePerl モジュールが破損した結果であると理解できましたが、ストロベリー perl はまったく別のファイル セットを使用しているため、私のシステムに違いありません。

一部のサイトが機能し、一部のサイトが機能しない理由は不可解です。stackoverflow.com のような一部のサイトが潜在的なボットから身を守ることは理解できましたが、cpan が独自のパッケージ マネージャーを妨害する理由は理解できません。

私はファイアウォールを使用しており、Perl は接続を許可されています。私のシステムは、Windows XP のかなり古いインストール (~5 年) です。Ubuntu でデュアル ブートを実行している間、この問題に遭遇したことはありません。これは、プロキシとは関係がないというもう 1 つの手がかりです。

私は元気で、本当に困惑しています。誰かがこれをデバッグするのを手伝ってくれたら、とても感謝しています。

以下の CPAN シェル エラー メッセージ。面白いことに、最後の手段として ftp を使用しようとしていると書かれていますが、ファイアウォールで ftp コマンドが許可されていないことに気付きました。

Fetching with LWP:
http://cpan.strawberryperl.com/authors/01mailrc.txt.gz
LWP failed with code[500] message[read timeout]
Warning: no success downloading 'D:\strawberry\cpan\sources\authors\01mailrc.txt
.gz.tmp1252'. Giving up on it.
Fetching with LWP:
http://www.cpan.org/authors/01mailrc.txt.gz
LWP failed with code[500] message[read timeout]
Warning: no success downloading 'D:\strawberry\cpan\sources\authors\01mailrc.txt
.gz.tmp1252'. Giving up on it.
Warning: no success downloading 'D:\strawberry\cpan\sources\authors\01mailrc.txt
.gz.tmp1252'. Giving up on it.

As a last resort we now switch to the external ftp command 'C:\WINDOWS\system32\
ftp.EXE'
to get 'D:\strawberry\cpan\sources\authors\01mailrc.txt.gz.tmp1252'.

Doing so often leads to problems that are hard to diagnose.

If you're the victim of such problems, please consider unsetting the
ftp config variable with

    o conf ftp ""
    o conf commit

Please check, if the URLs I found in your configuration file
(http://cpan.strawberryperl.com/, http://www.cpan.org/) are valid. The
urllist can be edited. E.g. with 'o conf urllist push ftp://myurl/'

Could not fetch authors/01mailrc.txt.gz

失敗していない URL (www.google.se) と失敗した (stackoverflow.com) をフェッチしようとするファイアウォール ログ:

2012-06-27T18:34:04+01:00,info,appl control,C:\WINDOWS\system32\svchost.exe,allow,listen,17,0.0.0.0,56564
2012-06-27T18:34:04+01:00,info,appl control,C:\WINDOWS\system32\svchost.exe,allow,send,17,195.54.122.198,53
2012-06-27T18:34:13+01:00,info,appl control,D:\strawberry\perl\bin\perl.exe,allow,connect out,6,64.34.119.12,80
2012-06-27T18:34:13+01:00,info,appl control,D:\strawberry\perl\bin\perl.exe,allow,connect out,6,64.34.119.12,80
2012-06-27T18:34:21+01:00,info,appl control,C:\Program\Mozilla Firefox\firefox.exe,allow,connect out,6,74.86.70.106,80
2012-06-27T18:34:28+01:00,info,appl control,C:\Program\Mozilla Firefox\firefox.exe,allow,connect out,6,64.34.119.12,80
2012-06-27T18:34:30+01:00,info,appl control,C:\WINDOWS\system32\svchost.exe,allow,listen,17,0.0.0.0,56664
2012-06-27T18:34:30+01:00,info,appl control,C:\WINDOWS\system32\svchost.exe,allow,send,17,195.54.122.198,53
2012-06-27T18:34:30+01:00,info,appl control,D:\strawberry\perl\bin\perl.exe,allow,connect out,6,74.125.143.94,80
2012-06-27T18:34:30+01:00,info,appl control,D:\strawberry\perl\bin\perl.exe,allow,connect out,6,74.125.143.94,80
2012-06-27T18:35:14+01:00,info,appl control,C:\Program\Mozilla Firefox\firefox.exe,allow,connect out,6,64.34.119.12,80
2012-06-27T18:35:21+01:00,info,appl control,C:\Program\Mozilla Firefox\firefox.exe,allow,connect out,6,74.86.70.106,80
2012-06-27T18:36:21+01:00,info,appl control,C:\Program\Mozilla Firefox\firefox.exe,allow,connect out,6,74.86.70.106,80
2012-06-27T18:37:04+01:00,info,appl control,C:\WINDOWS\system32\svchost.exe,allow,listen,17,0.0.0.0,61215
2012-06-27T18:37:04+01:00,info,appl control,C:\WINDOWS\system32\svchost.exe,allow,send,17,195.54.122.198,53
2012-06-27T18:37:07+01:00,info,appl control,D:\strawberry\perl\bin\perl.exe,allow,connect out,6,64.34.119.12,80
2012-06-27T18:37:07+01:00,info,appl control,D:\strawberry\perl\bin\perl.exe,allow,connect out,6,64.34.119.12,80
4

1 に答える 1

0

これは、問題の完全な解決策ではない可能性があります。しかし、とにかくここにあります:

「詳細な」問題の説明から、デスクトップ/ラップトップの問題のようです。あなたが言及したようにファイアウォールがウェブサイトへの接続を許可していても、「FTP」はWindowsの内部ファイアウォールによって許可されていない場合があります。

通常、ポート 20 (FTP コマンド ポート) と 21 (FTP データ ポート) がファイアウォールの例外に追加されているはずです (Windows では、 [スタート][設定] → [コントロール パネル] → [セキュリティ センター] → [ファイアウォール] → [例外] (タブ) → [ポートの追加] をクリックします。ポート 20 と 21 を例外に追加してみてください。

ただし、ルーターに接続している場合は、ポート 20 と 21 をポート転送する必要がある場合があります。ただし、これらのポートはデフォルトで転送されます。企業の VPN を使用している場合は、まったく別の話になります。企業の VPN は、ほとんどの場合、ポート 21 を明示的に制限しますが、ポート 22 (SFTP 用のポート 21 の安全なバージョン) は許可します。このような状況では、ftp_proxyを使用することをお勧めします。

別の方法として (ポート 20 と 21 を例外に追加したくない場合)、cpanプロンプトに移動してftp_proxybyを使用できます。

cpan> o conf ftp_proxy http://your.ftpproxy.com

そして、install <module>コマンドを発行します。または、../CPAN/config.pmファイルを更新してパラメーターを永続的に変更することもftp_proxyできます。

これらは、おそらくすでに試したことのある従来のソリューションである可能性があります。FTP_PASSIVE次のステップは、モードを に設定してみること1です。デフォルトではlibnetcfg、この設定は に設定されてい0ます。これを変更するには、libnetcfg.batファイルを見つけます (どこかにあるはずですC:\Perl\bin)。エディターでファイルを開き、置き換えます

ftp_int_passive      0

ftp_int_passive      1

CPANこれは、環境変数を設定するために一度呼び出される Windows バッチ ファイルです。UNIX/Linux ライクなアーキテクチャでは、次のようなlibnet.cfg環境変数として検出されます。FTP_PASSIVE

$set | grep FTP_PASSIVE
FTP_PASSIVE=0

そうセットするだけEXPORT FTP_PASSIVE=1

これらは、これをデバッグする非常に多くの方法の一部かもしれません。正直なところ、ライブラリ コードは他のすべてのマシンで問題なく動作するため、いじっても意味がありません。通常、01mailrc.txt.gz.tmp1252ダウンロードの問題の 95% はネットワーク/OS/ファイアウォールの問題が原因ですが、LWP に関する Perl の知識を広げたい場合は可能です。実際、あなたも見ているは​​ずCPAN::FTP::netrcです。幸運を祈ります...

于 2012-07-20T00:49:27.077 に答える