ストックドッグ

KatoTakahiro。金融系の会社で働くSEが株やPython、その他諸々について書いています。サービスも運営してます→http://fmbrain.work

uwsgi + nginx + flaskで簡単なWEBアプリの構築

自分用メモですm(_ _)m

適当にflaskのファイルをこしらえる

ここはすごく適当。

from flask import Flask
app = Flask(__name__)

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

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

nginxの設定ファイル

を編集する。

$ cd /etc/nginx/conf.d


sample.confの中身。

upstream flask {
    server unix:///tmp/uwsgi.sock;
}

server {
    listen      80;
    root /var/www/bot;
    server_name localhost;
    charset     utf-8;
    client_max_body_size 75M;

    location / {
        try_files $uri @flask;
    }

    location @flask {
        include uwsgi_params;
        uwsgi_pass  flask;
    }
}

やっていることはシンプルで、アクセスがあったらuWSGIに接続をする、というもの。

一番重要なところが、これ。

upstream flask {
    server unix:///tmp/uwsgi.sock;
}

webサーバーであるnginxは動的な処理はできないため、動的な処理を行う場合はアプリケーションサーバーであるuWSGIに接続して、処理を投げる。

uWSGIとnginxを接続する場合、方法は2つある。

TCPソケットを使う方法とUNIXドメインソケットを使う方法の2つだ。

TCPソケットを使用する場合は、どこかのポートからuWSGIにアクセスする。

上のコードは、UNIXドメインソケットを使用している。


接続のたびにuwsgi.sockを作成して、通信が終わり次第破棄する。(たぶん)

こちらのほうがポートを消費しなくてよい。

uWSGIの設定ファイル

を編集する。

$ cd /var/www/bot
$ vi sample.ini


sample.iniの中身。

[uwsgi]
module = app
callable = app
master = true
processes = 1
socket = /tmp/uwsgi.sock
chmod-socket = 666
vacuum = true
die-on-term = true

これ↓がソケットを作成するコード。

socket = /tmp/uwsgi.sock

uWSGIを動かし、通信が発生したらuwsgi.sockが/tmpに作成される。

ここを介して、webサーバーとアプリケーションサーバーは通信を行う。

そのため、uwsgi.sockのパスはnginx側とuWSGI側で揃えておく必要がある。

nginxとuWSGIを動かす

$ systemctl restart nginx.service
$ uwsgi --ini sample.ini

#vpsで動かすときは、バックグラウンドで実行
#正しい運用方法かどうかは知らない
$ uwsgi --ini sample.ini &

ちなみに、uwsgiは今回の設定だと、sample.iniがあるディレクトリで実行しなければいけない。

まとめ

uWSGIとnginxの関係性や接続方法がわからず苦しんだ。

これらを読むことで概要は把握できた。


【nginxの勉強資料】

スライドシェアでnginxについての概要がわかりやすくまとめられている
https://www.slideshare.net/yujiotani16/nginx-16850347

webサーバーとアプリケーションサーバーの違いがまとめられている
https://qiita.com/jnchito/items/3884f9a2ccc057f8f3a3

リクエストをwebサーバーとアプリケーションサーバーでの処理の流れをする
「WASへのリクエスト転送」の章必見
webサーバーとアプリケーションサーバーの通信方法についての記載あり
https://www.ibm.com/developerworks/jp/websphere/library/was/toranomaki/5.html