💬
AmazonLinux2にDjangoアプリをデプロイ with MySQL,uWSG,Nginx
前提
出来上がる環境
Python 3.7.10 (AmazonLinux2にデフォルトで入ってる)
Django3.1
「confing」でDjango startprojectした想定のプロジェクトを/opt/Projectname にcloneする。
Projectnameを置換して、★ついてる所はそれっぽいのを入力。それ以外はコピペでいけるはず。
流れ
- インスタンス立ち上げ
- 初期設定、インストール
- git clone
- uWSGI起動
- 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