💬

AmazonLinux2にDjangoアプリをデプロイ with MySQL,uWSG,Nginx

2022/05/14に公開

前提

出来上がる環境
Python 3.7.10 (AmazonLinux2にデフォルトで入ってる)
Django3.1

「confing」でDjango startprojectした想定のプロジェクトを/opt/Projectname にcloneする。
Projectnameを置換して、★ついてる所はそれっぽいのを入力。それ以外はコピペでいけるはず。

流れ

  1. インスタンス立ち上げ
  2. 初期設定、インストール
  3. git clone
  4. uWSGI起動
  5. Nginx起動

今回はとりあえずhttpでデプロイ、https化は別途。

0. インスタンス立ち上げ

AmazonLinux2で立ち上げる。
pythonのrunserver,uwsgi動作確認したい場合は0.0.0.0:8000をインバウンドルールに設定しておく。

ドメイン登録は別途記載、今は確認用に、ローカルPCで名前解決。
立ち上がったらローカルPCの/etc/hostsに外部IP domainを設定しておく

★xx.xx.xx.xx(外部IP) ★project-xxxx

1. 初期設定、インストール

時間、文字言語設定

sudo timedatectl set-timezone Asia/Tokyo
sudo localectl set-locale LANG=ja_JP.utf8
sudo amazon-linux-extras install nginx1

adminユーザ作成

sudo useradd -m admin
sudo passwd admin
sudo visudo

最終行に以下を追加

admin ALL=(ALL) ALL
sudo su - admin
mkdir -m 600 /home/admin/.ssh
touch /home/admin/.ssh/authorized_keys
chmod 700 /home/admin/.ssh/authorized_keys
vi /home/admin/.ssh/authorized_keys

authorized_keysにローカルCPの公開鍵を記載

ローカルPCの公開鍵を追記、アクセス確認する

ssh admin@★xx.xx.xx.xx

アクセスできるようになったらec2ユーザを削除

sudo userdel -r ec2-user

ユーザを作成

sudo useradd -M release
sudo useradd -M webserver
sudo useradd -M appserver

mysqlインストール、DB作成、設定

sudo yum install mariadb-server
sudo yum install python3-devel mysql mysql-devel gcc
sudo cp -p /etc/my.cnf /tmp/
sudo sed -i "10i character-set-server=utf8" /etc/my.cnf
sudo sed -i "$ a [client]\ndefault-character-set=utf8" /etc/my.cnf
cat /etc/my.cnf

DBサーバ起動、DB作成、設定

sudo systemctl start mariadb
mysql -uroot -p
MariaDB [(none)]> create database ★projectname;
MariaDB [(none)]> show databases;

2. git clone

git clone

ssh-keygen
cat .ssh/id_rsa.pub 
githubのsettingsに公開鍵を登録
cd /opt/
sudo chmod 777 .
sudo yum install git
git clone git@github.com:★xxxxxxx/xxxxxxx.git

# venvで仮想環境構築

mkdir py37
python3 -m venv py37
source py37/bin/activate
cd Projectname
pip install -r requirements.txt

requirements.txt参考

cat requirements.txt
Django==3.1
django-crispy-forms==1.13.0
django-debug-toolbar==3.2.2
django-environ==0.8.1
django-extensions==3.1.5
django-filter==21.1
django-forms-bootstrap==3.1.0
django-glrm==1.1.3
django-model-utils==4.2.0
djangorestframework==3.12.4
uWSGI==2.0.19.1
mysqlclient==2.1.0
Pillow==5.4.1
django-widget-tweaks==1.4.12

settings.py設定

DEBUGとALLOWED_HOSTSとDATABASESを以下に変えておく

vi config/settings.py
DEBUG = False
:
ALLOWED_HOSTS = ['★projectname-xxxx(ドメイン名)','★xx.xxx.xx.xx(外部IP)']
:
:
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "★projectname",
        "USER": "root",
        "PASSWORD": "",
        "HOST": "localhost",
        "PORT": "3306"
    }
}

mingrate、ユーザ作成

python manage.py migrate
python manage.py createsuperuser

動作確認

python manage.py runserver 0.0.0.0:8000

3. uWSGI起動

cd /opt/Projectname
mkdir -m 777 backend

uwsgi動作確認

uwsgiコマンドが動くか確認。ポート8000で受ける

uwsgi --http :8000 --processes=1 --module=config.wsgi --socket=/opt/Projectname/backend/uwsgi.sock --pidfile=/opt/Projectname/backend/uwsgi.pid --master --vacuum

systemctlコマンドに設定

cd /opt/Projectname
mkdir -m 777 backend
sudo vi /etc/systemd/system/uwsgi.service 
[Unit]
Description=Django app service.
After=network.target

[Service]
# ユーザー名
User=appserver

# プロジェクトパス
WorkingDirectory=/opt/Projectname

KillSignal=SIGQUIT
# 実行
ExecStart=/opt/py37/bin/uwsgi \
--processes=1 \
--module=config.wsgi \
--socket=/opt/Projectname/backend/uwsgi.sock \
--chmod-socket=777 \
--pidfile=/opt/Projectname/backend/uwsgi.pid \
--master \
--vacuum

Restart=always

[Install]
WantedBy=multi-user.target

systemctlコマンドでuwsgi起動

sudo systemctl daemon-reload 
sudo systemctl enable uwsgi
sudo systemctl start uwsgi
sudo systemctl start uwsgi

systemctlコマンド一覧

sudo systemctl daemon-reload 
sudo systemctl enable uwsgi
sudo systemctl status uwsgi
sudo systemctl stop uwsgi
sudo systemctl start uwsgi
sudo systemctl restart uwsgi

4. Nginx起動

vi /opt/Projectname/backend/Projectname_nginx.conf
upstream django {
    server unix:///opt/Projectname/backend/uwsgi.sock; # for a file socket
}
# configuration of the server
server {
    # the port your site will be served on
    listen 80;
    # the domain name it will serve for
    server_name ★xx.xx.xx.xx(外部IP); # substitute your machine's IP address or FQDN
    charset utf-8;
    # max upload size
    client_max_body_size 75M;   # adjust to taste
    # Django media
    # location /media  {
    #     alias /home/project_name/backend/media;  # your Django project's media files - amend as required
    # }
    location /static {
        alias /opt/Projectname/static; # your Django project's static files - amend as required
    }
    # Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass django;
        include uwsgi_params;
    }
}
sudo ln -s /opt/Projectname/backend/projectname_nginx.conf /etc/nginx/conf.d/
sudo vi /etc/nginx/nginx.conf

http{}内のserver{}を全て削除(Projectname_nginx.confに記載されてるので)

systemctlコマンドでnginx起動

sudo systemctl daemon-reload 
sudo systemctl enable nginx
sudo systemctl start nginx
sudo systemctl status nginx

systemctlコマンド一覧

sudo systemctl daemon-reload 
sudo systemctl enable nginx
sudo systemctl status nginx
sudo systemctl stop nginx
sudo systemctl start nginx
sudo systemctl restart nginx

Discussion