# Django 5.0.9.dev20240806133106 ドキュメント

# Django を Apache と `mod_wsgi` とともに使うには？

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

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

mod_wsgi の使い方の詳細については、the official mod_wsgi documentation を参照してください。installation and configuration documentation から始めるとよいでしょう。

## 基本設定

mod_wsgiをインストールして有効にしたら、Apacheサーバーの httpd.conf ファイルを編集して、以下を追加します。

    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 に指示します。

プロジェクトの Python 依存ファイルを `virtual environment` 内にインストールする場合は、 `WSGIPythonHome` を使ってパスを追加します。詳しくは mod_wsgi virtual environment guide を参照してください。

`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 が UTF-8 エンコーディングをサポートするように設定されていることを確認してください:

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

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

代わりに、 mod_wsgi のデーモンモード を使用している場合は `WSGIDaemonProcess` ディレクティブに `lang` と `locale` オプションを追加できます:

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

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

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

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

メディアの配信には、別の Web サーバー、つまり Django を動かしていないサーバを使うことをお勧めします。以下は良い選択です:

- Nginx
- Apache の機能縮小版

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

この例では、サイトのルートには Django を設定していますが、 `robots.txt` 、 `favicon.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 ファイルを配信する

`django.contrib.staticfiles` が `INSTALLED_APPS` にある場合、 Django の開発サーバーは自動的に管理アプリ（や他のインストールされたアプリ）の静的ファイルを提供します。しかし、他のサーバを使う場合はそうはいきません。管理アプリの静的ファイルを提供するように、 Apache や、使っているWebサーバーを設定するのはあなたの責任です。

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

強く 推奨される方法は、 `django.contrib.staticfiles` を使用して管理ファイルを処理することです（前のセクションで説明されているように、Webサーバーと併用します。これは、 `STATIC_ROOT` に静的ファイルを集めるために `collectstatic` 管理コマンドを使用し、その後、Webサーバーを設定して `STATIC_ROOT` を `STATIC_URL` で提供することを意味します）。しかし、他にも次の3つのアプローチがあります:

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

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

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