uWsgiの実運用

# はじめに
Flaskを使っている多くの皆さんにDeployの仕方をできるだけ簡単かつ直線的にまとめます。これに関する記述は多いのですが、回りくどかったり、systemdで起動してないものも多く、実運用上、まとめておきたかったためです。
Linux, Debian,Nginxについて書きます。他の組み合わせを書くと、場合分けがたくさん出てきて、「直線的」の趣旨を外れます。
# hello.pyの開発
まず、pythonでアプリケーションを開発します。
```hello.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello World'

if __name__ == '__main__':
    app.debug = True
    app.run()
```
# デバッグ
flaskがまだならinstallしてください。
```
apt install python3-flask
```
root権限が要りますが、私はsudo嫌いです。別terminalを立てて、suして実行してます。以下、installは同様です。
テストラン
```
python3 hello.py
```
```
$ python3 hello.py
 * Serving Flask app 'hello'
 * Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000
Press CTRL+C to quit
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 760-966-610
```
port:5000はflaskのdefautです。もし使用中であれば、次のようにずらせます。
```hello.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello World'

if __name__ == '__main__':
    app.debug = True
    app.run(port=5001)
```
別のターミナルを立てviewerをつなぎます。例えば、
```
lynx localhost:5000
```
Hello Worldと表示されれば成功です。
こういう簡単な例で、しかもDebug済みのものなら多分一発で動くと思います。
でも実際は、トライ＆エラーが必要と思います。
根気強く、Bugを取りここまでで、十分動くようにしてください。
# uWsgiの導入
シングルユーザーならこのままでも動きますが、マルチユーザー環境で動かすのは危険です。uWsgi (マイクロウイスギー)を通しましょう。
## Nginxの設定
```/etc/nginx/sites-available/hello
#ここを追記
location / {
        root /home/hello/html/;
        include uwsgi_params;
        uwsgi_pass unix:/tmp/hello.sock;
    }
```
リンクします。
```sh
cd /etc/nginx/sites-enable
ln -s ../sites-available/hello
```
こうしておくと、あるサイトを止めるとき、設定を残したままリンクを消せば止めらられます。
## Install
uWsgiをinstallします。
```
apt install uwsgi uwsgi-plugin-python3
```
## uwsgi.iniの設置
/etc/uwsgi/apps-available/hello.iniを置きます。
```hello.ini
[uwsgi]
chdir = /home/10ups.site/html/hello/
wsgi-file = hello.py
callable = app
master = true
processes = 1
socket = /tmp/hello.sock
chmod-socket = 666
vacuum = true
die-on-term = true
logger  = file:/var/log/uwsgi/hello.log
```
手で動かしてみましょう。
```sh
uwsgi --ini /etc/uwsgi/apps-available/hello.ini
ls -l /tmp/hello.sock
```
srw-rw-rw-ができればOKです。
chdir = の行のない例が多かったです。これがなくてもcurrent dirにおいてあれば良いのですが、本例のように離れたところから呼ぶことができません。
また、置く場所は、任意ですが、/etc/uwsgi/apps-available/を推奨します。理由は、Nginxの設定と同様です。
リンクします。
```sh
cd /etc/uwsgi/apps-enable
ln -s ../apps-available/hello.ini
```
Run Commandを書いて/etc/uwsgi/rc.uwsgiに置きます。
```/etc/uwsgi/rc.uwsgi
 #!/bin/bash

# ディレクトリのパスを指定
dir="apps-enabled'

# ディレクトリ内の.iniファイルに対してループ
for file in "$dir"/*.ini; do
    # ファイルが存在するかを確認
    if [ -f "$file" ]; then
        # progを実行
        uwsg --ini "$file"
    fi
done
```
実行権を立てます。
```sh
chmod +x /etc/uwsgi/rc.uwsgi
```
走らせます。
```sh
/etc/uwsgi/rc.uwsgi
```
うまく行かなければデバッグします。

# systemdの設定
サービスを作ります。
```/etc/systemd/system/uwsgi.service
[Unit]
Description=uWsgi
After=syslog.target

[Service]
ExecStart=/etc/uwsgi/rc.uwsgi
ExecStop=killall uwsgi
Type=simple
StandardOutput=syslog
StandardError=syslog
NotifyAccess=all

[Install]
WantedBy=multi-user.target


```
設定は以上です。
起動／再起動します。
```
systemctl daemon-reload
systemctl enable uwsgi
systemctl restart uwsgi
systemctl restart nginx
```
restartは再起動で、起動にも使うのはどうかとおっしゃる方もいます。
私は起動してないのがわかっていてもrestartを使ってます。
面倒でしょ？
```
systemctl status uwsgi
```
で調べるのは。
# 参考文献
uwsgi.iniのoption詳説
https://qiita.com/11ohina017/items/da2ae5b039257752e558