Хостинг Mercurial с IIS 6
Я пытаюсь настроить репозитории Mercurial, которые будут размещены IIS под Windows Server 2003. После этого сообщения я установил Python 2.5.4.4 и Mercurial 1.3, установил виртуальный каталог, извлеченный library.zip и созданный hgwebdir.config.
Однако, когда я пытаюсь открыть http://hostname/hg/hgwebdir.cgi, я получил сообщение об ошибке "Указанное приложение CGI плохо себя ведет, не возвращая полный набор заголовков HTTP." Я сделал все:
- Проверено сопоставление IIS для обоих .py и .cgi-расширений. Я даже пытался использовать FastCGI без успеха.
- Создал "Hello World" в том же каталоге и проверил, что он отлично работает.
- Проверено разрешение на чтение/выполнение в каталогах Python, IIS и repos для IUSR, IWAM и NETWORK SERVICE.
- Попробовал применить два разных патча от Mercurial listing list. Поскольку они оба старые, я не добился успеха.
- Инсталлировать обработчик Sysinternals и проверить ошибки файловой системы во время запроса. Я ничего не нашел, кроме большого количества переполнений буфера в процессе Python, когда он загружает библиотеки.
- Попробовал добавить 'Content-type: text/html' в script.
Еще одна вещь, когда я запрашиваю файл inexistent script (например,/hg/inexist.cgi), у меня такая же ошибка. Ничего не помогло!
Ответы
Ответ 1
Наконец, я получил ошибку "no headers", возвращаемую при любой ошибке python script, поэтому я проверил script с помощью консольного интерпретатора и исправил ошибки в моем файле конфигурации. И, конечно, я должен задать этот вопрос в ServerFault вместо StackOverflow - недостаток сна сделал задание:)
Ответ 2
Еще кое-что, что мне нужно было исправить:
- В тех случаях, когда различные HOWTO говорят использовать
c:\whatever\Python26\python.exe -u "%s" "%s"
вместо использования c:\whatever\Python26\python.exe -u -O -B "%s" "%s"
-O, он также ищет файлы .pyo(а не только .py или .pyc, которые по крайней мере в моей версии не присутствовали). -B заставляет его не пытаться скомпилировать файлы .pyo, которые он находит в .pyo файлах (которые не работают из-за отсутствия разрешений на запись)
- Я установил Python 2.7. Файлы Mercurial 1.6.2.pyo были скомпилированы с помощью Python 2.6. Это привело к ошибке магического числа. Удаление 2.7 и установка 2.6.5 исправили это. (Если вы читаете это в какой-то момент в будущем, эта точка больше не может быть релевантной - проверьте имя DLL в каталоге Mercurial или каталог TortoiseHg, в зависимости от того, откуда вы взяли файл library.zip)
- hgwebdir.cgi теперь только hgweb.cgi - webdir был интегрирован в него
Ответ 3
Там довольно хороший пост в http://vampirebasic.blogspot.com/2009/06/running-mercurial-on-windows.html, который поможет вам начать, но если вам нужно больше деталей или идти дальше, чем писатель сделал, у меня есть 4-страничное сообщение в блоге, которое охватывает все, что вам нужно знать о том, как вставать и работать в IIS, включая интеграцию с Active Directory, привилегии pull/push, настройку пользовательского интерфейса:
http://www.endswithsaurus.com/2010/05/setting-up-and-configuring-mercurial-in.html
Стоит прочитать...
Ответ 4
В моей ситуации эта ошибка, вызванная линией application = hgwebdir('c:\somewhere\hgweb.config')
в hgweb.cgi, должна быть application = hgweb('c:\somewhere\hgweb.config')
.
Кроме того, строка uncomment import cgitb; cgitb.enable()
в hgweb.cgi даст вам больше информации об ошибке (и других ошибках).
P.S. Я использую Python 2.6.6 и Mercurial 1.7.3 на Windows Server 2003 с IIS 6.0.
Ответ 5
В моем случае критический шаг, который исправил его, заключался в использовании: c:\whatever\Python26\python.exe -u -O -B "% s" "% s
До этого он не работал с ошибкой:
A problem occurred in a Python script. Here is the sequence of function calls leading up to the error, in the order they occurred.
c:\hg\hgweb.cgi in ()
13 import cgitb; cgitb.enable()
14
15 from mercurial import demandimport; demandimport.enable()
16 from mercurial.hgweb import hgweb, wsgicgi
17 application = hgweb(config)
mercurial undefined, demandimport undefined
<type 'exceptions.ImportError'>: No module named mercurial
args = ('No module named mercurial',)