EC2, Apache, mod_wsgiでDjangoを動かしてみた!

Web開発

EC2のAmazonLinux2でApache, mod_wsgiでDjangoを動かします。

Python3, Apacheなどインストール

インストールするもの
・Python3-devel : 無いと後のmysqlclientのインストール時にエラー。python3自体も一緒にインストールされる。
・mysql-devel : mysqlclientのインストール時に必要
・gcc : mysqlclientのインストール時に必要
・httpd : Apache
・httpd-devel : 無いと後のmod_wsgiインストール時にエラー。

sudo yum install -y python3-devel mysql-devel gcc httpd httpd-devel
$ python3 -V
Python 3.7.0rc1
$ pip3 -V
pip 9.0.3 from /usr/lib/python3.7/site-packages (python 3.7)
$ httpd -V
Server version: Apache/2.4.34 ()

Apacheを起動してみる。

sudo systemctl start httpd

EC2のIPアドレスにブラウザでアクセス

起動している。

systemctl コマンドを使用して、システムがブートするたびに Apache ウェブサーバーが起動するように設定

sudo systemctl enable httpd

venvでPython3の仮想環境を作成

‘venv’という名前で/home/ec2-user/ディレクトリに仮想環境を作ることにします

$ sudo python3 -m venv venv

仮想環境を有効にして確認

(venv)$ python -V
Python 3.7.0rc1
(venv)$ pip -V
pip 9.0.3 from /home/venv/lib64/python3.7/site-packages (python 3.7)

Django, mysqlclient, mod_wsgiをインストール

仮想環境を有効にしたままpipでインストール

pip install django mysqlclient mod_wsgi

確認

(venv)$ pip freeze
Django==2.1.2
mod-wsgi==4.6.4
mysqlclient==1.3.13
pytz==2018.5

ちなみに、httpd-develがない状態でmod_wsgiをインストールしようとしたときのエラー

WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Collecting mod_wsgi
  Downloading https://files.pythonhosted.org/packages/9e/37/dd336068ece37c43957aa337f25c59a9a6afa98086e5507908a2d21ab807/mod_wsgi-4.6.4.tar.gz (2.6MB)
    100% |████████████████████████████████| 2.6MB 497kB/s 
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "", line 1, in 
      File "/tmp/pip-build-lwzmkbiv/mod-wsgi/setup.py", line 168, in 
        'missing Apache httpd server packages.' % APXS)
    RuntimeError: The 'apxs' command appears not to be installed or is not executable. Please check the list of prerequisites in the documentation for this package and install any missing Apache httpd server packages.
    
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-lwzmkbiv/mod-wsgi/

Djangoプロジェクトを作成

今回はプロジェクト名を’odaimaker’としています。

(venv)$ django-admin startproject odaimaker

ファイル設定

https://docs.djangoproject.com/ja/2.1/howto/deployment/wsgi/modwsgi/#using-mod-wsgi-daemon-mode
Djangoドキュメントを参考に/etc/httpd/conf.d/wsgi.confを作成します

wsgi.conf

LoadModule wsgi_module /home/ec2-user/venv/lib64/python3.7/site-packages/mod_wsgi/server/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so

WSGIDaemonProcess odai python-home=/home/ec2-user/venv python-path=/home/ec2-user/odaimaker
WSGIProcessGroup odai

WSGIScriptAlias / /home/ec2-user/odaimaker/odaimaker/wsgi.py
<Directory /home/ec2-user/odaimaker/odaimaker>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

LoadModule

LoadModule wsgi_module /home/ec2-user/venv/lib64/python3.7/site-packages/mod_wsgi/server/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.soに関して

(venv)$ pip show mod_wsgi
Name: mod-wsgi
Version: 4.6.4
Summary: Installer for Apache/mod_wsgi.
Home-page: http://www.modwsgi.org/
Author: Graham Dumpleton
Author-email: Graham.Dumpleton@gmail.com
License: Apache License, Version 2.0
Location: /home/ec2-user/venv/lib/python3.7/site-packages
Requires:

このLocationの中にmod_wsgi-py37.cpython-37m-x86_64-linux-gnu.soがあるのでそれを使います

python-home

python-home=/home/ec2-user/venvに関して
pythonを起動して確認

(venv)$ python
Python 3.7.0rc1 (default, Aug  1 2018, 03:51:55) 
[GCC 7.3.1 20180303 (Red Hat 7.3.1-5)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.prefix
'/home/ec2-user/venv'
>>>

これを使います

Apacheを再起動してアクセス

sudo systemctl restart httpd

ブラウザでIPアドレスにアクセスすると、
You don’t have permission to access / on this server.

エラーログを確認

$ sudo tail /var/log/httpd/error_log
Fatal Python error: initfsencoding: unable to load the file system codec
ModuleNotFoundError: No module named 'encodings'

Current thread 0x00007ff5bd1be8c0 (most recent call first):
[Sun Oct 07 00:21:32.468589 2018] [core:notice] [pid 5014] AH00052: child pid 5179 exit signal Aborted (6)
[Sun Oct 07 00:21:32.469704 2018] [wsgi:warn] [pid 5180] (13)Permission denied: mod_wsgi (pid=5180): Unable to stat Python home /home/ec2-user/venv. Python interpreter may not be able to be initialized correctly. Verify the supplied path and access permissions for whole of the path.
Fatal Python error: initfsencoding: unable to load the file system codec
ModuleNotFoundError: No module named 'encodings'

Current thread 0x00007ff5bd1be8c0 (most recent call first):

apacheユーザーが/home/ec2-user/venvにアクセスできる権限がないから?
ec2-user/以下にほかユーザーからの実行権限を与える

chmod 755 /home/ec2-user/

ブラウザでIPアドレスにアクセスすると
DisallowedHost at /
の画面に。

Django側でアクセスできるIPアドレスを許可する必要があるため。

settings.pyのALLOWED_HOSTSにIPアドレスを追加してあげるとアクセスできます。

Web開発
スポンサーリンク
hid3をフォローする
踊りながらWebサービスを個人開発している人のブログ