この記事について
DjangoアプリのLinux(Apache2)へのデプロイ手順をまとめました。
開発環境で作ったものをとりあえずapacheで動かすための最小限の設定作業です。本番環境設定やセキュリティ対策、パフォーマンス対応は別途必要です。
確認した環境
- Ubuntu 17.10 (Azure) 16.04 (AWS)
- Amazon-Linux2 2017.12 (AWS)
- Django 2.0.5
[ 注意 ]
RHEL(CentOS)はPythonへの対応が遅く、通常の方法でPython3が入りません。トラブルを避けるため、可能ならRHEL(CentOS)は避けましょう。インストールが必要な場合は以下のサイトが参考になります。
naritoブログ CentOS7でDjangoを動かすシリーズ
https://torina.top/detail/448/
ここでのプロジェクトの前提条件
- OSユーザー名は「ubuntu」「ec2-user」
- プロジェクト名は「project」
- requirements.txt を作成済み
- settings.pyに以下の設定がある。
ALLOWED_HOSTS = ['*']
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
Ubuntu の場合
ディレクトリ構成
/etc
└ /apache2
└ /sites-available
└ /django.conf # apache 設定ファイル(新規作成)
/home
└ /ubuntu
└ /project # プロジェクト git cloneで作成(コピーでも可)
├─ /env # 仮想環境 venvで作成
└─ /static # 静的ファイル collectstaticで作成
作業手順
####1.パッケージのインストール
sudo apt-get update
sudo apt install -y python3 python3-pip python3-setuptools python3-wheel python3-venv python3-dev apache2 apache2-dev git
####2.プロジェクトの配置
git clone https://github.com/<project>.git
※ SCP等でコピーでもOK
####3.仮想環境の作成
cd project
python3 -m venv env
source env/bin/activate
※ これより仮想環境で実行
pip install wheel
pip install -r requirements.txt
pip install mod_wsgi
####4.Django 管理コマンドの実行
python manage.py migrate #DB定義更新
python manage.py collectstatic #静的ファイル収集
python manage.py createsuperuser #管理ユーザー作成
※必要な操作だけでOK
####5.ディレクトリ権限の変更
chmod 755 /home/ubuntu
※データベースにsqlite3を使う場合は、ディレクトリとファイルに書き込み権限を与える
chmod 777 /home/ubuntu/project
chmod 777 /home/ubuntu/project/db.sqlite3
####6.apacheの設定
#####6-1.mod_wsgiのパスを確認
mod_wsgi-express module-config
... 以下、実行結果
LoadModule wsgi_module "/home/ubuntu/project/env/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so"
WSGIPythonHome "/home/ubuntu/project/env"
実行結果の「LoadModule wsgi_module "パス"」をコピーしておき、次のdjango.confの最初の行で使う
#####6-2 設定ファイル作成
sudo vim /etc/apache2/sites-available/django.conf
以下の内容を入力して保存
LoadModule wsgi_module /home/ubuntu/project/env/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so
WSGIPythonHome /home/ubuntu/project/env
WSGIScriptAlias / /home/ubuntu/project/project/wsgi.py
WSGIPythonPath /home/ubuntu/project:/home/ubuntu/project/env/lib/python3.6/site-packages
<Directory /home/ubuntu/project/project>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
Alias /static/ /home/ubuntu/project/static/
<Directory /home/ubuntu/project/static>
Require all granted
</Directory>
[注意] Pythonのバージョン、ユーザー名、プロジェクト名、mod_wsgiのパスは環境で異なる
#####6-3.デフォルトの設定ファイル場所を変更する
sudo a2dissite 000-default
sudo a2ensite django
sudo systemctl restart apache2
sudo systemctl enable apache2
これで作業は完了。ブラウザより結果を確認する。
7.うまくいかないとき
以下の確認方法がある
sudo cat /var/log/apache2/error.log #エラーログ表示
systemctl status apache2 #apache2ステータスチェック
apachectl configtest #confの文法チェック
Amazon-Linux 2 の場合
ディレクトリ構成
/etc
└ httpd
└ conf.d
└ django.conf # apache 設定ファイル(新規作成)
/home
└ ec2-user
└ project # プロジェクト(git clne か scpで作成)
├─ env # 仮想環境 (venvで作成)
└─ static # 静的ファイル (collectstaticで作成)
作業手順
####1.パッケージのインストール
sudo yum update -y
sudo yum install -y python3 python3-pip python3-setuptools python3-wheel python3-devel httpd-devel gcc git
####2.プロジェクトの配置
git clone https://github.com/<project>.git
※ SCP等でコピーでもOK
####3.仮想環境の作成
cd project
python3 -m venv env
source env/bin/activate
※ これより仮想環境で実行
pip install -r requirements.txt
pip install mod_wsgi
####4.Django 管理コマンドの実行
python manage.py migrate #DB定義更新
python manage.py collectstatic #静的ファイル収集
python manage.py createsuperuser #管理ユーザー作成
※必要な操作だけでOK
####5.ディレクトリ権限の変更
chmod 755 /home/ec2-user
※データベースにsqlite3を使う場合は、ディレクトリとファイルに書き込み権限を与える
chmod 777 /home/ec2-user/project
chmod 777 /home/ec2-user/project/db.sqlite3
####6.apacheの設定
#####6-1.mod_wsgiのパスを確認
mod_wsgi-express module-config
... 以下、実行結果
LoadModule wsgi_module "/home/ec2-user/project/env/lib64/python3.7/site-packages/mod_wsgi/server/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so"
WSGIPythonHome "/home/ec2-user/project/env"
実行結果の「LoadModule wsgi_module "パス"」をコピーしておき、次のdjango.confの最初の行で使う
#####6-2 設定ファイル作成
sudo vim /etc/httpd/conf.d/django.conf
以下の内容を入力して保存
LoadModule wsgi_module "/home/ec2-user/project/env/lib64/python3.7/site-packages/mod_wsgi/server/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so"
WSGIPythonHome "/home/ec2-user/project/env"
WSGIScriptAlias / /home/ec2-user/project/project/wsgi.py
WSGIPythonPath /home/ec2-user/project:/home/ec2-user/project/env/lib/python3.7/site-packages
<Directory /home/ec2-user/project/project>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
Alias /static/ /home/ec2-user/project/static/
<Directory /home/ec2-user/project/static>
Require all granted
</Directory>
[注意] Pythonのバージョン、ユーザー名、プロジェクト名、mod_wsgiのパスは環境で異なる
#####6-3.サービス再起動
sudo systemctl restart httpd
sudo systemctl enable httpd
これで作業は完了。ブラウザより結果を確認する。
7.うまくいかないとき
以下の確認方法がある
sudo cat /var/log/httpd/error_log #エラーログ表示
systemctl status httpd #apache2ステータスチェック
apachectl configtest #confの文法チェック