4

概要:最も単純な「Hello World」FastCGI スクリプトを実行できず、要求は常にタイムアウトになります。サーバーと FastCGI スクリプト (動的 FastCGI スクリプトを使用) との間に通信がまったくないようです。

環境

  • Ubuntu プレサイス (12.04)
  • パッケージapache2.2-bin
  • パッケージapache2-mpm-prefork
  • パッケージlibapache2-mod-fastcgi
  • パッケージlibfcgi-perl
  • パッケージpython-flup
  • で仮想ホストとして構成された複数のサイト127.0.0.1
  • が所有し、すべて (所有者、グループ、およびその他) が読み取り可能な/var/lib/apache2/fastcgiディレクトリが存在します。www-data
  • /var/lib/apache2/fastcgi/dynamicが所有するディレクトリが存在し、所有www-data者に制限されています (読み取り、書き込み、およびアクセスはwww-dataのみ)
  • /var/lib/apache2/fastcgi/ディレクトリに inode/socket ファイルが存在する

FastCGI 関連の構成:

ディレクトリはand (が有効)/etc/apache2/mods-enabled/への参照を保持します。fastcgi.conffastcgi.loadmod_fastcgi

このファイルfastcgi.confには次のものが含まれています (そのままにしておきます。編集はしていません)。

<IfModule mod_fastcgi.c>
  AddHandler fastcgi-script .fcgi
  #FastCgiWrapper /usr/lib/apache2/suexec
  FastCgiIpcDir /var/lib/apache2/fastcgi
</IfModule>

の関連する構成ファイルに/etc/apache2/sites-enabled/は次のものが含まれています (FastCGI 固有の構成については他に何もありません)。

<DirectoryMatch /fcgi-bin>
   Options +ExecCGI
   <FilesMatch "^[^\.]+$">
      SetHandler fastcgi-script
   </FilesMatch>
</DirectoryMatch>

テスト仮想ホストのテスト マテリアル:

内容が次の が存在しfcgi-bin/test-perl.fcgiます (ファイルはすべてのユーザーが実行可能で、所有者とグループが読み取り可能です):

#!/usr/bin/perl

use CGI::Fast qw(:standard);
    $COUNTER = 0;
    while (new CGI::Fast) {
    print header;
    print start_html("Fast CGI Rocks");
    print
        h1("Fast CGI Rocks"),
        "Invocation number ",b($COUNTER++),
            " PID ",b($$),".",
        hr;
        print end_html;
    }

内容が次の が存在しfcgi-bin/test-python.fcgiます (ファイルはすべてのユーザーが実行可能で、所有者とグループが読み取り可能です):

#!/usr/bin/python

