はじめに
Djangoの開発環境では python manage.py runserver
で動かしてたけど、本番環境で動かすまでに結構苦労したので、その手順を備忘録として残します。
virtualenvで仮想環境を用意して、mod_wsgiを動かすためのPythonパスを設定すればだいたいOK。mod_wsgiには手を焼きました。。
自分の環境
・ CentOS 7.2
・ Apache 2.4.6
・ Python 3.6.5
・ Django 2.0
サーバーの環境構築
Django2からPython3のみになったので、Python3系にします。
$ sudo yum install -y https://centos7.iuscommunity.org/ius-release.rpm
$ sudo yum install -y python36u python36u-devel python36u-libs
python3
で動くように変更する
$ which python3.6
/usr/bin/python3.6
$ sudo ln -s /usr/bin/python3.6 /usr/bin/python3
$ python3 -V
Python 3.6.5
pipをインストールする
$ sudo yum install epel-release
$ sudo yum install python-pip
virtualenvで仮想環境を作る
$ pip install virtualenv
$ cd [project dir]
$ python3 -m venv [newenvname]
$ source [newenvname]/bin/activate
([newenvname])$ python -V
Python 3.6.5
仮想環境から抜け出すには deactivate
すればOK。
必要なものをpipでいれます。他に必要なものあれば入れてください。
([newenvname])$ pip install django mod-wsgi
もし「mod-wsgi」がinstallできない場合は下記を先に実行してください。
yum install httpd httpd-devel
apacheの設定
念のためにhttpd.confのバックアップをとっておく。
$ cp /etc/httpd/conf/httpd.conf /
$ vim /etc/httpd/conf/httpd.conf
httpd.confの一番最後に下記を記載。
IncludeOptional conf.d/*.conf
wsgi_moduleのpathを確認する。
$ mod_wsgi-express module-config
LoadModule wsgi_module "{mod_wsgi-py-path}"
WSGIPythonHome "{home-path}"
ファイルを作成する。
$ vim /etc/httpd/conf.d/django.conf
下記を記載する。
NameVirtualHost *:80
LoadModule wsgi_module "{mod_wsgi-py-path}"
WSGISocketPrefix /var/run/wsgi
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/html/xxx
WSGIDaemonProcess xxx python-home=/usr/{newenvname} python-path=/usr/xxx
WSGIProcessGroup xxx
WSGIScriptAlias / /usr/xxx/xxx/wsgi.py
Alias /static/ /var/www/html/xxx/static/
<Directory /var/www/html/xxx/static>
Require all granted
</Directory>
<Directory /usr/xxx/xxx>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
</VirtualHost>
※{newenvname}やxxxなどのファイル名やパス名は自分の環境に合わせてください。
apacheを再起動して確認する。
# apacheの確認や再起動
systemctl status httpd.service
systemctl restart httpd.service
# エラーログの確認
tail -f /var/log/httpd/error_log
1つのサーバーで複数のドメインを運用するなら
django.confを下記にする。
NameVirtualHost *:80
LoadModule wsgi_module "{mod_wsgi-py-path}"
WSGISocketPrefix /var/run/wsgi
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/html/xxx
WSGIDaemonProcess xxx python-home=/usr/{newenvname} python-path=/usr/xxx
WSGIProcessGroup xxx
WSGIScriptAlias / /usr/xxx/xxx/wsgi.py
Alias /static/ /var/www/html/xxx/static/
<Directory /var/www/html/xxx/static>
Require all granted
</Directory>
<Directory /usr/xxx/xxx>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName sample.com
DocumentRoot /var/www/html/yyy
WSGIDaemonProcess yyy python-home=/usr/{newenvname} python-path=/usr/yyy
WSGIProcessGroup yyy
WSGIScriptAlias / /usr/yyy/yyy/wsgi.py
Alias /static/ /var/www/html/yyy/static/
<Directory /var/www/html/yyy/static>
Require all granted
</Directory>
<Directory /usr/yyy/yyy>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
</VirtualHost>
WSGIDaemonProcessとWSGIProcessGroupを分ければいける
エラーについて
このエラーが出た場合は python-home
もしくは python-path
の指定先が異なっていないか確認してみてください。
ファイルのアクセス権限も確認してみてください。
Error ImportError: No module named 'encodings'
or
ModuleNotFoundError: No module named 'myProject'