2011-11-19 87 views
0

我能夠爲Python 2.5.4編譯mod_wsgi。它現在被加載到Apache模塊中。我證實,它通過命令在Windows上使用Apache2.2配置mod_wsgi 3.3

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

但我無法運行測試文件(hello.wsgi),它位於文件夾C:/阿帕奇/ htdocs中/ WSGI:所以文件的路徑變爲C:/阿帕奇/ 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和&創建一個虛擬主機文件:

<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

這聽起來像我在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只能夠在所有的,因爲在同一個目錄中的httpd側面由端組件的「Xcopy部署」運行。EXE:

This application has failed to start because the application configuration is incorrect. Reinstalling the application may fix this problem.

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

如果這些文件不在場,它會對msvcr90.dll與此錯誤失敗,原因是缺少相關性,要不然

(即發現DLL但沒有清單使其有效)。

雖然httpd.exe運行這種方式,它是不能夠可靠地加載還採用msvcr90.dll一個DLL:

  • 如果DLL有它自己的目錄中的「Xcopy部署」,那麼它會加載另一將DLL複製到進程中(因爲它是DLL的不同副本?)。這會在進程內存空間中產生第二個堆,如果在DLL和httpd之間傳遞內存(由一個分配並由另一個分配),則會導致進程崩潰。我認爲這是你所看到的。
  • 如果DLL確實是而不是在其自己的目錄中有一個「xcopy deployment」,那麼它將無法加載系統事件日誌中的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,並且它只應該加載到該進程中一次。