kuroの覚え書き

96の個人的覚え書き

nginx+uWSGIふたたび

https://qiita.com/ekzemplaro/items/a570f79de254428a151d
こんどはこのページを参考に進める。

まずはFlaskのアプリを適当に作成。
foovar.py

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run(host='0.0.0.0')

こんな感じにしておく。

$ python3 foovar.py

と起動してlocalからlocalhost:5000でアクセスするとちゃんとHello World!が表示された。
次にuWSGIとの連携を行うために、もう一つスクリプトを作る。
wsgi.py

from foovar import app

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

これを先程のfoovar.pyと同じディレクトリに置いた状態で

$ uwsgi --socket 0.0.0.0:5000 --protocol=http -w wsgi:app

このように起動し、先ほどと同じようにlocalからlocalhost:5000でアクセスするとこれもちゃんとHello World!が表示された。

この状態でlocal->localhost:5000->uWSGI->wsgi.py->foovar.pyと繋がった模様。

また、--socket 0.0.0.0:80としておくとlocalじゃなく、外のネットワークからポート80でサーバにアクセスしたときにちゃんとFlaskアプリに繋いでくれる。

ここでほんちゃんのデータベースアプリに置き換えて構築していく。
exomedb.iniを作成

[uwsgi]
[uwsgi]
uid = root
gid = root
http = :80
python-path = /opt/database/database.latest
wsgi-file = /opt/database/database.latest/wsgi.py
callable = app
master=true
pidfile=/var/run/exomedb.pid
logger=file:/opt/database/database.latest/exomedb.log

iniファイルを使って起動できるかテスト

$ sudo uwsgi exomedb.ini

問題ない。

/etc/systemd/system/exomedb.serviceを作成

[Unit]
Description=uWSGI instance to serve exomedb
After=network.target

[Service]
User=root
#Group=www-data
WorkingDirectory=/opt/database/database.latest
ExecStart=/usr/bin/uwsgi --ini exomedb.ini

[Install]
WantedBy=multi-user.target

これでwsgidaemon-serviceになったので

$ sudo systemctl start exomedb
$ sudo systemctl enable exomedb

と実行するとdaemonが起動する。
あとはnginx.confの設定。たぶんこれがちゃんとできていなくて動かないんだな。ただし現状幾つものサービスを1つのサーバで運用していないからnginxを通さないこの状態でも問題ないといえば問題ない。セキュリティ面でどうか、というのはあるけど。

ところで、uWSGIで繋がった状態でデータベースにアクセスする段階で、速度の向上が見られたか(つまりPythonのサーバがヘボくて表示が遅かったのか)というと、全然変わらないようで、やはりこの遅さの原因はMySQLMariaDB)内部でのデータ処理に起因しているっぽい。やはりカラム数が無駄に多いことが根本原因な気がするな。