Apache 서버에서 Perl FastCGI 스크립트를 실행할 수 없습니다: 오류 500

Apache 서버에서 Perl FastCGI 스크립트를 실행할 수 없습니다: 오류 500

빠른 CGI를 통해 일부 스크립트를 실행하는 Apache 서버를 실행하려고 하는데 실제로 작동하게 만드는 방법을 평생 알 수 없습니다. 내 문제는 특히 "오류 500: 헤더 앞의 스크립트 출력 끝"입니다.

나는 이것에 대해 많이 읽었고 내가 찾을 수 있는 모든 조언을 따랐지만 여전히 운이 좋지 않았습니다. IOTimeout 및 BusyTimeout과 기타 모든 종류의 Fcgid 시간 초과에 대한 정보가 있지만 이것들은 아무 것도 하지 않으며 내 문제는 그것과 관련이 없다고 생각합니다.

새로운 Linux 설치부터 시작하여 다음과 같이 했습니다.

  1. 설치 apache하고 mod_fcgid.
  2. /var/www/test빈 파일과 스크립트가 포함된 새로운 빈 웹사이트를 만들었습니다. 소유자와 그룹이 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를 설정하는 다양한 방법 중 하나입니다. 이 특정 구성은 모든 배포 및 Apache 구성 스타일에서 작동하지 않을 수 있습니다. 이 구성은 귀하에게 적합합니다.

500 오류는 Apache가 스크립트가 실행 중이라고 생각하고 코드가 로그에 있으므로 Apache가 파일을 찾았음을 나타냅니다. 그러나 FastCGI는섬기는 사람CGI가 아닌 Apache와의 추가 통신이 필요합니다.스크립트. FastCGI 코드는 Apache의 요청을 기다려야 합니다. 에서 perlCGI::Fast모듈은 이 추가 레이어를 처리합니다.

  1. 질문에 원래 Apache 구성을 사용하십시오.
  2. 다음 모듈이 있는지 확인하세요 perl.CGI::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

관련 정보