def myapp(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return ['Hello World!\n']

try:
    from flup.server.fcgi import WSGIServer
    WSGIServer(myapp).run()
except:
    import sys, traceback
    traceback.print_exc(file=open("errlog.txt","a"))

問題

コマンドラインから実行すると と はどちらも正常に動作しますが、 や などのように呼び出された場合はどれも機能しfcgi-bin/test-perl.fcgiないようです。fcgi-bin/test-python.fcgihttp://test.loc/fcgi-bin/test-perl.fcgihttp://test.loc/fcgi-bin/test-python.fcgi

何も起こらず、少し遅れてエラー 500 が発生し、Apache エラー ログには次のような複数のエントリが含まれます。

[<date>] [error] [client <IP>] FastCGI: comm with (dynamic) server "/<…&gt;/fcgi-bin/<script>.fcgi" aborted: (first read) idle timeout (30 sec), referer: <referrer>
[<date>] [error] [client <IP>] FastCGI: incomplete headers (0 bytes) received from server "<…&gt;/fcgi-bin/<script>.fcgi", referer: <referrer>

なぜ機能しないのかを理解するために何時間もかけてウェブを検索しましたが、最終的にはあきらめて、ここで助けを求めることにしました.

任意のポインターとチェック リストを歓迎します。関連性があると思われる、または確認する価値があると思われる詳細が不足している場合は、お気軽にお問い合わせください。

素敵な一日をお楽しみください。

- 編集 -

問題の更新

私自身の質問に対する私自身の返信で、理由もなく突然正常に見えるという奇妙なケースについて言及しました。後で、これは部分的にしか問題がないことを発見しました。

同じ仮想ホストで、まったく同じサーバー構成を使用すると、場所によっては、まったく同じ (およびまったく同じアクセス権を持つ) 一部のスクリプトが失敗します。

残りとして、サイト構成の内容は次のとおりです。

<DirectoryMatch /fcgi-bin>
   Options +ExecCGI
   <FilesMatch "^[^\.]+$">
      SetHandler fastcgi-script
   </FilesMatch>
</DirectoryMatch>

以上で、 のスクリプトのみ/fcgi-binが FastCGI スクリプトとして扱われます。しかし、別の場所(まだテスト用) もいくつかあり/cgi-binます。この目的のために、次のエントリが含まれています。/public_html.htaccess

Options +ExecCGI
AddHandler fastcgi-script .fcgi

したがって、他の 2 つの FastCGI スクリプトは のスクリプトと同じように機能するはずですが、そうではなく、当面は、最初のスクリプトと同様/fcgi-binに、常に接続タイムアウトで終了します。/fcgi-bin

これは、モジュールに何か問題があるのではないかと感じさせmod_fastcgiます (既知のバグ? 他?)。これまでのところ、このモジュールはかなりランダムに動作しているようです。

-- 編集 2 --

上記の最初の編集は、私の誤りでした。グループは他のスクリプトと間違っていました。そうでなければなりwww-dataませんでしたが、そうではありませんでした。何かが間違っているので、私が与えた答えに固執してFastCgiConfigください。

4

3 に答える 3

4

現在は機能しているように見えるので、私は自分の質問に答えます。しかし、エピローグはまだ奇妙に見えます。

デフォルトの構成で問題ないはずですが、「Module mod_fastcgi」ドキュメントをもう一度確認したいと思いました。動的な FastCGI のみが必要だったので、FastCgiConfigディレクティブのみに焦点を当て、意図的にFastCgiServerディレクティブには入りませんでしFastCgiExternalServerた。

FastCgiServerデフォルトのファイルには何もなかったのでfastcgi.conf、自分でセットアップしようとしました。最初のテストでは、この-appConnTimeoutオプションを使用して、サーバーがエラー 500 を返すまであまり長く待たないように要求しました。

fastcgi.congしたがって、仮想ホストが構成されている同じファイルで、これをサイト構成に追加しました (私は触れませんでした):

FastCgiConfig -appConnTimeout 2

これは、サーバーが待機していた 30 秒ではなく、2 秒以内に待機するようにサーバーに指示するためでした。FastCGI スクリプトを呼び出して、少なくともこの構成が機能しているかどうかを確認しようとしました。2 秒の遅延でエラーが発生することを期待していましたが、代わりに、スクリプトはエラーなしで実行されました。

奇妙なのは、このオプションを削除して、FastCGI スクリプトを機能させるために欠落していた追加だけであるかどうかを確認しようとしたことです。しかし、オプションをコメントアウトした後も、それはまだ機能しており、完全に再起動した後も同じでした.

これ以上はわかりませんが、奇妙に見えますが、私が行ったのはこれだけで、他には何も編集していません。同様の問題に遭遇する可能性のある人に、上記を試してみることをお勧めします。

申し訳ありませんが、それが正確に何をしたかを説明できない場合。本当に知りたいです。現在は機能していますが、理由はわかりません。

于 2013-03-22T07:46:26.250 に答える
2
############

fastcgi.conf FastCgiWrapper オフ

于 2014-05-21T06:46:32.873 に答える
0

peng.rl の答えは私の問題を解決します。

私の ceph radosgw は、Apache の入力をまったく取得できません。FastCgiWrapper をオフに設定した後、wireshark でデータをキャプチャできます。

于 2015-01-13T08:28:20.377 に答える