LoginSignup
6
10

More than 5 years have passed since last update.

写経「flask を uWSGI と Nginx でデプロイする」

Last updated at Posted at 2018-06-15

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にする。

/usr/lib/systemd/system/nginx.service
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
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
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
/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
/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

6
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
10