Não é possível executar o script Perl FastCGI no Apache Server: Erro 500

1

Estou tentando executar um servidor Apache que executa alguns scripts em CGI rápido, mas não consigo entender como fazer isso realmente funcionar. Meu problema em particular é o "Erro 500: Fim da saída do script antes dos cabeçalhos".

Eu tenho lido muito sobre isso, seguindo todas as sugestões que posso encontrar, mas ainda sem sorte. Havia alguns sobre IOTimeout e BusyTimeout e todos os outros tipos de timeout Fcgid disponíveis, mas eles não fizeram nada e eu não acho que o meu problema esteja relacionado a ele.

A partir de uma nova instalação Linux, fiz o seguinte:

  1. Instalado apache e mod_fcgid .
  2. Criei uma nova web vazia em /var/www/test com alguns arquivos vazios e um script. Eu configurei as permissões de acordo e apenas para ter certeza de que alterei o proprietário e o grupo para 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. Eu adicionei isso a /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>
    

Agora, posso executar o script perfeitamente no terminal. Quando eu entro em http://localhost eu recebo uma lista dos arquivos de diretório como esperado, mas quando eu abro o script eu recebo o erro 500 mencionado acima. O log de erros do apache mostra isso (partes desnecessárias cortadas):

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: (...)

Por que a saída do script foi registrada no log de erros? Acho que isso está relacionado a permissões e propriedade, mas não consigo descobrir como, acho que configurei todos eles de acordo. Você tem alguma ideia do que eu posso fazer para que isso aconteça?

Estou tentando executar tudo isso em uma caixa Arch linux de 64 bits.

Obrigado a todos!

    
por elpato 08.11.2015 / 20:48

2 respostas

2

Sua configuração do Apache é uma das muitas maneiras diferentes de configurar o FastCGI. Esta configuração específica pode não funcionar em todas as distribuições e versões das configurações do Apache. Esta configuração está funcionando para você.

Como o erro 500 indica que o apache achou que seu script estava sendo executado e, como seu código está no log, sabemos que o apache encontrou o arquivo. No entanto, um FastCGI servidor precisa de uma camada extra de comunicação com o apache em oposição a um script CGI . Seu código FastCGI deve aguardar solicitações do apache. Em perl , o módulo CGI::Fast manipula essa camada extra.

  1. Use a configuração original do Apache em sua pergunta.
  2. Verifique se você tem o módulo perl : CGI::Fast
  3. Modifique seu script do servidor FastCGI assim:

    #!/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";
    }
    

Este código constitui um servidor FastCGI. O CGI::Fast->new aguarda e recebe as solicitações e o ambiente de apache e configura seu ambiente de tempo de execução perl para funcionar facilmente como um servidor FastCGI. O ambiente contém informações importantes de que o código CGI precisa.

Referências:

  1. link
  2. perldoc CGI::Fast
  3. perldoc CGI
por 08.11.2015 / 22:15
0

Você provavelmente precisará de um wrapper FCGI, executando todo o material via comando php-cgi. Especifique isso no seu vhost:

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

Em seguida, prepare o script /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

    
por 09.11.2015 / 09:28