我能够为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
需要一些帮助。
感谢。
答案 0 :(得分:1)
这听起来像我在系统上未安装Visual C ++ 2008 Redistributable(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
以这种方式运行,但它无法可靠地加载也使用msvcr90.dll
的DLL:
您可以在Python bug 4120上看到有关此类问题的更多信息,虽然这不是对问题的明确,完整和明确的解释,但我还没有找到。
我发现运行此堆栈的唯一可靠方法是在系统范围内安装Visual C++ 2008 redistributable,将msvcr90.dll
的副本放在C:\Windows\WinSxS
的子目录中,并附带清单让它发挥作用。
这应该(我认为)导致Windows完全忽略应用程序和DLL目录中的Microsoft.VC90.CRT.manifest
和msvcr90.dll
文件。两者都应该在C:\Windows\WinSxS
中使用相同的DLL,并且只能将其加载到进程中一次。