DjangoデフォルトのデータベースはSQLite3ですが、使い慣れたMariaDBを使いたかったので、MariaDBでDjangoの環境構築を行いました。
目次
・事前準備
・Pythonインストール
・MariaDBインストール
・Djangoのインストール
・nginxインストール
・Gunicornインストール&環境構築
・マイグレーション&起動
・動作確認
前提条件
publicサブネット上にあるEC2インスタンスに構築しました。
OS:CentOS 7.9.2009
Python:3.6.8
Django:3.2.13
MariaDB:5.5.68
nginx:1.20.2
gunicorn:20.1.0
事前準備
selinuxを無効化させます。
timedatectl set-timezone Asia/Tokyo
vi /etc/selinux/config
SELINUX=enforcing
↓
SELINUX=disabled
:wq
yum -y update
reboot
CentOS7ではデフォルトでpython2がインストールされていますが、python3をインストールします。
python3 -V
yum -y install python3
python3 -V
mariadbをインストールさせます。
yum -y install mariadb-server python3-devel mysql-devel gcc
mariadbを起動させます。
systemctl start mariadb
systemctl status mariadb
systemctl enable mariadb
rootユーザーでログインします。
mysql -u root
create database mysite;
create user mysite@localhost identified by 'PassWord';
grant all privileges on mysite.* to 'mysite'@'localhost';
flush privileges;
exit
データベース「mysite」を作成し、mysiteユーザーへすべての権限を与えます。
また、パスワードは任意で設定してください。
作成したmysiteユーザーでログインして、データベース「mysite」が表示されることを確認します。
mysql -u mysite -p
show databases;
exit
Djangoのインストール
Djangoをインストールします。
pip3 install mysqlclient django
今回MariaDBを使うので、DjangoがMariaDBを利用できるようにmysqlclientをインストールします。
プロジェクトを作成します。ここでは「mysite」というプロジェクトを作成します。
cd /opt/
django-admin startproject mysite
Djangoの設定ファイルを変更します。
vi ./mysite/settings.py
ALLOWED_HOSTS = []
↓
ALLOWED_HOSTS = ['*']
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
↓
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysite',
'USER': 'mysite',
'PASSWORD': 'PassWord',
'HOST': 'localhost',
'PORT': '3306',
'OPTIONS': {
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
},
}
}
LANGUAGE_CODE = 'en-us'
↓
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'UTC'
↓
TIME_ZONE = 'Asia/Tokyo'
STATIC_ROOT = '/opt/mysite/static/'
今回はDBはMariaDBを使用しますので、DATABASESの中身をSQLite3からMariaDBへ変更します。
この時、MariaDBで作成したユーザー名、パスワードを指定してください。
また、静的ファイルの処理はnginx側で行うように設定したいと思いますので、STATIC_ROOTはプロジェクトで使用する静的ファイルの格納先を指定するよう追加します。
新規でstaticディレクトリを作成します。
cd /opt/mysite
mkdir /opt/mysite/static
chown appserver:appserver /opt/mysite/static
ls -l
nginxインストール
nginxをインストールさせます。
vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
:wq
yum -y install nginx
nginxを起動させます。
systemctl start nginx
systemctl status nginx
systemctl enable nginx
nginxの設定ファイルを新規作成します。
vi /etc/nginx/conf.d/mysite.conf
server {
listen 80;
server_name xxx.xxx.xxx.xxx;
location /static/ {
alias /opt/mysite/static/;
}
location / {
proxy_pass http://127.0.0.1:8000;
}
}
server_nameではパブリックIPを設定してください。
作成したmysite.confにエラーが出力されないことを確認して、nginxを再起動します。
nginx -t
systemctl restart nginx
systemctl status nginx
Gunicornインストール
gunicornを起動させるユーザーを作成します。
useradd -M appserver
gunicornをインストールさせます。
pip3 install gunicorn
gunicorn -v
gunicorn.serviceを作成します。
cd /etc/systemd/system
touch gunicorn.service
chmod 644 ./gunicorn.service
vi gunicorn.service
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
Type=notify
PIDFile=/run/gunicorn/pid
User=appserver
Group=appserver
RuntimeDirectory=gunicorn
WorkingDirectory=/opt/mysite
ExecStart=/usr/local/bin/gunicorn \
--access-logfile - \
--workers 3 \
--bind=localhost:8000 \
mysite.wsgi
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
KillMode=mixed
TimeoutStopSec=5
PrivateTmp=true
Restart=always
[Install]
WantedBy=multi-user.target
UserとGroupは先ほど作成したユーザー名を指定してください。
WorkingDirectoryは作成したプロジェクトのディレクトリ先を指定してください。
先ほどgunicorn.serverで設定したPIDファイルの格納先を作成します。
mkdir /run/gunicorn
chown appserver:appserver /run/gunicorn
ll /run | grep gunicorn
gunicorn.serviceを作成したので、一度リロードします。
systemctl daemon-reload
gunicorn.serviceを起動させます。
systemctl start gunicorn
systemctl status gunicorn
systemctl enable gunicorn
静的ファイルを先ほど設定した/opt/mysite/staticへ配置させます。
python3 manage.py collectstatic
プロジェクト「mysite」で利用するデータベース「mysite」のテーブル情報を自動的に作成します。
python3 manage.py migrate
setting.pyの設定内容が誤っている、あるいはmysqlclientのインストールがない等があるとエラーが返ってきますので注意してください。
Djangoのスーパーユーザーを作成します。名前は任意で構わないです。
メールアドレスの設定を求められますが、空白でも特に問題ないです。
python3 manage.py createsuperuser
プロジェクト「mysite」を起動させます。
python3 manage.py runserver
動作確認
ブラウザでパブリックIPでアクセスすると以下の画面が表示されます。
次に「パブリックIP/admin」でアクセスするとログイン画面が表示されます。
作成したアカウントでログインすると以下の画面が表示されます。