flask を uWSGI と Nginx でデプロイする - Qiita
をやってみた試行錯誤の記録である。
元記事はdebianだがこちらはCentOS7。
試しなので/home/ymko、ymkoユーザーで起動しているがこれはセキュリティ的によろしくない。本来は専用ユーザーを作ってやるべき。
デブロイしたアプリごとにvirtualenvを切り替える方法がいまいち分からなかったが、uwsgiのEnvironmentがキーワードだったのか。とても勉強になった。@ekzemplaro氏に感謝。
ハマったところ
unix:///tmp/myproject.sock failed (2: No such file or directory)
nginxのエラーログにそんなUNIX-domain socketは無いと。
シェル上からは見えるのでううん?と一呼吸PrivateTmpに思い当たる。
nginxのsystemd設定に入っていた。
/tmpはやめて/var/run/helloにする。
PrivateTmp=true
unix:///var/run/hello/myproject.sock failed (13: Permission denied)
nginxはnginxユーザーでアクセスするのでUNIX-domain socketのファイルの権限が足りなかった。
/var/run/hello/myproject.sock が660だったのを666に変更。
実作業
pythonプログラムとuwsgiの準備
※Pythonのパッケージングのベストプラクティスについて考える2018 - 朝日ネット 開発者ブログ
※virtualenv の --no-site-packages オプションを間違って覚えてた - Study08.net 対シンバシ殲滅用人型機動兵器
よりvenv環境作成
$ mkdir hello
$ cd !$
$ python36 -m venv venv
$ source venv/bin/activate
(venv) $ pip install uwsgi flask
(venv) $ vim myproject.py
# vim:set ts=4 expandtab:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
str_out = "<h1 style='color:blue'>Hello There!</h1>"
str_out += "こんにちは。<p />"
str_out += "Jul/11/2017<br />"
str_out += "AM 08:54<br />"
return str_out
if __name__ == "__main__":
app.run(host='0.0.0.0')
(venv) $ vim wsgi.py
# vim:set ts=4 expandtab:
from myproject import app
if __name__ == "__main__":
app.run()
(venv) $ uwsgi --socket 0.0.0.0:5000 --protocol=http -w wsgi:app
(venv) $ deactivate
$ vim myproject.ini
[uwsgi]
module = wsgi:app
master = true
processes = 5
socket = /var/run/hello/myproject.sock
chmod-socket = 666
vacuum = true
die-on-term = true
nginxの設定ファイル準備
# vim /etc/systemd/system/myproject.service
[Unit]
Description=uWSGI instance to serve myproject
After=network.target
[Service]
User=ymko
Group=users
WorkingDirectory=/home/ymko/hello
Environment="PATH=/home/ymko/hello/venv/bin"
ExecStart=/home/ymko/hello/venv/bin/uwsgi --ini myproject.ini
[Install]
WantedBy=multi-user.target
# systemctl daemon-reload
# vim /etc/nginx/conf.d/hello.conf
server {
listen 80;
location / {
include uwsgi_params;
uwsgi_pass unix:/var/run/hello/myproject.sock;
}
}
# systemctl reload nginx
UNIX-domain socketの置き場を準備
# mkdir /var/run/hello
# chmod 777 !$
実行
# systemctl start myproject.service
$ curl localhost
<h1 style='color:blue'>Hello There!</h1>こんにちは。<p />Jul/11/2017<br />AM 08:54<br />
参考
ちゃんと運用するときのuWSGI設定メモ - Qiita https://qiita.com/yasunori/items/64606e63b36b396cf695
nginx + uwsgi でアプリケーションをサブディレクトリで動かす設定 - Qiita https://qiita.com/methane/items/e0949a37c112eedf2b74
Flask + uWSGI + Nginx でハローワールドするまで @ さくらのVPS (CentOS 6.6) - Qiita https://qiita.com/morinokami/items/e0efb2ae2aa04a1b148b
nginxとuwsgiを使っていてInternal Server Errorが発生したとき - ストックドッグ http://www.stockdog.work/entry/2018/04/01/190250