我最近在我们的一台 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