2012-09-02 371 views
6

如何在OS X Server 2.0上部署Django應用程序,而不使用自制軟件或與OS X 10.8.1一起發佈的Python的不同風格?我在Django應用程序中使用可可綁定,並且無法在桌面機器上使用自制軟件(運行OS X 10.8.1);因此請求在系統安裝的Python版本上部署應用程序。如何在OS X服務器上部署django應用程序?

我有以下的OS X Server環境中,已經安裝了以下情況:

  • OS X 10.8.1
  • OS X Server 2.0的
  • 的Python 2.7.2
  • 的Apache 2.2。 22

使用以下命令安裝了Django 1.4.1:

sudo easy_install django 

我的第一個嘗試是部署一個空的網站,一旦成功,部署一個真正的應用程序用於生產。該項目是使用下面的命令

django-admin.py startproject mysite 

/Library/Server/Web/Data/WebApps/mysite/創建我使用下面的命令運行應用程序。它只是確認應用程序已啓動並正在運行。這是標準的「它的工作!」當你第一次創建一個項目時。

python manage.py runserver 8080 

我然後創建的文件/Library/Server/Web/Config/apache2/httpd_mysite.conf使用以下內容:

WSGIScriptAlias /mysite /Library/Server/Web/Data/WebApps/mysite/mysite/wsgi.py 

我還創建的文件/Library/Server/Web/Config/apache2/webapps/com.example.mysite.wsgi.plist使用以下內容:

<?xml version="1.0" encoding="UTF-7"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
     <key>name</key> 
     <string>com.example.mysite.wsgi</string> 
     <key>displayName</key> 
     <string>Python "My Site" app</string> 
     <key>launchKeys</key> 
     <array/> 
     <key>proxies</key> 
     <dict/> 
     <key>installationIndicatorFilePath</key> 
     <string>/Library/Server/Web/Data/WebApps/mysite/mysite/wsgi.py</string> 
     <key>includeFiles</key> 
     <array> 
       <string>/Library/Server/Web/Config/apache2/httpd_mysite.conf</string> 
     </array> 
     <key>requiredModuleNames</key> 
     <array> 
       <string>wsgi_module</string> 
     </array> 
</dict> 
</plist> 

文件com.example.mysite.wsgi.plist改編自com.apple.webapp.wsgi.plisthttpd_mysite.conf改編自httpd_wsgi.conf。這兩個文件都用於在通過服務器管理器進行配置時成功運行「standalone」python應用程序。

然後我用服務器管理器創建了一個站點,確認我的應用程序在Web應用程序列表中。但是,當我訪問http://example.com/mysite時,出現500錯誤。日誌具有以下條目(IP地址改爲1.2.3.4隱私原因):

[Sat Sep 01 21:49:17 2012] [warn] Init: Name-based SSL virtual hosts only work for clients with TLS server name indication support (RFC 4366) 
[Sat Sep 01 21:49:17 2012] [notice] Apache/2.2.22 (Unix) PHP/5.3.13 with Suhosin-Patch mod_wsgi/3.3 Python/2.7.2 mod_fastcgi/2.4.6 mod_ssl/2.2.22 OpenSSL/0.9.8r DAV/2 configured -- resuming normal operations 
[Sat Sep 01 21:50:13 2012] [error] [client 1.2.3.4] (8)Exec format error: exec of '/Library/Server/Web/Data/WebApps/mysite/mysite/wsgi.py' failed 
[Sat Sep 01 21:50:13 2012] [error] [client 1.2.3.4] Premature end of script headers: wsgi.py 

它似乎沒有了WSGI模塊處理該請求,而是請求可以使用FCGI處理。但是,日誌表明mod_wsgi/3.3已加載。

當我創建了一個標準的Python應用程序,如下所示:

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] 

而且更新文件指向/Library/Server/Web/Data/WebApps/helloworld.wsgi而非/Library/Server/Web/Data/WebApps/mysite/mysite/wsgi.py那麼「Hello World」的顯示。因此,我假定wsgi配置正確並且能夠執行應用程序,而且我的設置還有其他問題。

回答

0

與發行版的Apache的一些配置映射的.py要麼CGI或FASTCGI,這將與mod_wsgi的衝突。這就是爲什麼mod_wsgi建議使用.wsgi擴展名。因此,將'wsgi.py'重命名爲'site.wsgi',然後在WSGIScriptAlias中使用'site.wsgi'。

順便說一下,你能否確認在Mountain Lion服務器中有預編譯的mod_wsgi.so。

+0

它被安裝在'/ Applications/Server.app/Contents/ServerRoot/usr/libexec/apache2/mod_wsgi.so' – bloudraak

+0

你是對的,把'wsgi.py'重命名爲'mysite.wsgi',調用'mod_wsgi'。我遇到了其他問題,這可以通過在mysite.wsgi中使用'sys.path.append'添加路徑來解決,如[本答案](http:// stackoverflow)中所述。COM /問題/ 2587251 /配置問題的-與-的Django和MOD-WSGI)。謝謝。 – bloudraak

-1

兩件事情:

  1. 如果你想使用WSGIScriptAlias指令,你需要有mod_wsgi的Apache模塊。我沒有OS X服務器,但據我所見,該模塊不存在於山獅標準的/ usr/libexec/apache2文件夾中。你必須從here下載它。不知道命令行工具是否包含在OS X服務器中。我確實需要安裝X代碼才能使它們成爲標準版本。似乎有一些instruction on how to install it on macos x

  2. 看看Homebrew。這是向mac添加額外軟件的好方法。轉過頭來,你可以安裝最新的python,nginx和uwsgi。 Nginx和uwsgi是部署django應用程序的好方法。我發現它比mod_wsgi更加靈活和高效(第二點非常主觀)。

好運

+0

mod_wsgi包可能不在Mountain Lion標準中,但我在發佈之前發佈的報告表示它是在Mountain Lion服務器上。儘管自發布以來尚未得到確認。 –

+0

該模塊存在'/ Applications/Server.app/Contents/ServerRoot/usr/libexec/apache2/mod_wsgi.so' – bloudraak

+0

正如我的問題所述,我在我的應用程序中使用Cocoa綁定,並且遇到了一些麻煩使用Homebrew工作。因此,我寧願避免它。 – bloudraak

1

我發現自己努力將我的macports django遷移到Mountain Lion Server 10.8.2,出於某種原因,這裏的答案幫助我記住了mod_wsgi.so的差異。

我用/opt/local/apache2/modules/mod_wsgi.so覆蓋了/Applications/Server.app/Contents/ServerRoot/usr/libexec/apache2/mod_wsgi.so。

我希望完全刪除MacPorts apache2,但我想我最好保留它。目前我仍然更喜歡MacPorts Python,因爲它更容易跟上數字密集型軟件包的更新。

是的,還請確保您將wsgi.py更改爲wsgi.wsgi。

我將httpd_wsgi.conf複製到httpd_mywsgi.conf;我將我的django.wsgi添加到/ Library/Server/Web/Data/WebApps。
在/ Library/Server/Web/Config/apache2/webapps中,我複製了com.apple.webapp.wsgi.plist。

它看起來像你選擇了同樣的plist模式。

我仍然在研究我的靜態內容,但是,認爲mod_wsgi.so發現可以幫助其他人從MacPorts遷移。

+1

如果更新mod_wsgi,則您的.so文件將在操作系統更新中被覆蓋。你應該把你的版本放到其他地方,並在Apache配置中更改mod_wsgi的LoadModule行。 –

+0

好點@GrahamDumpleton,每當你發現自己複製加載模塊時,它就是一個紅旗。 – zerocog

相關問題