在Windows上使用Apache2.2配置mod_wsgi 3.3

时间:2011-11-19 10:14:08

标签: mod-wsgi python-2.5 apache2.2

我能够为Python 2.5.4编译mod_wsgi。它现在加载到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&amp;创建了一个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 个答案:

答案 0 :(得分:1)

这听起来像我在系统上未安装Visual C ++ 2008 Redistributable(msvcr90.dll)时出现的错误。但首先,请检查(使用Dependency Walker)httpd.exemod_wsgi.so使用完全相同的msvcr90.dll

  • 同名
  • 同一目录
  • 相同版本
  • 同一时间戳

如果他们使用不同的DLL名称(例如msvcr90.dllmsvcr100.dll),则必须使用相同的编译器重新编译(例如Visual Studio 2008)。

如果他们使用相同的DLL名称,但是使用不同的版本或不同的目录,那么您可能遇到与BitNami DjangoStack相同的问题。

由于msvcr90.dll未在系统范围内安装C:\Windows\WinSxShttpd只能运行,因为并行程序集的“xcopy部署”在与httpd.exe相同的目录中:

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

如果这些文件不存在,由于缺少对msvcr90.dll的依赖,它会失败,或者出现此错误:

  

此应用程序无法启动,因为应用程序配置不正确。重新安装应用程序可能会解决此问题。

(即找到了DLL,但没有明确证明它有效)。

虽然httpd.exe以这种方式运行,但它无法可靠地加载也使用msvcr90.dll的DLL:

  • 如果DLL在其OWN目录中有“xcopy部署”,那么它会将DLL的另一个副本加载到进程中(因为它是DLL的不同副本?)。这导致进程内存空间中的第二个堆,如果在DLL和httpd之间传递内存(由一个分配并由另一个释放),则可能导致进程崩溃。我认为这就是你所看到的。
  • 如果DLL 在其自己的目录中有“xcopy部署”,则无法在系统事件日志中加载SideBySide或Windows错误报告错误。

您可以在Python bug 4120上看到有关此类问题的更多信息,虽然这不是对问题的明确,完整和明确的解释,但我还没有找到。

我发现运行此堆栈的唯一可靠方法是在系统范围内安装Visual C++ 2008 redistributable,将msvcr90.dll的副本放在C:\Windows\WinSxS的子目录中,并附带清单让它发挥作用。

这应该(我认为)导致Windows完全忽略应用程序和DLL目录中的Microsoft.VC90.CRT.manifestmsvcr90.dll文件。两者都应该在C:\Windows\WinSxS中使用相同的DLL,并且只能将其加载到进程中一次。