2012-09-02 11 views
6

homebrewを使わずにOS X Server 2.0にDjangoアプリケーションを配備する方法や、OS X 10.8.1に同梱されていないPythonとは違う方法はありますか?私はDjangoアプリケーションでココアバインディングを使用していて、自分のデスクトップマシン(自作OS X 10.8.1を実行中)でhomebrewと連携させることができませんでした。したがって、Pythonのシステムインストールバージョンにアプリケーションをデプロイするリクエスト。OS X Serverに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 

最初に空のWebサイトを展開し、それが成功すると、実稼働環境で使用される実際のアプリケーションを展開します。このプロジェクトは、私は、次のコマンドを使用してアプリケーションを実行した次のコマンド

django-admin.py startproject mysite 

を使用して/Library/Server/Web/Data/WebApps/mysite/で作成されました。単にアプリケーションが起動していることを確認しました。それは標準である "それは働いた!"最初にプロジェクトを作成したときのページです。

python manage.py runserver 8080 

私は、次の内容のファイル/Library/Server/Web/Config/apache2/httpd_mysite.conf作成:私は、さらに次の内容のファイル/Library/Server/Web/Config/apache2/webapps/com.example.mysite.wsgi.plistを作成

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

を:

<?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.plistcom.apple.webapp.wsgi.plistから適応されましたhttpd_mysite.confhttpd_wsgi.confに適合しています。これらのファイルは両方とも、サーバーマネージャーを使用して構成されたときに「スタンドアロン」の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を指すようにファイルを更新します。したがって、私はwsgiが正しく構成されており、アプリケーションを実行できると想定し、セットアップに間違いがあると仮定します。

答えて

0

幸運。これは、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'を呼び出しました。私は他の問題に遭遇しました。これは、[this answer](http:// stackoverflow)で説明されているように、 'mysite.wsgi'に' sys.path.append'を使ってパスを追加することで解決しました。com/questions/2587251/configuration-problems-with-django-and-mod-wsgi)を参照してください。ありがとう。 – bloudraak

-1

2つのこと:

  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よりも柔軟性が高く、効率的です(この第2のポイントは非常に主観的です)。

のディストリビューションでのいくつかのApacheの設定は、CGIやFASTCGIのいずれかにマップの.py、これはmod_wsgiをと競合する

+0

mod_wsgiパッケージはMountain Lion標準にはないかもしれませんが、リリース前の報告ではMountain Lionサーバーに入っていたとのことです。まだリリースされて以来、それを確認していない。 –

+0

モジュールは '/ Applications/Server.app/Contents/ServerRoot/usr/libexec/apache2/mod_wsgi.so'にあります。 – bloudraak

+0

私の質問で説明したように、私はアプリケーションでCocoaバインディングを使用しています。自作を使った仕事。私はむしろそれを避けるだろう。 – bloudraak

1

私は自分のMacports djangoをMountain Lion Server 10.8.2に移行するのに苦労していましたが、何らかの理由でここでの答えがmod_wsgi.soの違いを覚えていました。

私は/applications/Server.app/Contents/ServerRoot/usr/libexec/apache2/mod_wsgi.soを/opt/local/apache2/modules/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

.soファイルは、mod_wsgiを更新すると、OSアップデートでオーバーライドされます。 Apacheの設定で、あなたのバージョンを別の場所に置き、mod_wsgiのLoadModule行を変更してください。 –

+0

良い点@GrahamDumpleton。ロードモジュールをコピーしているときはいつも赤い旗です。 – zerocog