Django + Nginx + uwsgi + Mariadb環境構築

# 概要
Django + NGinx + uwsgi + mariadbで開発環境を作ったときのメモ

# 環境
- GCP(無料枠)
- centos7
- Python3.9
- Nginx 最新
- uwsgi 2.0.19.1
- MariaDB 10

# 前提
root(su)で作業します。
※ uwsgi周りがpermission error連発して苦労したので

GCPはrootで入れなかったので、

```
sudo passwd root
```
しました。


GCP（無料枠）は↓を参考にインスタンス作りました。

https://igozutt.com/3step-server-up/#toc6

# SELinuxをオフ
```
$ vim /etc/selinux/config
SELINUX=enforcing
↓
SELINUX=disabled
$ reboot
```

# python3.9インストール
```
# $ yum install gcc openssl-devel bzip2-devel libffi-devel zlib-devel wget make
# $ wget https://www.python.org/ftp/python/3.9.2/Python-3.9.2.tgz 
# $ tar xzf Python-3.9.2.tgz 

# $ cd Python-3.9.2
# $ ./configure --enable-optimizations
# $ make install
```

```
$ pip3 install --upgrade pip
$ pip3 install django==3.1.7
$ pip3 install uwsgi==2.0.19.1
$ pip3 install django-environ==0.4.5
```


#### 【Python】参考にしたサイト
https://cream-worker.blog.jp/archives/1078147473.html

# MariaDB
#### レポジトリの登録
```
$ vim /etc/yum.repo.d/MariaDB.repo
↓
# MariaDB 10.5 CentOS repository list - created 2020-07-18 18:32 UTC
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.5/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
```
#### CentOS7にデフォルトでインストールされているMariaDB 5を削除
```
$ rpm -qa | grep -i "mariadb"
mariadb-libs-5.5.44-1.el7_1.x86_64 // インストールされているかどうかの確認

$ yum remove mariadb-libs
```

#### MariaDB 10をインストール
```
$ yum install MariaDB-server MariaDB-client

// バージョンを確認
$ mysql --version
mysql  Ver 15.1 Distrib 10.5.4-MariaDB, for Linux (x86_64) using readline 5.1
```

#### mysqlclientのインストール
```
$ yum install MariaDB-shared python3-devel mysql-devel libmysqlclient-dev
$ pip3 install mysqlclient==2.0.3
```

#### MariaDB初期設定
```
$ systemctl start mariadb
$ systemctl enable mariadb

$ mysql -u root -p

// データベース新規作成
$ CREATE DATABASE データベース名;
$ SHOW CREATE DATABASE データベース名;

// データベースユーザ新規作成
$ CREATE USER test2@localhost IDENTIFIED BY 'test2';

// 権限付与
$ GRANT ALL PRIVILEGES ON データベース名.* to 'test2'@'localhost';
$ GRANT FILE ON *.* TO 'test2'@'localhost';
$ FLUSH PRIVILEGES;
```

settings.pyに↑で作成したmariadbの設定をする。
任意で、一緒にpython manage.py collectstaticも。

## 【MariaDB】参考にしたサイト
https://donabeneko.jp/blog/post-6766

https://vatchlog.xsrv.jp/2019/05/07/python-mysqlclient-install/

http://downloads.mariadb.org/mariadb/repositories/

# Nginx
#### Nginxのインストール
```
$ vim /etc/yum.repos.d/nginx.repo
↓
// 最新versionをインストールするように記載
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

$ yum install -y nginx
$ systemctl start nginx.service
$ systemctl enable nginx.service

// httpを追加(80)
$ firewall-cmd --add-service=http --permanent
// httpsを追加
$ firewall-cmd --add-port=443/tcp --permanent

// 任意↓ 8000番を追加
$ firewall-cmd --add-port=8000/tcp --zone=public --permanent

$ firewall-cmd --reload
$ firewall-cmd --list-all
```

#### Nginxの設定
```
$ vim /etc/nginx/nginx.conf
↓
user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    upstream config {
        server unix:///var/run/uwsgi/master.sock;
    }
    server {
        listen       80;
        server_name  ◯.◯.◯.◯;
        root         /usr/share/nginx/html/config;
        charset      utf-8;

        include /etc/nginx/default.d/*.conf;
        client_max_body_size 100M;
        
        include /etc/nginx/mime.types;

        location /static {
            alias /static;
        }
        location / {
            uwsgi_pass config;
            include /etc/nginx/uwsgi_params;
        }
    }
}
```
```
include /etc/nginx/mime.types;
```
↑を忘れていて痛い目見ました。

# uwsgi
#### uwsg.iniの設定
```
$ vim uwsig.ini
↓
[uwsgi]
uid = nginx
gid = nginx
chdir = /usr/share/nginx/html/
module = config.wsgi
master = true
processes = 2
threads = 1
socket = /var/run/uwsgi/master.sock
pidfile = /var/run/uwsgi/master.pid
chmod-socket = 666
vacuum = true
thunder-lock = true
max-requests = 6000
max-requests-delta = 300
# log
logto = /var/log/uwsgi/uwsgi.log
deamonize = /var/log/uwsgi/uwsgi-@(exec://date +%Y-%m-%d).log
log-reopen = true
```

####  uwsgi.serviceの設定
```
$ vim /etc/systemd/system/uwsgi.service
↓
[Unit]
Description=uWSGI
After=syslog.target
[Service]
// chown 任意のユーザー:nginx
ExecStartPre=/bin/bash -c 'mkdir -p /var/run/uwsgi; chown root:nginx /var/run/uwsgi; chmod g+w /var/run/uwsgi;'
ExecStart=/bin/bash -c 'uwsgi --ini /usr/share/nginx/html/uwsgi.ini;'
#Restart=always
Restart=on-failure
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
[Install]
WantedBy=multi-user.target
```

#### 必要フォルダの作成（uwsgiのpermission error多い）
```
$ mkdir /var/log/nginx

$ mkdir /var/log/uwsgi
$ chown nginx:nginx uwsgi
$ chmod 662

$ mkdir /var/run/uwsgi
$ chown root:nginx uwsgi

$ systemctl daemon-reload
$ systemctl start uwsgi
```

### 【Nginx + uwsgi】参考にしたサイト

https://www.rem-system.com/centos-nginx-inst/
    
https://uwsgi-docs.readthedocs.io/en/latest/Nginx.html

https://www.bnote.net/centos/nginx_conf01.html

https://www.bnote.net/centos/nginx_conf02.html

権限周りは↓が参考になりました

https://www.jacepark.com/how-to-build-django-api-server-with-uwsgi-and-nginx-on-centos-7/