DjangoをApacheとmod_wsgiで動かす方法:初心者向けチュートリアル


このガイドでは、Apacheウェブサーバーとmod_wsgiモジュールを使ってDjangoアプリケーションをデプロイする方法を説明します。これは、Djangoアプリケーションを本番環境にデプロイする最も一般的な方法の一つです。

前提知識

このガイドを理解するには、以下の知識が必要です。

  • コマンドラインツールの基本的な知識
  • mod_wsgiモジュールの知識
  • Apacheウェブサーバーの知識
  • Djangoの基本的な知識

手順

  1. 必要なソフトウェアをインストールする

    まず、Django、Apache、mod_wsgiをインストールする必要があります。それぞれのインストール方法は、お使いのオペレーティングシステムによって異なります。

  2. Djangoプロジェクトを作成する

    Djangoプロジェクトを作成するには、以下のコマンドを実行します。

    django-admin startproject myproject
    

    このコマンドは、myprojectという名前のDjangoプロジェクトを作成します。

  3. Djangoアプリケーションを作成する

    Djangoアプリケーションを作成するには、以下のコマンドを実行します。

    python manage.py startapp myapp
    

    このコマンドは、myappという名前のDjangoアプリケーションを作成します。

  4. 設定を構成する

    以下のファイルを編集して、Apacheとmod_wsgiがDjangoアプリケーションと連携できるようにする必要があります。

    • Apacheのhttpd.confファイル

      このファイルに、以下の行を追加します。

      LoadModule wsgi_module modules/mod_wsgi.so
      WSGIScriptAlias / /path/to/myproject/wsgi.py
      <Directory /path/to/myproject>
          <Files wsgi.py>
              Require all granted
          </Files>
      </Directory>
      

      この設定は、Apacheが/path/to/myproject/wsgi.pyファイルにあるWSGIスクリプトを使用して、/パスにアクセスされたリクエストを処理するように指示します。

    • Djangoのsettings.pyファイル

      INSTALLED_APPS = [
          'myapp',
          # ...
      ]
      

      この設定は、Djangoがmyappアプリケーションを認識するように指示します。

  5. Apacheを再起動する

    以下のコマンドを実行して、Apacheを再起動します。

    sudo service apache2 restart
    

    これで、DjangoアプリケーションがApacheウェブサーバー上で動作しているはずです。ブラウザを開き、http://localhost/にアクセスして、Djangoアプリケーションが表示されることを確認してください。

  • このガイドでは、基本的な設定のみを説明しています。本番環境にデプロイする場合は、より詳細な設定が必要になる場合があります。

Q: mod_wsgiの代わりにgunicornを使用することはできますか?

A: はい、gunicornを使用してDjangoアプリケーションをデプロイすることもできます。gunicornは、mod_wsgiよりも軽量で高速なWebサーバーです。

Q: 静的ファイルをどのように提供しますか?

A: 静的ファイルは、Apacheのデフォルトのドキュメントルートから提供できます。詳細については、Apacheのドキュメントを参照してください。



必要なファイル

  • settings.py
  • wsgi.py
  • httpd.conf

httpd.conf

LoadModule wsgi_module modules/mod_wsgi.so
WSGIScriptAlias / /path/to/myproject/wsgi.py
<Directory /path/to/myproject>
    <Files wsgi.py>
        Require all granted
    </Files>
</Directory>

# 静的ファイルを提供するための設定
Alias /static/ /path/to/myproject/static/
<Directory /path/to/myproject/static>
    Order allow,deny
    Allow from all
</Directory>

# 管理インターフェースを提供するための設定
Alias /admin/ /path/to/myproject/venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/
<Directory /path/to/myproject/venv/lib/python3.8/site-packages/django/contrib/admin/static/admin>
    Order allow,deny
    Allow from all
</Directory>

wsgi.py

import os
import sys

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')

application = get_wsgi_application()

settings.py

# ...

STATIC_URL = '/static/'

# ...

