ApacheサーバーでPerl FastCGIスクリプトを実行できません:エラー500

ApacheサーバーでPerl FastCGIスクリプトを実行できません:エラー500

高速CGIを介していくつかのスクリプトを実行しているApacheサーバーを実行しようとしていますが、実際に動作させる方法を一生にわかりません。私の問題は特に「エラー500:ヘッダーの前のスクリプト出力の終わり」です。

私はこれについてたくさん読んで、私が見つけることができるすべてのアドバイスに従いましたが、まだ幸運ではありませんでした。私はIOTimeoutとBusyTimeoutと他のすべての種類のFcgidタイムアウトに関する情報を持っていますが、これらは何もしません、私の問題はそれとは関係がないと思います。

新しいLinuxインストールから始めて、次のようにしました。

  1. インストールapacheしてくださいmod_fcgid
  2. /var/www/test空のファイルとスクリプトを含む新しい空のWebサイトを作成しました。所有者とグループがhttpに変更されたことを確認するために、それに応じて権限を設定しました。

    $ ls -l /var/www
    drwxrwxr-x 1 http http 122 Nov  8 16:08 test/
    
    $ ls -l /var/www/test
    -rw-rw-r-- 1 http http   0 Nov  8 15:29 file01.txt
    -rw-rw-r-- 1 http http   0 Nov  8 15:29 file02.txt
    -rw-rw-r-- 1 http http   0 Nov  8 15:29 file03.txt
    -rwxr-xr-x 1 http http 107 Nov  8 16:08 run.fcgi*
    
    $ cat /var/www/test/run.fcgi 
    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    print "Content-type: text/html\n\n";
    print "Hello world.\n";
    
  3. 私はこれを次に添付しました/etc/httpd/conf/httpd.conf

    LoadModule fcgid_module modules/mod_fcgid.so
    <IfModule fcgid_module>
      AddHandler fcgid-script .fcgi
    </IfModule>
    
    <VirtualHost *:80>
      DocumentRoot /var/www/test
      <Directory /var/www/test>
        Options +Indexes +ExecCGI
        Require all granted
      </Directory>
    </VirtualHost>
    

これで、端末でスクリプトを完全に実行できます。次に、に移動すると、期待http://localhostどおりにディレクトリファイルのリストが表示されますが、スクリプトを開くと上記のエラー500が表示されます。 Apacheのエラーログには次のものが表示されます(不要な部分は切り捨てられます)。

Content-type: text/html

Hello world.
(...) Connection reset by peer (...) mod_fcgid: error reading data from FastCGI server, referer: (...)                                                                                  
(...) End of script output before headers: run.fcgi, referer: (...)

スクリプト出力がエラーログに記録されるのはなぜですか?権限と所有権に関連していると思いますが、どうすればよいかわかりません。これにより、すべてを設定したようです。実行するために私は何ができるか知っていますか?

私はこれらすべてを64ビットArch Linuxシステムで実行しようとしています。

みんなありがとうございます!

答え1

Apache設定はFastCGIを設定するさまざまな方法の1つです。この特定の設定は、すべてのデプロイおよびApache設定スタイルでは機能しない可能性があります。この構成はあなたに適しています。

500エラーは、Apacheがスクリプトが実行中であると考え、コードがログにあるため、Apacheがファイルを見つけたことを示します。しかし、FastCGIは仕える人CGIではなくApacheとの追加通信が必要です。スクリプト。 FastCGIコードはApacheからの要求を待つ必要があります。で、perlこのCGI::Fastモジュールはこの追加のレイヤーを処理します。

  1. 質問に元のApache設定を使用してください。
  2. 次のモジュールがあることを確認してくださいperlCGI::Fast
  3. FastCGIサーバースクリプトを次のように変更します。

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    use CGI::Fast;
    
    while (my $q = CGI::Fast->new) {
        print "Content-type: text/html\n\n";
        print "Hello world.\n";
    }
    

このコードは FastCGI サーバーを構成します。CGI::Fast->new要求と環境を待機して受信し、FastCGIサーバーの役割を簡単に実行できるようにランタイム環境をapache設定します。perlこの環境には、CGIコードに必要な重要な情報が含まれています。

引用:

  1. https://httpd.apache.org/mod_fcgid/
  2. perldoc CGI::Fast
  3. perldoc CGI

答え2

php-cgiコマンドを使用してフルジョブを実行するには、FCGIラッパーが必要な場合があります。仮想ホストに以下を指定します。

AllowOverride All Options=ExecCGI,Includes,IncludesNOEXEC,Indexes,MultiViews,SymLinksIfOwnerMatch AddHandler fcgid-script .php AddHandler fcgid-script .php5 FCGIWrapper /home/.../fcgi-bin/php5.fcgi .php FCGIWrapper /home/.../fcgi-bin/php5.fcgi .php5

その後、スクリプトを準備します。/home/.../fcgi-bin/php5.fcgi

#!/bin/bash PHPRC=$PWD/../etc/php5 export PHPRC umask 022 export PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS=99999 export PHP_FCGI_MAX_REQUESTS SCRIPT_FILENAME=$PATH_TRANSLATED export SCRIPT_FILENAME exec /usr/bin/php5-cgi

関連情報