Windows Apache 2.2 dolorosamente lento executando CGI

4

Eu configurei recentemente o Apache 2.2 e git em um de nossos PCs com Windows XP para acesso ao gitweb usando a configuração em link Como observado no wiki, a única versão do Perl que parece funcionar com o gitweb da maneira como é codificada é aquela incluída no MSysGit. O ActivePerl e o StrawberryPerl não implementam um determinado recurso necessário, portanto outro intérprete não é uma opção.

C:\Program Files\Git\bin>perl.exe --version
This is perl, v5.8.8 built for msys

Em qualquer caso, ele é configurado e funciona, mas, por algum motivo, há um atraso de aproximadamente 10 segundos para cada carregamento de página. Para solucionar isso, fiz um simples helloworld.cgi e coloquei no diretório ao lado de gitweb.cgi. Está configurado para usar o mesmo interpretador perl que o gitweb:

#!C:\Program Files\Git\bin\perl.exe
print "Content-type: text/html\n\n";
print "Hello, world!\n";

Este script também leva mais de 10 segundos para ser executado no servidor. Se eu iniciar um prompt de comando e executá-lo diretamente com o mesmo executável perl, ele será executado instantaneamente.

mod_cgi é carregado na configuração do Apache e estou usando as sub-rotinas de configuração mostradas no git wiki modificado para o meu sistema:

# Config to make the gitweb CGI available through Apache.
Alias /git "C:/Program Files/Git/share/gitweb"
<Directory "C:/Program Files/Git/share/gitweb">
  AddHandler cgi-script .cgi
  <Files ~ "\.cgi$">
    Options +ExecCGI
  </Files>
  AllowOverride None
  Order allow,deny
  Allow from all
  DirectoryIndex gitweb.cgi
</Directory>

Existem outras diretivas de configuração que estão faltando? Não parece importar se eu o acesso de outro PC ou via host local diretamente na máquina, então acho que exclui o DNS. Também não está despejando nada no log de erros do Apache.

    
por JJS 29.06.2011 / 15:24

3 respostas

2

Eu consertei isso usando a versão do Perl do cygwin em vez do msysgit. Isso vai realmente acelerar o seu tempo de resposta.

Para fazer isso, você precisará modificar o script gitweb.cgi em 3 lugares A primeira linha deve dizer isto:

#!C:/cygwin/bin/perl

Eu escolhi usar a versão do git do cygwin em vez do msysgit, então você precisa ter certeza de que o projectroot está no formato do cygwin:

our $GIT = "C:/cygwin/bin/git";
our $projectroot = "/cygdrive/c/temp/repos";
    
por 17.02.2013 / 17:00
0

Isso ocorre porque o Apache limpa as variáveis de ambiente antes de executar o processador cgi. As únicas variáveis que ele deixa intactas são:

  • CAMINHO
  • PROMPT
  • SystemRoot
  • COMSPEC
  • PATHEXT
  • WINDIR

Ele também adiciona muitas variáveis específicas do Apache (como SCRIPT_NAME).

Portanto, a solução é usar algum tipo de wrapper (eu estou usando um Python cgi scrip, usando o normal W32 Python) que define algumas das variáveis antes de executar msys shell ou msys perl (o jeito certo de rodar o msys de fora é c:/path/to/sh.exe --login -c "perl /path/to/script.cgi" ).

As variáveis que precisam ser definidas (além daquelas que o Apache passa ou configura por si) são:

  • LOGONSERVER = \MACHINENAME
  • TMP = C:\Users\USERNAME\AppData\Local\Temp

O TMP não é necessário, mas o msys irá reclamar se não conseguir encontrá-lo.

Você pode usar qualquer diretório para o TMP, obviamente.

Não sei por que LOGONSERVER é necessário, desculpe.

Certifique-se de que o script / aplicativo wrapper defina stdout para o modo binário, caso contrário, o Apache lançará um erro Premature end of script headers .

    
por 07.02.2013 / 05:50
-1

Basta adicionar esta linha em httpd.conf :

SetEnv LOGONSERVER \\machine
    
por 21.07.2015 / 05:54