説明

  • settings.py
    • STATIC_URL設定は、Djangoが静的ファイルをどこに見つけるかを बताします。
  • wsgi.py
    • このファイルは、WSGIアプリケーションをインポートして作成し、Apacheに返します。
  • httpd.conf
    • LoadModule wsgi_module modules/mod_wsgi.so:この行は、Apacheがmod_wsgiモジュールをロードするように指示します。
    • WSGIScriptAlias / /path/to/myproject/wsgi.py:この行は、Apacheが/パスにアクセスされたリクエストを/path/to/myproject/wsgi.pyファイルにあるWSGIスクリプトを使用して処理するように指示します。
    • <Directory /path/to/myproject> ... </Directory>:このブロックは、Apacheが/path/to/myprojectディレクトリとその内容にアクセスできるように設定します。
    • <Files wsgi.py> ... </Files>:このブロックは、Apacheがwsgi.pyファイルにアクセスできるように設定します。
    • Alias /static/ /path/to/myproject/static/:この行は、Apacheが/static/パスにアクセスされたリクエストを/path/to/myproject/static/ディレクトリにマップするように指示します。
    • <Directory /path/to/myproject/static> ... </Directory>:このブロックは、Apacheが/path/to/myproject/static/ディレクトリとその内容にアクセスできるように設定します。
    • Alias /admin/ /path/to/myproject/venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/:この行は、Apacheが/admin/パスにアクセスされたリクエストを/path/to/myproject/venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/ディレクトリにマップするように指示します。
    • <Directory /path/to/myproject/venv/lib/python3.8/site-packages/django/contrib/admin/static/admin> ... </Directory>:このブロックは、Apacheが/path/to/myproject/venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/ディレクトリとその内容にアクセスできるように設定します。

この例は、基本的な設定のみを網羅しています。本番環境にデプロイする場合は、より詳細な設定が必要になる場合があります。



代替手段

  • AWS Elastic Beanstalk
    AWS Elastic Beanstalkは、もう一つのPaaSであり、アプリケーションをデプロイして管理するためのプラットフォームを提供します。Herokuと同様に、Elastic Beanstalkを使用すると、サーバーを管理する必要がなく、アプリケーションを簡単にデプロイしてスケーリングすることができます。
  • Heroku
    Herokuは、PaaS (Platform as a Service) であり、アプリケーションをデプロイして管理するためのプラットフォームを提供します。Herokuを使用すると、サーバーを管理する必要がなく、アプリケーションを簡単にデプロイしてスケーリングすることができます。しかし、Herokuは他のオプションよりも高価になる可能性があります。
  • Nginx
    Nginxは、静的ファイルと動的アプリケーションの配信に最適化された高性能なWebサーバーです。Apacheよりも軽量で、メモリ使用量も少ないです。NginxをDjangoと組み合わせるには、uWSGIなどの別のWebサーバーが必要です。
  • uWSGI
    uWSGIは、もう一つの軽量で高性能なWebサーバーです。gunicornと同様に、Apacheよりもシンプルで、メモリ使用量も少ないです。uWSGIは、gunicornよりも多くの機能を提供しています。
  • gunicorn
    gunicornは、Python製の軽量で高性能なWebサーバーです。Apacheよりもシンプルで、メモリ使用量も少ないです。しかし、Apacheほど多くの機能はありません。
オプション長所短所
Apache + mod_wsgiよく知られており、多くのドキュメントとサポートがある複雑で、メモリ使用量が多い
gunicorn軽量で、メモリ使用量が少ないApacheほど多くの機能はない
uWSGI軽量で、メモリ使用量が少ない、gunicornよりも多くの機能がある複雑で、習得に時間がかかる
Nginx軽量で、メモリ使用量が少ない、静的ファイルの配信に最適Djangoをデプロイするには別のWebサーバーが必要
Heroku簡単なデプロイとスケーリング、サーバー管理不要高価になる可能性がある
AWS Elastic Beanstalk簡単なデプロイとスケーリング、サーバー管理不要高価になる可能性がある