Apache と mod_wsgi 環境で Django を使う方法

revision-up-to:17812 (1.4)

Apachemod_wsgi の組み合わせは、推奨の Django の実運用環境です。

mod_wsgi は、 Django を含む WSGI インタフェース をサポートする Python アプリ ケーションを運用するときに使う Apache のモジュールです。 Django は mod_wsgi をサポートするすべてのバージョンの Apache 上で動作します。

mod_wsgi の公式ドキュメント はすばらしい出来で、 mod_wsgi を使う上で必要 なことがすべて書かれています。まずは インストールと設定のガイド から読み 始めるとよいでしょう。

基本的な設定

mod_wsgi をインストールして有効にしたら、 httpd.conf ファイルを編集して、 以下の宣言を追加してください:

WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
WSGIPythonPath /path/to/mysite.com

<Directory /path/to/mysite.com/mysite>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>

WSGIScriptAlias の行の最初の引数は、アプリケーションを公開する場所 (/ はルート URL を表しています)、二つ目の引数はシステム上の「WSGI ファイル(後 述)」の場所です。 WSGI は通常、プロジェクトパッケージ (この例では mysite) の中に置きます。これで、 Apache はルート URL 以下のすべてのリクエストを、指定 の WSGI ファイルを使って処理します。

WSGIPythonPath の行は、プロジェクトのパッケージが Python パスでのインポー トで使えることを保証します。

<Directory> の部分は Apache が wsgi.py ファイルにアクセスできるこ とを保証します。

次に wsgi.py に WSGI application オブジェクトが含まれていることを保証 する必要があります。 Django 1.4 では、 startproject がそのファイルを作ってくれるでしょ う。それ以前のバージョンでは、自分で作成する必要があります。 このファイルに書くべき内容と、追加できる内容については WSGI 概要ドキュメ ント を参照してください。

virtualenv を使う

virtualenv の中にプロジェクトが依存する Python モジュールをインストールして いるなら、 virtualenv の site-packages ディレクトリも Python パスに追加す る必要があります。そのためには、 Apache の設定にもう一行追加してください:

WSGIPythonPath /path/to/your/venv/lib/python2.X/site-packages

virtualenv への正しいパスを設定しているか、 python2.X を正しい Python バー ジョン (python2.7 のような) で置き換えているかを確認してください。

mod_wsgi のデーモンモードを使う

「デーモンモード」は mod_wsgi を (Windows 以外のプラットフォームで) 動かすとき にお勧めのモードです。デーモンモードでの設定方法の詳細は mod_wsgi の公式ドキュメント を参照してください。デーモンモードを使う時に唯 一必要になる変更は、上の設定の WSGIPythonPath は使えず、代わりに python-path オプションを WSGIDaemonProcess に渡す必要があることです。 例:

WSGIDaemonProcess example.com python-path=/path/to/mysite.com:/path/to/venv/lib/python2.7/site-packages

メディアファイルの公開

Django 自身には、メディアファイルを自動的に公開する機能はありません。メディ アファイルの公開は Web サーバの仕事です。

メディアファイルの公開には、別個の Web サーバ、つまり Django を動作させてい ない別のサーバを使うよう勧めます。以下のようなサーバが、選択肢としておすす めです:

メディアファイルを Django が稼働しているのと同じ VirtualHost で公開せざ るを得ない場合には、 Apache を設定して、ある URL では静的なメディアを公開し、 別の URL では mod_wsgi インタフェースを介して Django に処理させるよう設定で きます。

以下の例では、 Django にサイトルート以下へのリクエストを処理させながら、 robots.txt, favicon.ico, CSS ファイル、および /media/ URL空間以 下のすべてのファイルは静的ファイルとして mod_wsgi に処理させます:

Alias /robots.txt /path/to/mysite.com/static/robots.txt
Alias /favicon.ico /path/to/mysite.com/static/favicon.ico

AliasMatch ^/([^/]*\.css) /path/to/mysite.com/static/styles/$1

Alias /media/ /path/to/mysite.com/media/
Alias /static/ /path/to/mysite.com/static/

<Directory /path/to/mysite.com/static>
Order deny,allow
Allow from all
</Directory>

<Directory /path/to/mysite.com/media>
Order deny,allow
Allow from all
</Directory>

WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py

<Directory /path/to/mysite.com/mysite>
<Files wsgi.py>
Order allow,deny
Allow from all
</Files>
</Directory>

admin のファイルを公開する

Django の開発サーバは自動的に admin アプリケーションの静的ファイル (他のインス トールされたアプリケーションも) を公開しますが、他のサーバ編成を使っている時は そうなりません。 Apache や使用しているメディアサーバを設定し、 admin のファイ ルを公開できるようにしなければなりません。

admin ファイルは Django ディストリビューションの (django/contrib/admin/static/admin) にあります。

django.contrib.staticfiles を使って admin ファイルを扱うことを強くお勧 めします。 (前のセクションで概要を説明したように Web サーバを設定します。つま り collectstatic 管理コマンドを使って静的ファイルを STATIC_ROOT に集め、 Web サーバが STATIC_ROOTSTATIC_URL の場所で公開するよう設定します) しかし以下では別の方法を 3 つ挙げましょう:

  1. ドキュメントルートに admin の静的ファイルへのシンボリックを作ります。 (Apache の設定に +FollowSymLinks が必要になるでしょう)
  2. 上で示したように Alias ディレクティブを使って、適切な URL (おそらく STATIC_URL + admin/) から admin ファイルがある実際の場所へのエ イリアスを作ります。
  3. admin の静的ファイルをコピーし、 Apache のドキュメントルートに置きます。