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


[flask を uWSGI と Nginx でデプロイする \- Qiita](https://qiita.com/ekzemplaro/items/a570f79de254428a151d)

をやってみた試行錯誤の記録である。
元記事は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にする。

```ini:/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 \- 朝日ネット　開発者ブログ](http://techblog.asahi-net.co.jp/entry/2018/06/15/162951)

※[virtualenv の \-\-no\-site\-packages オプションを間違って覚えてた \- Study08\.net 対シンバシ殲滅用人型機動兵器](http://tell-k.hatenablog.com/entry/2012/01/17/233138)

よりvenv環境作成

```bash
$ mkdir hello
$ cd !$
$ python36 -m venv venv
$ source venv/bin/activate
(venv) $ pip install uwsgi flask
(venv) $ vim myproject.py
```



```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')
```

```bash
(venv) $ vim wsgi.py
```

```py:wsgi.py
# vim:set ts=4 expandtab:
from myproject import app

if __name__ == "__main__":
    app.run()
```

```bash
(venv) $ uwsgi --socket 0.0.0.0:5000 --protocol=http -w wsgi:app
(venv) $ deactivate
$ vim myproject.ini
```

```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の設定ファイル準備

```bash
# vim /etc/systemd/system/myproject.service
```

```ini:/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
```

```bash
# systemctl daemon-reload
# vim /etc/nginx/conf.d/hello.conf
```

```conf:/etc/nginx/conf.d/hello.conf
server {
    listen       80;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/var/run/hello/myproject.sock;
    }
}
```

```bash
# systemctl reload nginx
```


## UNIX-domain socketの置き場を準備

```bash
# mkdir /var/run/hello
# chmod 777 !$
```

# 実行

```bash
# 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