EC2×Python3×Django×Apache×MySQLの環境構築

django-ec2-apache-title CODE

Amazon Linux(EC2)上に上記の環境を作成する方法を紹介。

なお、各々のバージョンは以下のように作成しました。

Amazon Linux2
Python 3.7
Django 2.2.5
Apache 2.4.41
MySQL 8.0.18

1.EC2作成

ここは基本的に同じなので割愛。

EC2のインバウンドでHTTPをポート80で設定しておいてください。

EC2インスタンス作成方法↓

AWSのEC2でインスタンスを作成する手順 - Qiita
はじめに AWSにインスタンスを作成する方法がよく分からない ⇒ とりまインスタンス作成しながらQiitaにまとめて見よう (これも一つのアイカツ)  AWS EC2にインスタンス作ります Step.1 AWSにログイ...

初期のec2-user以外を作成↓

AWS EC2に作業用ユーザを追加 - Qiita
やりたいこと AWSのEC2インスタンスを作るとデフォルトでec2-userのみが作られるが、 複数人で同じpem使い回すのも嫌なんで各々に作業用ユーザを作りたい。 $ sudoの際いちいちパスワード入力しないようにしたい。 ...

IP変わるのめんどくさい方はElastic IP割り当てを↓

アマゾン ウェブ サービス(AWS)の開始方法 | AWS
AWS の利用を開始する際に役立つ10分間チュートリアルや操作手順ガイド、動画、オンラインセミナー、無料利用枠等をご覧いただけます。AWS をはじめる際にぜひご活用ください。

 

2.Apacheインストール

# まずyumをアップデート
sudo yum update -y

# Apacheインストール
sudo yum install -y httpd httpd-devel

# Apacheのバージョン確認
httpd -v
# Server version: Apache/2.4.41 ()  とか出てればOK

# Apache起動
sudo service httpd start

インスタンスのパブリックIPにアクセスし以下のようなテストページが表示されればインストール成功です。

apacheのtest page

 

3.Python3インストール

# Python3に必要なモジュールをインストール
sudo yum install -y httpd-devel python3-devel gcc gcc-c++

# Python3インストール
sudo yum install -y python3

※もしインストールでエラーが起きた場合は、以下をインストール後再実行してみてください。
sudo yum install -y zlib-devel bzip2 bzip2-devel readline readline-devel sqlite sqlite-devel openssl openssl-devel libffi-devel

# Python3がインストールされたか確認
python3 --version
# Python 3.7.4

プロジェクトごとにPythonのバージョンを変更したい場合は、 virtualenv  pyenv を使用して仮想環境を作成してください。

 

4.Django・mod_wsgiインストール

# Djangoインストール
sudo pip3 install django  # pip3はPython3インストール時にインストールされる

# Django確認
python3
>>> import django
>>> django.get_version()
'2.2.7'


# mod_wsgiインストール
sudo pip3 install mod_wsgi

# mod_wsgi確認
pip3 freeze | grep wsgi
# mod-wsgi==4.6.8

 

5.MySQlインストール

# MySQL yumリポジトリからMySQL8.0のRPMパッケージをダウンロード
sudo yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm

# MySQLインストール
sudo yum install --enablerepo=mysql80-community mysql-community-server -y

# MySQL確認
mysql --version
# ysql  Ver 8.0.18 for Linux on x86_64 (MySQL Community Server - GPL)

# MySQL起動
sudo systemctl start mysqld.service

# 起動してるか確認 active (running)になってたらok
systemctl status mysqld.service

# サーバー起動時にMySQL自動起動するように設定
sudo systemctl enable mysqld.service

MySQLの初期設定(パスワードやら権限周りの設定)を行う必要があるが、作成したい環境のセキュリティによって変わってくるので詳しくは以下を参照。

和訳があって非常に分かりやすいです。

mysql_secure_installation
MariaDBをインストールした際のセキュリティ向上

 

6.mysqlclientをインストール

Djangoプロジェクトでmysqlを扱うためにmysqlclientをインストール

# mysqlclientに必要なので先にmysql-develをインストール
sudo yum install -y mysql-devel

sudo pip3 install mysqlclient

 

7.Djangoプロジェクト作成

git でクローンせずに初期から作成する場合の方法。

# /home/user/ 配下に今回は作成
django-admin startproject mysite

# プロジェクトディレクトリは /home/user/mysite/
# こんなツリー構造になるはず
mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py


# Apacheがプロジェクトにアクセスできうようにディレクトリの権限を変更
# 権限がないとPermission deniedのエラーが出る
sudo chmod 755 /home/user/
# DBの設定をsettings.pyに追記
# NAME・USER・PASSWORDの部分が人によって違う部分

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'USER': 'root',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

 

8.Apacheの設定

# Python3のインストール場所を確認
which python3
# /usr/bin/python3

# mod_wsgiのインストール場所を確認
sudo pip3 show mod_wsgi
# Location: /usr/local/lib64/python3.7/site-packages


# /etc/httpd/conf.d/配下にDjangoプロジェクトの設定ファイルを作成
sudo vi /etc/httpd/conf.d/mysite.conf

-------------------------------------------------------------------------------------------
# 先ほど確認したmod_wsgiのインストール場所内のmod_esgi.... .soファイルを指定
LoadModule wsgi_module /usr/local/lib65/python3.7/site-packages/mod_wsgi/server/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so

ServerName *******  # EC2のパブリックIP

WSGIScriptAlias / /home/user/mysite/mysite/wsgi.py
WSGIPythonPath /home/user/mysite:/usr/bin/python3
ErrorLog "logs/mysite-error_log"
CustomLog "logs/mysite-access_log" combined

<Directory /home/user/mysite/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

# デーモンプロセスはなくてもokかも
WSGIDaemonProcess ec2 python-path=/home/user/mysite:/usr/bin/python3 display-name="httpd-wsgi-mysite" processes=1
----------------------------------------------------------------------

# Apacheリスタート
sudo service httpd restart

あとはアプリを作成し、EC2のパブリックIPにアクセスすればアプリが表示されます。

各バージョンによって作成方法が微妙に異なりますが、参考になれば幸いです。