CentOS7 + Django(2.0) + mod_wsgiを使ってApacheを動かすまで

  • このエントリーをはてなブックマークに追加

はじめに

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'

参考記事

  • このエントリーをはてなブックマークに追加