Windows Apache 2.2 执行 CGI 速度非常慢

Windows Apache 2.2 执行 CGI 速度非常慢

我最近在我们的一台 Windows XP PC 上设置了 Apache 2.2 和 git,以便使用以下设置进行 gitweb 访问:https://git.wiki.kernel.org/index.php/MSysGit:GitWeb 正如 wiki 上所述,唯一一个似乎可以与 gitweb 协同工作的 Perl 版本是 MSysGit 附带的版本。ActivePerl 和 StrawberryPerl 没有实现某些必需的功能,因此另一个解释器不是一个选择。

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 已加载到 Apache 配置中,我正在使用针对我的系统修改的 git wiki 上显示的配置节:

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

我是否遗漏了其他配置指令?无论是从另一台 PC 还是直接通过机器上的 localhost 访问它,似乎都无关紧要,所以我认为这排除了 DNS。它也没有将任何内容转储到 Apache 错误日志中。

答案1

我通过使用 cygwin 版本的 Perl 而不是 msysgit 解决了这个问题。这确实会加快您的响应时间。

为此,您需要在 3 个地方修改 gitweb.cgi 脚本第一行应该是这样的:

#!C:/cygwin/bin/perl

我选择使用 cygwin 版本的 git 而不是 msysgit 版本,因此您需要确保 projectroot 是 cygwin 的格式:

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

答案2

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

  • 小路
  • 迅速的
  • 系统根目录
  • 康普
  • 路径文本
  • 温迪尔

它还添加了大量 Apache 特定的变量(例如 SCRIPT_NAME)。

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

需要设置的变量(除了 Apache 传递或自行设置的变量之外)包括:

  • 登录服务器 =\\MACHINENAME
  • TMP =C:\Users\USERNAME\AppData\Local\Temp

TMP 不是必需的,但如果找不到它,msys 将会抱怨。

显然,您可以将任何目录用于 TMP。

我不知道为什么LOGONSERVER需要,抱歉。

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

答案3

只需添加此行httpd.conf

SetEnv LOGONSERVER \\\\machine

相关内容