Windows的Apache 2.2痛苦地执行CGI缓慢

我最近在我们的Windows XP个人电脑上设置了Apache 2.2和git,以便使用https://git.wiki.kernel.org/index.php/MSysGit:GitWeb上的设置进行gitweb访问。正如wiki上所述,只有版本的Perl似乎与编码的方式与gitweb一起使用的MSysGit。 ActivePerl和StrawberryPerl没有实现某些必需的function,所以另一个解释器不是一个选项。

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

在任何情况下,它被设置,它的工作原理,但由于某种原因,每个页面加载大约有10秒延迟。 为了解决这个问题,我做了一个简单的helloworld.cgi,并把它放在gitweb.cgi旁边的目录中。 它被设置为使用与gitweb相同的perl解释器:

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

该脚本在服务器上执行的时间也超过了10秒。 如果我启动一个命令提示符,并用相同的perl可执行文件直接执行它,它会立即执行。

mod_cgi被加载到Apacheconfiguration中,我正在使用为我的系统修改的git wiki上显示的configuration节:

 # 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> 

是否有一些其他的configuration指令,我错过了? 我从另一台电脑上或通过本地主机直接访问它似乎并不重要,所以我认为这是排除DNS。 它也不会将任何东西转储到Apache错误日志中。

我通过使用cygwin的Perl版本而不是msysgit来解决这个问题。 这真的会加快你的回应时间。

要做到这一点,你需要在3个地方修改gitweb.cgi脚本第一行应该这样说:

 #!C:/cygwin/bin/perl 

我select使用cygwin的git版本而不是msysgit的,所以你需要确保projectroot是cygwin的格式:

 our $GIT = "C:/cygwin/bin/git"; our $projectroot = "/cygdrive/c/temp/repos"; 

这是因为在运行cgi处理器之前,Apache会清理环境variables。 它保持不变的唯一variables是:

  • path
  • 提示
  • SYSTEMROOT
  • COMSPEC
  • PATHEXT
  • WINDIR

它还增加了很多Apache特定的variables(如SCRIPT_NAME)。

所以解决方法是使用某种包装(我使用Python的cgi脚本,使用普通的W32 Python),在运行msys shell或msys perl之前设置了一些variables(从外部运行msys的正确方法是c:/path/to/sh.exe --login -c "perl /path/to/script.cgi" )。

需要设置的variables(除了Apache通过或设置的variables之外)是:

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

TMP不是必需的,但如果找不到它,msys会报错。

你可以使用TMP的任何目录,显然。

我不知道为什么需要LOGONSERVER ,对不起。

确保包装脚本/应用程序将stdout设置为二进制模式,否则Apache将抛出Premature end of script headers错误的Premature end of script headers

只需在httpd.conf添加这一行:

 SetEnv LOGONSERVER \\\\machine