EC2(Amazon Linux2) + Apache + MySQLの環境下にDjangoアプリをデプロイしたので、その手順をまとめてみました。
以下が前提となりますのでご了承ください。
- Djangoアプリは事前に作成してあり、GitHubにプッシュしていること
- AWSの基本操作(EC2インスタンスの作成方法)を理解していること
構成
- Amazon Linux 2 (64bit)
- Apache 2.4.43
- MySQL 8.0.21
- Python 3.7.8
- Django 3.1
EC2インスタンスの作成
AWSでEC2インスタンスを起動し、AMIにAmazon Linux2 (64bit版)を選択します。
インバウンドルールは以下のように設定してください。
ポート8000は、開発用サーバ起動時の確認用なので不要な場合は外してOKです。
pemファイルを任意の場所に置いたら、ターミナル等でサーバにSSH接続しましょう。
Apacheのインストール
まずWebサーバであるApacheをインストールします。
# Linuxのパッケージ管理システムyumのアップデート(-y はすべての確認に対してyesというオプション) sudo yum update -y # Apacheのインストール sudo yum install -y httpd httpd-devel # Apacheのバージョン確認 httpd -v # Apacheの起動 sudo systemctl start httpd.service # Apacheの状態確認 => active(running)となっていれば起動成功 sudo systemctl status httpd.service # サーバー起動時にApacheを自動起動するよう設定 sudo systemctl enable httpd.service # Apache自動起動設定の確認 => enabledなら自動起動設定 sudo systemctl is-enabled httpd.service
EC2インスタンスのパブリックIPアドレスにブラウザからアクセスすると、Apacheのページが表示されるはずです。
Python3・Django・mod_wsgiのインストール
次にPython3やDjangoをインストールします。
mod_wsgiとは、DjangoとApacheの橋渡しを行うモジュールです。
# Python3に必要なモジュールをインストール(ついでにgitも) sudo yum install -y python3-devel gcc gcc-c++ git # Python3のインストール sudo yum install -y python3 # Python3のバージョン確認 python3 --version # Djangoとmod_wsgiのインストール sudo pip3 install django mod_wsgi # インストール確認 => djangoとmod_wsgiが表示されればインストール成功 pip3 list
MySQLのインストール
今回はMySQLを使用します。
# MySQL yumリポジトリからMySQL8.0のRPMパッケージをダウンロード sudo yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm # MySQLのインストール sudo yum install --enablerepo=mysql80-community mysql-community-server -y # MySQLバージョン確認 mysql --version # MySQLの起動 sudo systemctl start mysqld.service # 起動確認 systemctl status mysqld.service # サーバー起動時にMySQLを自動起動するよう設定 sudo systemctl enable mysqld.service
インストールできたら、MySQLの初期設定を以下を参考に行ってください。
初期パスワードがわからない場合は、以下の記事が参考になります。
また、DjangoからMySQLを操作するためのドライバであるmysqlclientをインストールしておきます。
# mysql-develをインストール(mysqlclientに必要) sudo yum install -y mysql-devel # Djangoプロジェクトディレクトリ内のsettings.pyの編集 sudo pip3 install mysqlclient
MySQLの設定
今回はMySQLを使用します。
# MySQLへ接続する(上記で設定したパスワードを入力する) mysql -u root -p # ユーザーを作成する(ユーザ名とパスワードは自由に設定してください) CREATE USER 'myapp'@'%' IDENTIFIED BY 'password'; # 作成したユーザーにすべての操作権限を付与 GRANT ALL ON myapp.* TO 'myapp'@'%'; # 設定の反映 FLUSH PRIVILEGES; # ユーザーが作成されたか確認 SELECT user, host FROM mysql.user; # MySQL切断 quit
Djangoプロジェクトのgit cloneとsettings.pyの編集
ここまでできたら、いよいよDjangoプロジェクトをgithubからcloneします。また、本番用にsettings.pyの中身を書き換えます。
# home/ec2-userに移動して、Djangoプロジェクトをgit cloneする git clone <リポジトリ名> # Apacheがプロジェクトにアクセスするためにディレクトリの権限を変更 sudo chmod 755 /home/ec2-user/ # Djangoプロジェクトディレクトリ内のsettings.pyの編集 sudo vi settings.py settings.py --------------------- DEBUG = True # DEBUG = False ALLOWED_HOSTS = ['EC2のパブリックIPアドレス'] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'myapp', # 'USER': 'myappuser', 'PASSWORD': 'password', 'HOST': 'localhost', 'PORT': '3306', } } STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, 'static') # STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")] ------------------------ # staticファイルをプロジェクト直下に集約する python3 manage.py collectstatic # makemigrations python3 manage.py makemigrations # migrate python3 manage.py migrate
Apache設定ファイルの編集
Apacheにmod_wsgiファイルの場所を認識させるために設定ファイルを編集します。
# Python3のインストール場所を確認 which python3 # mod_wsgiのインストール場所を確認 sudo pip3 show mod_wsgi # /etc/httpd/conf.d/配下にDjangoプロジェクトの設定ファイルを作成 sudo vi /etc/httpd/conf.d/myproject.conf myproject.conf --------------------- LoadModule wsgi_module /usr/local/lib64/python3.7/site-packages/mod_wsgi/server/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so ServerName <EC2のパブリックIPアドレスを記載> WSGIScriptAlias / /home/ec2-user/myproject/myproject/wsgi.py WSGIPythonPath /home/ec2-user/myproject:/usr/bin/python3 Alias /static/ /home/ec2-user/myproject/static/ <Directory /home/ec2-user/myproject/static> Require all granted </Directory> <Directory /home/ec2-user/myproject/myproject> <Files wsgi.py> Require all granted </Files> </Directory> ------------------------ # Apacheのリスタート sudo service httpd restart
なお、viコマンドについては以下を参照してください。
以上で設定は完了です。お疲れ様でした。
EC2のパブリックIPアドレスにアクセスするとDjangoアプリが表示されるはずです。