はじめに
WSGIについて理解するために、Flask+uWSGI+NginxでWebサーバを構築してみます。
WSGIとは
WSGI(Web Server Gateway Interface)とは、PythonのWebアプリケーションとWebサーバの標準インターフェースです。
WSGIに対応したWebフレームワークは以下のようなものがあります。
- Flask
- Django
WSGIに対応したアプリケーションは、WSGIサーバで動作することでWebサーバとやりとりできるようになります。
WSGIサーバには以下のようなものがあります。
- uWSGI
- gunicorn
WebサーバとWSGIサーバとアプリケーションは以下のようなイメージで処理されます。
環境準備
今回試す環境はVagrantで構築したUbuntuを利用します。
Vagrantについては下記で紹介しています。

まずはVagrantfile
を用意します。
Vagrant.configure("2") do |config|
config.vm.box = "bento/ubuntu-20.04"
config.vm.network "private_network", ip: "192.168.0.10"
config.vm.network "forwarded_port", guest: 8080, host: 8080
end
Vagrantfile
があるディレクトリでvagrant up
します。
vagrant up
VMが起動したらsshします。
vagrant ssh
NginxとuWSGIのインストール
次にNginxとuWSGIをインストールします。
sudo apt update
sudo apt install python3-pip
sudo pip3 install uwsgi
sudo apt install -y nginx
アプリ作成
Flaskのアプリケーション部分を実装します。
まずFlaskをインストールしておきます。
pip3 install flask
ホームディレクトリにtestapp
ディレクトリを作成して、app.py
を作成します。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return '<h2>Hello Flask+uWSGI+Nginx</h2>'
if __name__ == "__main__":
app.run(host='0.0.0.0')
以下のようになります。
.
└── testapp
└── app.py
uWSGIの起動
続いて、Flaskアプリを呼び出すwsgi.py
を作成します。
from app import app
if __name__ == '__main__':
app.run()
uWSGIの設定ファイルapp.ini
を作成します。
[uwsgi]
module = wsgi:app
master = true
socket = /tmp/uwsgi.sock
chmod-socket = 666
wsgi-file = /home/vagrant/testapp/wsgi.py
logto = /home/vagrant/testapp/uwsgi.log
uWSGIに必要なファイルが揃ったので、uWSGIをバックグランドで起動しておきます。
uwsgi --ini app.ini &
ディレクトリは以下のようになります。
.
└── testapp
├── app.ini
├── app.py
└── wsgi.py
Nginxの起動
次にNginxの設定と起動をします。
/etc/nginx/sites-enabled
にmyapp.conf
というファイルを作成します。
server {
listen 8080;
location / {
include uwsgi_params;
uwsgi_pass unix:///tmp/uwsgi.sock;
}
}
設定ファイルが用意できたら、Nginxを起動します。
sudo systemctl start nginx
ブラウザから確認
ブラウザからhttp://192.168.0.10:8080/
にアクセスするとVM上のWebサーバにアクセスできます。
サービス起動
uWSGIをsystemdのサービスとして起動するように変更します。
まずは先ほどバックグラウンドで起動したuWSGIを終了します。
killall -9 uwsgi
サービスのユニットファイルを/etc/systemd/system/myapp.service
として作成します。
[Unit]
Description=uWSGI instance for testapp
After=syslog.target
[Service]
ExecStart=/usr/local/bin/uwsgi --ini /home/vagrant/testapp/app.ini
WorkingDirectory=/home/vagrant/testapp
User=vagrant
Group=www-data
RuntimeDirectory=uwsgi
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
[Install]
WantedBy=multi-user.target
下記でサービスを有効にします。
sudo systemctl start myapp
先ほどと同じようにブラウザから確認できるようになっています。