Flask+uWSGI+NginxでWSGIを試してみる

はじめに

WSGIについて理解するために、Flask+uWSGI+NginxでWebサーバを構築してみます。

WSGIとは

WSGI(Web Server Gateway Interface)とは、PythonのWebアプリケーションとWebサーバの標準インターフェースです。

PEP 3333 -- Python Web Server Gateway Interface v1.0.1
The official home of the Python Programming Language

WSGIに対応したWebフレームワークは以下のようなものがあります。

  • Flask
  • Django

WSGIに対応したアプリケーションは、WSGIサーバで動作することでWebサーバとやりとりできるようになります。

WSGIサーバには以下のようなものがあります。

  • uWSGI
  • gunicorn

WebサーバとWSGIサーバとアプリケーションは以下のようなイメージで処理されます。

環境準備

今回試す環境はVagrantで構築したUbuntuを利用します。

Vagrantについては下記で紹介しています。

【超入門】Vagrantで仮想マシンを動かす
はじめにVagrantの入門として、超基本的な使い方の解説と実際にCentOSとUbuntuの仮想マシンを構築したいと思います。Vagrantfileについても基本だけ触れたいと思います。Vagrantとは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-enabledmyapp.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

先ほどと同じようにブラウザから確認できるようになっています。

参考

タイトルとURLをコピーしました