DjangoをApacheとmod_wsgiで動かす方法:初心者向けチュートリアル
このガイドでは、Apacheウェブサーバーとmod_wsgiモジュールを使ってDjangoアプリケーションをデプロイする方法を説明します。これは、Djangoアプリケーションを本番環境にデプロイする最も一般的な方法の一つです。
前提知識
このガイドを理解するには、以下の知識が必要です。
- コマンドラインツールの基本的な知識
- mod_wsgiモジュールの知識
- Apacheウェブサーバーの知識
- Djangoの基本的な知識
手順
必要なソフトウェアをインストールする
まず、Django、Apache、mod_wsgiをインストールする必要があります。それぞれのインストール方法は、お使いのオペレーティングシステムによって異なります。
Djangoプロジェクトを作成する
Djangoプロジェクトを作成するには、以下のコマンドを実行します。
django-admin startproject myproject
このコマンドは、
myproject
という名前のDjangoプロジェクトを作成します。Djangoアプリケーションを作成する
Djangoアプリケーションを作成するには、以下のコマンドを実行します。
python manage.py startapp myapp
このコマンドは、
myapp
という名前のDjangoアプリケーションを作成します。設定を構成する
以下のファイルを編集して、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
アプリケーションを認識するように指示します。
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 | 簡単なデプロイとスケーリング、サーバー管理不要 | 高価になる可能性がある |