開発中は 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
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
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!"
--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
が表示される。
ソケットファイルの permission 関連がおかしいかも。
/var/log/nginx/error.log
あたりを覗くとヒントがあるかも。
アプリパス指定が正しくないかも。
nginx が正しく動いているなら、 http://<サーバのIPアドレス>/
で何かが開けるはず。
ダメならnginxが正しく起動できていないか、そもそもサーバに到達できてないか、
サーバが外からのリクエストを受け付けていないので、そちらの方面でなんとかする。
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント