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

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

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

The official mod_wsgi documentation is your source for all the details about how to use mod_wsgi. You'll probably want to start with the installation and configuration documentation.

基本設定

Once you've got mod_wsgi installed and activated, edit your Apache server's httpd.conf file and add the following.

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 virtual environment, add the path using WSGIPythonHome. See the mod_wsgi virtual environment guide for more details.

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

The <Directory> piece ensures that Apache can access your wsgi.py file.

次に、この 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 を修正する

If you get a UnicodeEncodeError when uploading or writing files with file names or content that contains non-ASCII characters, make sure Apache is configured to support UTF-8 encoding:

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

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

Alternatively, if you are using mod_wsgi daemon mode you can add lang and locale options to the WSGIDaemonProcess directive:

WSGIDaemonProcess example.com lang='en_US.UTF-8' locale='en_US.UTF-8'

詳細については、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 doesn't serve files itself; it leaves that job to whichever web server you choose.

We recommend using a separate web server -- i.e., one that's not also running Django -- for serving media. Here are some good choices:

しかし、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>

admin ファイルを配信する

When django.contrib.staticfiles is in INSTALLED_APPS, the Django development server automatically serves the static files of the admin app (and any other installed apps). This is however not the case when you use any other server arrangement. You're responsible for setting up Apache, or whichever web server you're using, to serve the admin files.

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

We strongly recommend using django.contrib.staticfiles to handle the admin files (along with a web server as outlined in the previous section; this means using the collectstatic management command to collect the static files in STATIC_ROOT, and then configuring your web server to serve STATIC_ROOT at STATIC_URL), but here are three other approaches:

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

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

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