Djangoの本番環境を構築する [Ubuntu + Apache]
Ubuntu18.04のApacheでDjangoの本番環境を構築します。
今回はWSL2(Windows Subsystem for Linux)のUbuntuで行います。通常のUbuntuはもちろん同じでCentOSなどでも同様なやり方で可能です。
やること
サブディレクトリ(django)でDjangoプロジェクトを実行します。
前提条件
・仮想環境(venv)を構築済み ※詳細はDjango開発環境の構築とインストールを参照 |
・仮想環境があるディレクトリ /home/ユーザー名/django/3.2/.venv |
・プロジェクトのパス /mnt/d/django/project |
※WSLだと「/mnt/d」は「D:¥」の事です。
1. 仮想環境にmod_wsgiをインストール
cd /home/ユーザー名/django/3.2/ source .venv/bin/activate pip install mod_wsgi deactivate
1-1. エラー1 RuntimeError: The 'apxs' command
pip install mod_wsgiで次のエラーが発生する場合は
このコマンドを実行します。
sudo apt update sudo apt install apache2-dev
1-2. エラー2 /usr/bin/ld: final link failed
更に次のようなエラーが出る場合はpyenvでインストールされたPythonの「共有オブジェクト」が有効でないのが原因です。
collect2: error: ld returned 1 exit status
error: command 'gcc' failed with exit status 1
次のようにPythonと仮想環境を再構築します。 ※Pythonバージョンは任意
// アンインストール pyenv uninstall 3.6.13 ココで対象の仮想環境の削除 // 共有設定をONにしてインストール env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.6.13 pyenv global 3.6.13 ↑どちらか↓ pyenv local 3.6.13 // インストール済みPythonの一覧 pyenv versions ココで対象の仮想環境の再作成
次のようなメッセージが表示されればOKです。
Running setup.py install for mod-wsgi ... done
Successfully installed mod-wsgi-4.7.1
2. Apacheとmod_wsgiの連携
2-1. mod_wsgiのパスを見つける
仮想環境を設置したディレクトリに移動してからfindコマンドを実行する
cd /home/ユーザー名/django/3.2/.venv find -name 'mod_*.so'
(出力例)
./lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so
これを組み合わせるとフルパスはこうなります。
/home/ユーザー名/django/3.2/.venv/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so
この「mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so」がmod_wsgiです。このフルパスをApacheの設定で使用します。
2-2. confファイルの編集(000-default.conf)
sudo vi /etc/apache2/sites-available/000-default.conf
[000-default.conf]
# VirtualHostは変更しません <VirtualHost *:80> ・・・省略・・・ </VirtualHost> # 以下に書き込む LoadModule wsgi_module /home/ユーザー名/django/3.2/.venv/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so WSGIPythonHome /home/ユーザー名/django/3.2/.venv WSGIScriptAlias /django /mnt/d/django/project/project/wsgi.py WSGIPythonPath /mnt/d/django/project:/home/ユーザー名/django/3.2/.venv/lib/python3.6/site-packages <Directory /mnt/d/django/project/project> <Files wsgi.py> Require all granted </Files> </Directory> # CSS/JSファイルなどの共通ファイルを使用している場合 Alias /static/ /mnt/d/django/project/static/ <Directory /mnt/d/django/project/static> Require all granted </Directory>
Apacheを再起動する。
sudo service apache2 restart
あとはブラウザでURLにアクセスするだけです。
2-3. 500 Internal Server Error
エラーが発生した場合はApacheのログをみれば原因がわかります。
sudo cat /var/log/apache2/error.log
以上となります。