Django を Apache と mod_wsgi とともに使うには?

Apachemod_wsgi と共にDjangoをデプロイすることは、Djangoを製品とする際に試され、テストされた方法です。

mod_wsgi は、Djangoを含む任意のPythonのW​​SGI_アプリケーションをホストできるApacheのモジュールです。 Djangoはmod_wsgiをサポートしているApacheのすべてのバージョンで動作します。

`公式のmod_wsgiのドキュメント`_は素晴らしいです。mod_wsgiの使用方法に関するすべての詳細についての情報源です。 `インストールと構成のドキュメント`_から開始すると良いかと思います。

基本設定

Once you’ve got mod_wsgi installed and activated, edit your Apache server’s httpd.conf file and add the following. If you are using a version of Apache older than 2.4, replace Require all granted with Allow from all and also add the line Order deny,allow above it.

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

<Directory /path/to/mysite.com/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

WSGIScriptAlias​​ の行の最初の部分は、あなたがアプリケーションを提供したいベースとなるURLパスであり( / ルートURLを示している)、二番目の部分はシステムの WSGI file の場所 (下記参照) です。大抵はプロジェクトパッケージ (本例では mysite ) の内部です。これは、そのファイルで定義された WSGI アプリケーションを使用して、指定された URL 以下のすべての要求にサービスを提供するように Apache に指示します。

If you install your project’s Python dependencies inside a virtualenv, add the path to the virtualenv using WSGIPythonHome. See the mod_wsgi virtualenv guide for more details.

WSGIPythonPath の行は、プロジェクトのパッケージは Python のパス上でインポートすることが可能であることを保証します。言い換えると、 import mysite が動作することを保証します。

<Directory> 部分により、Apache が wsgi.py ファイルにアクセスできるようになります。

次に、この wsgi.py がWSGIアプリケーションのオブジェクトで存在することを確認する必要があります。 Djangoのバージョン1.4現在、 startproject を実行した際に作成されます ; それより前のバージョンでは、あなたはそれを作成する必要があります。 WSGI概要ドキュメント を参照し、デフォルトのコンテンツや、その他の必要な記載をこのファイルに追加してください。

警告

複数の Django のサイトが単一の mod_wsgi プロセスで実行されている場合は、それらのすべては、最初に実行されたものの設定を使用します。これを解消するには、次の

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")

という wsgi.py 内のコードを、次のように変更します。

os.environ["DJANGO_SETTINGS_MODULE"] = "{{ project_name }}.settings"

もしくは、 mod_wsgi のデーモンモード を使用することで、各サイトをそれぞれ独立したデーモンプロセスで実行できるようにします。

ファイルアップロード時の UnicodeEncodeError を修正する

非 ASCII 文字を含む名前を持つファイルのアップロードする時に UnicodeEncodeError が発生する場合は、Apache が非 ASCII 文字を含むファイル名を許容する設定になっていることを確認してください。

export LANG='en_US.UTF-8'
export LC_ALL='en_US.UTF-8'

この設定はふつう /etc/apache2/envvars で可能です。

詳細については、Unicode リファレンスガイドの Files セクションを参照してください。

mod_wsgi をデーモンモードで使用する

デーモンモード はmod_wsgiを (Windows以外のプラットフォーム上で) 実行するための推奨モードです。必要なデーモンプロセスグループを作成し、その中で起動するための Djangoのインスタンスを委任するためには、適切な `` WSGIDaemonProcess`` と `` WSGIProcessGroup`` ディレクティブを追加する必要があります。デーモンモードを使用する場合には WSGIPythonPath を使用できないため、上記設定にさらなる変更が求められます。代わりに WSGIDaemonProcesspython-path オプションを使用する必要があります。例えば、

WSGIDaemonProcess example.com python-home=/path/to/venv python-path=/path/to/mysite.com
WSGIProcessGroup example.com

サブディレクトリでプロジェクトを提供したい場合は(本例では https://example.com/mysite となります) 、 WSGIScriptAlias を設定の上部に追記します。

WSGIScriptAlias /mysite /path/to/mysite.com/mysite/wsgi.py process-group=example.com

詳細については、公式の mod_wsgi のドキュメント details on setting up daemon mode を参照してください。

ファイルを配信する

Django 自体はファイルを配信せず、Web サーバにそのジョブを委ねます。

メディアの配信には、Django を実行しているのとは別の Web サーバメディアを使用することをお勧めします。以下のサーバーは良い選択です。

しかし、Django と同じ Apache の VirtualHost からメディアファイルを配信しなければならない場合には、一部の URL を静的メディアを配信するように設定し、その他の URL を Django への mod_wsgi のインターフェイスとして設定することができます。

この例では、サイトのルートには Django を設定していますが、 robots.txtfavicon.ico/static/ 、そして /media/ の URL 空間は静的ファイルとして配信しています。他のすべての URL は mod_wsgi を使用して配信されます。

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

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

<Directory /path/to/mysite.com/static>
Require all granted
</Directory>

<Directory /path/to/mysite.com/media>
Require all granted
</Directory>

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

<Directory /path/to/mysite.com/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

2.4 よりも古いバージョンの Apache を使用している場合は、 Require all grantedAllow from all に置き換え、さらにその行の上に Order deny,allow を追加します。

admin ファイルを配信する

Django の開発サーバは、 django.contrib.staticfilesINSTALLED_APPS に存在する場合、自動的に 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 のドキュメントルートに置きます。

Django のユーザーデータベースに対する Apache からの認証

DjangoはApacheがDjangoの認証バックエンドに対して直接ユーザを認証できるようにハンドラを提供します。 mod_wsgi 認証ドキュメント を参照してください。