はじめに
Flaskを使っている多くの皆さんにDeployの仕方をできるだけ簡単かつ直線的にまとめます。これに関する記述は多いのですが、回りくどかったり、systemdで起動してないものも多く、実運用上、まとめておきたかったためです。
Linux, Debian,Nginxについて書きます。他の組み合わせを書くと、場合分けがたくさん出てきて、「直線的」の趣旨を外れます。
hello.pyの開発
まず、pythonでアプリケーションを開発します。
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です。もし使用中であれば、次のようにずらせます。
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の設定
#ここを追記
location / {
root /home/hello/html/;
include uwsgi_params;
uwsgi_pass unix:/tmp/hello.sock;
}
リンクします。
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を置きます。
[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
手で動かしてみましょう。
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の設定と同様です。
リンクします。
cd /etc/uwsgi/apps-enable
ln -s ../apps-available/hello.ini
Run Commandを書いて/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
実行権を立てます。
chmod +x /etc/uwsgi/rc.uwsgi
走らせます。
/etc/uwsgi/rc.uwsgi
うまく行かなければデバッグします。
systemdの設定
サービスを作ります。
[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