1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

uWsgiの実運用

Last updated at Posted at 2024-05-04

はじめに

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の設定

#ここを追記
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を置きます。

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に置きます。

/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の設定

サービスを作ります。

/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

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?