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にアクセスする。
接続のたびに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