本記事の概要
AmazonLinux2でDjango、nignx、uwsgi、mysqlの環境作成手順化したため、メモも兼ねてこちらに記載します。
最後にSSL化の手順も記載しているので、よければ見てください。
事前準備
EC2のインバウンドルールで443、8000、8001番を追加で設定をお願いします。
IPとドメインの紐付けを行う場合は、ElasticIP適応後、Route53で設定をお願いします。
ElasticIPの設定方法は下記のサイトが非常にわかりやすかったです。
https://qiita.com/Jerid/items/d5dd3a29ed9a0e374493
手順
nginxインストール~起動・確認
sudo amazon-linux-extras install nginx1
nginx -V
sudo systemctl start nginx
sudo systemctl status nginx
mysqlの環境作成
必要なパッケージをインストールします。
sudo yum remove -y mariadb-*
sudo yum localinstall -y https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm
sudo yum install -y --enablerepo=mysql80-community mysql-community-server
sudo yum install -y --enablerepo=mysql80-community mysql-community-devel
sudo systemctl start mysqld
systemctl status mysqld.service
mysqlのパスワード変更
下記でパスワードを確認する
sudo cat /var/log/mysqld.log
下記のコマンドでログインし、先ほどのパスワードを入力しログイン
mysql -u root -p
パスワードを再設定
set password for root@localhost = 'パスワード';
Djangoで使うDBもついでに作成
今回はmysiteというDB名で作成
create database mysite;
DjangoとDBの連携設定
pip3アップデートおよびバージョン確認を行います(デフォルトで存在するはず)。
python3 -V
pip3 install --upgrade pip
pip3 -V
djangoとDB接続に必要なパッケージをインストールします。
sudo yum install gcc
sudo yum install python3-devel
pip3 install mysqlclient
Djangoの環境を作成します。
#Djangoインストール
pip3 install django
#Djangoのプロジェクト作成
django-admin startproject mysite
vimなどでプロジェクトの設定ファイルを編集します。
※/home/ec2-userでプロジェクト作成した場合は、/home/ec2-user/mysite/mysite/settings.pyのpathに存在します。
#編集箇所
ALLOWED_HOSTS = ['*']
#省略
#編集箇所
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "mysite",
'USER': "root",
'PASSWORD': "パスワード",
'HOST': "localhost",
'PORT': "3306",
}
}
動作確認
下記のコマンド実行後、http://EC2のIP:8000 へアクセス
Djangoの画面が出ていれば問題ないです。
※DBの連携が行えていない場合は、起動時にエラーが発生するはずです。
python3 manage.py runserver 0.0.0.0:8000
uwsgi起動~nginx連携まで
uwsgiインストール後に起動
pip3 install uwsgi
プロジェクト直下のmanage.pyがあるディレクトリで下記のコマンドを実施
#mysite部分はプロジェクト名が入ります
uwsgi --http :8001 --module mysite.wsgi
uwsgiとnginxを連携
必要なファイルの移動および編集
cd /etc/nginx/
#プロジェクト直下のmanage.pyがあるディレクトリへコピー
sudo cp uwsgi_params /home/ec2-user/mysite
#この後編集を行うため、バックアップ
sudo cp nginx.conf nginx.conf.org
vimなどで/etc/nginx/nginx.confを下記のように編集
upstream django {
server 0.0.0.0:8001;
}
server {
listen 8000;
server_name 自分のパブリックアドレス;
root /usr/share/nginx/html;
charset utf-8;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
client_max_body_size 100M;
location /static {
alias /home/ec2-user/mysite/static;
}
location / {
uwsgi_pass django;
include /home/ec2-user/mysite/uwsgi_params;
}
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
再起動を行い変更を反映
sudo systemctl restart nginx
nginxが参照する静的ファイルのディレクトリを作成し、Djangoで設定
setting.pyを編集
#追記
import os
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
下記のコマンドを実行し、staticディレクトリへ静的ファイルを格納する
python3 manage.py collectstatic
これでdjango、uwsgi、nginx、mysqlの接続は完了です。
最後に動作確認
http://IP:8000でDjangoの画面が見えれば成功です。
uwsgi --socket :8001 --module mysite.wsgi
SSL化
vimなどで/etc/nginx/nginx.confを下記のように編集して、再起動で反映
listen 80;
server_name 使用するドメイン名;
sudo systemctl restart nginx
必要なパッケージをインストール
sudo amazon-linux-extras install -y epel
sudo yum install -y certbot
sudo yum install python-certbot-nginx
証明書の発行を行うボットを起動
sudo certbot --nginx
下記の順番で聞かれるので、回答します。
- メールアドレス入力
- 利用規約に同意 Y
- メアドの共有の許可 N
- ドメインの入力
- httpsをアクティブ化するサーバ名 数字で選択
回答終了後、自動でssl化が割り当てられているはずです。
※自動の割り当てが失敗していれば、下記のようにnginxのconfigを下記のように編集してください。
listen 443 ssl;
server_name ドメイン名;
ssl_certificate /etc/letsencrypt/live/ドメイン名.change-cloud.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ドメイン名/privkey.pem;
SSLの自動更新
cronでroot権限はあまり使いたくないですが、root権限以外で実行するとエラーになるため、このように記載しています。その他適切な方法があればコメントなどでご教示ください。
※時間は適当に設定してください。
sudo crontab -e
49 4 * * * sudo certbot renew --no-self-upgrade && sudo systemctl restart nginx
sudo systemctl restart crond
以上が作業となります。
感想
最近はdockerなどのイメージファイルで簡単に環境設定ができますが、既存システム等を扱うにあたり、このような知識はまだまだ必要だなと感じました。