2021-01-13に更新

nginx + uWSGI + Flask で python webアプリを立ち上げる

nginx + uWSGI + Flask で python webアプリを立ち上げる

開発中は Flask の dev server で良いのだけれど、リリース時にはフロントのHTTPサーバを用意する必要がある。

Deployment は選択肢がいくつかあるけれど、今回はUbuntu上で、HTTPサーバに nginx、Flaskで作ったPython Webアプリを動かす WSGIコンテナに uWSGI を使った構成の設定例。

インストール

nginx, uwsgi, Flask をインストールする。uwsgi と Flask は venv 環境で。

$ uname -a
Linux hoge-machine 5.4.0-52-generic #57~18.04.1-Ubuntu SMP Thu Oct 15 14:04:49 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
$ sudo apt install nginx
$ python3 -V
Python 3.6.9
$ mkdir venv; cd venv
$ python3 -m venv flaskapp
$ source ~/venv/flaskapp/bin/activate
(flaskapp) $ pip install -U pip
(flaskapp) $ pip install flask uwsgi

nginx の設定ファイル

https://flask.palletsprojects.com/en/1.1.x/deploying/uwsgi/#configuring-nginx

flask で uwsgi を使う場合の nginx 設定ファイル例は上に載っているので、それを参考に。
アプリ名を nginx_yourapp とか your_application とかにしているが適当に変える。

nginx_yourapp.conf

server {
    listen 80;
    listen [::]:80;

    server_name hoge-machine.com;

    root /var/www/example.com;
    index index.html;

    location = /your_application { rewrite ^ /your_application/; }
    location /your_application {
        try_files $uri @your_application;
    }
    location @your_application {
        include uwsgi_params;
        uwsgi_pass unix:/tmp/your_application.sock;
    }
}

nginx の設定ファイルは /etc/nginx/sites-available 下に置いて、/etc/nginx/sites-enabled 下に
シンボリックリンクを張り、サービス再起動する。Permission 関係はよしなに。

$ mkdir -p ~/path/to/nginx_yourapp; cd ~/path/to/nginx_yourapp
$ vim nginx_yourapp.conf
(上記の設定ファイルを作る)
$ cp nginx_yourapp.conf /etc/nginx/sites-available/
$ ln -s /etc/nginx/sites-available/nginx_yourapp.conf /etc/nginx/sites-enabled/nginx_yourapp.conf
$ systemctl restart nginx

webアプリの準備

https://flask.palletsprojects.com/en/1.1.x/quickstart/#a-minimal-application

Flask の HelloWorld。

index.py

from flask import Flask

app = Flask(__name__)


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

uwsgi の起動コマンド

  • ソケットファイルは nginx の設定ファイルと合わせること
  • --chmod-socket=666 はパーミッション関連でこけたら
  • --mount はアプリパスと実行するスクリプト名:Flask appオブジェクト名を正しく指定する
  • --virtualenv は venv で作ったPython仮想環境を正しく指定する。
$ uwsgi -s /tmp/nginx_yourapp.sock --chmod-socket=666 --manage-script-name --mount /nginx_yourapp=index:app --virtualenv ~/venv/flaskapp

後はブラウザから http://<サーバのIPアドレス>/nginx_yourapp/ にアクセスすれば Hello World が表示される。

FAQ

502 Bad Gateway が出る

ソケットファイルの permission 関連がおかしいかも。
/var/log/nginx/error.log あたりを覗くとヒントがあるかも。

404 Not Found が出る

アプリパス指定が正しくないかも。

接続できない

nginx が正しく動いているなら、 http://<サーバのIPアドレス>/ で何かが開けるはず。
ダメならnginxが正しく起動できていないか、そもそもサーバに到達できてないか、
サーバが外からのリクエストを受け付けていないので、そちらの方面でなんとかする。

ツイッターでシェア
みんなに共有、忘れないようにメモ

keyangu

組み込み(C) -> 光学系ちょっと(Halcon, OpenCV) -> なぜか機械学習(Python)。 断片的なメモはQrunchのログに書き殴っていることが多いです。

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント