Настройте mod_wsgi 3.3 с Apache2.2 в Windows - PullRequest
0 голосов
/ 19 ноября 2011

Мне удалось скомпилировать mod_wsgi для Python 2.5.4. Теперь он загружен в модули Apache. Я подтвердил это командой

httpd.exe -M
.
.
wsgi_module(shared)
php5_module(shared)

Но я не могу запустить тестовый файл (hello.wsgi), он находится в папке c: / apache / htdocs / wsgi: поэтому путь к файлу становится c: /apache/htdocs/wsgi/hello.wsgi

Мой файл hello.wsgi содержит:

def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'

    response_headers = [('Content-type', 'text/plain'),
                        ('Content-Length', str(len(output)))]
    start_response(status, response_headers)

    return [output]

Я добавил следующие строки в httpd.conf:

LoadModule wsgi_module modules/mod_wsgi.so

<IfModule wsgi_module>
    WSGIScriptAlias /wsgi/ "c:/apache/htdocs/wsgi/hello.wsgi"

    <Directory "c:/apache/htdocs/wsgi">
            Order deny,allow
            allow from All
    </Directory>
</IfModule>

А мой журнал ошибок Apache:

[Sat Nov 19 15:29:32 2011] [warn] pid file C:/apache/logs/httpd.pid overwritten -- Unclean shutdown of previous Apache run?
[Sat Nov 19 15:29:32 2011] [warn] mod_wsgi: Compiled for Python/2.5.
[Sat Nov 19 15:29:32 2011] [warn] mod_wsgi: Runtime using Python/2.5.4.
[Sat Nov 19 15:29:33 2011] [notice] Apache/2.2.21 (Win32) mod_wsgi/3.3 Python/2.5.4 PHP/5.3.8 configured -- resuming normal operations
[Sat Nov 19 15:29:33 2011] [notice] Server built: Sep  9 2011 10:26:10
[Sat Nov 19 15:29:33 2011] [notice] Parent: Created child process 2296
[Sat Nov 19 15:29:33 2011] [warn] mod_wsgi: Compiled for Python/2.5.
[Sat Nov 19 15:29:33 2011] [warn] mod_wsgi: Runtime using Python/2.5.4.
[Sat Nov 19 15:29:33 2011] [notice] Child 2296: Child process is running
[Sat Nov 19 15:29:33 2011] [notice] Child 2296: Acquired the start mutex.
[Sat Nov 19 15:29:33 2011] [notice] Child 2296: Starting 64 worker threads.
[Sat Nov 19 15:29:33 2011] [notice] Child 2296: Starting thread to listen on port 80.
[Sat Nov 19 15:30:21 2011] [error] [client 127.0.0.1] File does not exist: C:/apache/htdocs/wsgi

Обновление

Я удалил косую черту из псевдонима, переместил папку wsgi из htdocs в apache и создал файл vhost:

<VirtualHost 127.0.0.1:80>
    <Directory "C:/apache/wsgi">
        Options FollowSymLinks Indexes
        AllowOverride All
        Order deny,allow
        allow from All
    </Directory>
    ServerName 127.0.0.1
    ServerAlias 127.0.0.1
    WSGIScriptAlias /wsgi "C:/apache/wsgi/hello.wsgi"
    DocumentRoot "C:/apache/wsgi"
    ErrorLog "C:/apache/logs/127.0.0.1.err"
    CustomLog "C:/apache/logs/127.0.0.1.log" combined
</VirtualHost>

Но теперь мой Apache выдает ошибку Windows, такую ​​как:

Faulting application name: httpd.exe, version: 2.2.21.0, time stamp: 0x4e6a3015
Faulting module name: ntdll.dll, version: 6.1.7601.17514, time stamp: 0x4ce7ba58
Exception code: 0xc0000005
Fault offset: 0x00038da9
Faulting process id: 0xc4c
Faulting application start time: 0x01cca6c0f9ccd446
Faulting application path: C:\apache\bin\httpd.exe
Faulting module path: C:\Windows\SysWOW64\ntdll.dll
Report Id: 3ba0b9e0-12b4-11e1-b285-005056c00008

Нужна помощь.

Спасибо.

1 Ответ

1 голос
/ 12 июля 2012

Это похоже на ошибку, которая возникла, когда распространяемый Visual C ++ 2008 (msvcr90.dll) не был установлен в системе. Но сначала, пожалуйста, проверьте (с помощью Dependency Walker), что httpd.exe и mod_wsgi.so используют абсолютно одинаковые msvcr90.dll:

  • то же имя
  • тот же каталог
  • та же версия
  • та же отметка времени

Если они используют разные имена DLL (например, msvcr90.dll и msvcr100.dll), тогда вы должны перекомпилировать оба с одним и тем же компилятором (например, Visual Studio 2008).

Если они используют одно и то же имя DLL, но разные версии или в разных каталогах, то у вас может быть та же проблема, что и у меня, с BitNami DjangoStack.

Поскольку msvcr90.dll не был установлен в масштабе всей системы в C:\Windows\WinSxS, httpd вообще мог работать только из-за «развертывания xcopy» параллельной сборки в том же каталоге, что и httpd .exe:

  • Microsoft.VC90.CRT.manifest
  • msvcr90.dll

Если бы этих файлов не было, они бы не работали из-за отсутствующей зависимости от msvcr90.dll или с этой ошибкой:

Это приложение не удалось запустить из-за неправильной конфигурации приложения. Переустановка приложения может решить эту проблему.

(т. Е. DLL была найдена, но без манифеста, чтобы сделать ее действительной).

Хотя httpd.exe работает таким образом, он не может надежно загрузить DLL, которая также использует msvcr90.dll:

  • Если DLL имеет «развертывание xcopy» в своем собственном каталоге, тогда она загрузит другую копию DLL в процесс (потому что это другая копия DLL?). Это приводит к появлению второй кучи в пространстве памяти процесса, которая может привести к сбою процесса, если память передается между DLL и httpd (выделяется одним и освобождается другим). Я думаю, это то, что вы видите.
  • Если DLL-библиотека не имеет «развертывание xcopy» в своем собственном каталоге, она не сможет загрузить ошибку SideBySide или Windows Error Reporting в системном журнале событий.

Вы можете узнать больше об этой проблеме на Python bug 4120 , хотя это не ясное, полное и окончательное объяснение проблемы, и я пока не смог найти ее.

Единственный надежный способ запустить этот стек - установить Visual C ++ 2008 распространяемый для всей системы, который помещает копию msvcr90.dll в подкаталог C:\Windows\WinSxS вместе с манифестом. чтобы заставить его работать.

Это должно (я думаю) заставить Windows полностью игнорировать файлы Microsoft.VC90.CRT.manifest и msvcr90.dll в каталогах приложений и DLL. Оба должны использовать одну и ту же DLL в C:\Windows\WinSxS, и она должна быть загружена в процесс только один раз.

...