用IIS 6托管Mercurial

16 投票
5 回答
3872 浏览
提问于 2025-04-15 13:12

我正在尝试在Windows Server 2003上通过IIS设置Mercurial仓库。根据这篇文章,我安装了Python 2.5.4.4和Mercurial 1.3,设置了虚拟目录,解压了library.zip,并创建了hgwebdir.config。

但是,当我尝试打开http://hostname/hg/hgwebdir.cgi时,出现了一个错误:“指定的CGI应用程序没有返回完整的HTTP头。”我尽力去解决这个问题:

  1. 检查了IIS对.py和.cgi扩展名的映射。我甚至尝试使用FastCGI,但没有成功。
  2. 在同一个目录下创建了一个“Hello World”程序,并确认它可以正常工作。
  3. 检查了IUSR、IWAM和NETWORK SERVICE对Python、IIS和仓库目录的读取和执行权限。
  4. 尝试应用来自Mercurial邮件列表的两个不同补丁。由于这两个补丁都比较旧,我没有成功。
  5. 安装了Sysinternals的procmon,检查请求期间的文件系统错误。除了在Python进程加载库时出现大量缓冲区溢出结果外,我没有发现其他问题。
  6. 尝试在脚本中添加'Content-type: text/html'。

还有一件事是,当我请求一个不存在的脚本文件(例如/hg/inexist.cgi)时,也会出现同样的错误。没有任何方法有效!

5 个回答

2

在我的情况下,这个错误是因为在 hgweb.cgi 文件中的这一行 application = hgwebdir('c:\somewhere\hgweb.config') 出现了问题,正确的写法应该是 application = hgweb('c:\somewhere\hgweb.config')

另外,如果你在 hgweb.cgi 文件中取消注释这一行 import cgitb; cgitb.enable(),那么你会得到更多关于错误的信息(还有其他错误的信息)。

附注:我在 Windows Server 2003 上使用的是 Python 2.6.6 和 Mercurial 1.7.3,搭配 IIS 6.0。

6

还有一些我需要修复的事情:

  • 在各种HOWTO文档中提到使用 c:\whatever\Python26\python.exe -u "%s" "%s",其实应该用 c:\whatever\Python26\python.exe -u -O -B "%s" "%s"。这里的 -O 让它也去找 .pyo 文件(不仅仅是 .py 或 .pyc,至少在我的版本中没有找到这些文件)。而 -B 则是让它不去尝试把找到的 .py 文件编译成 .pyo 文件(因为没有写权限,这个过程会失败)。
  • 我安装的是 Python 2.7,而 Mercurial 1.6.2 的 .pyo 文件是用 Python 2.6 编译的。这导致了一个魔法数字错误。卸载 2.7 然后安装 2.6.5 解决了这个问题。(如果你在未来的某个时间点看到这个,可能这个问题就不再适用了 - 检查一下 Mercurial 目录或者 TortoiseHg 目录下的 DLL 名称,看看你是从哪里拿的 library.zip)
  • hgwebdir.cgi 现在改名为 hgweb.cgi - webdir 的功能已经整合进来了。
1

最后,我在任何Python脚本中都遇到了“没有头部”的错误,所以我用控制台解释器检查了脚本,并修复了配置文件中的错误。当然,我应该在ServerFault上问这个问题,而不是在StackOverflow上——缺乏睡眠真是害人不浅 :)

撰写回答