XserverVPSでPythonで書いたWebアプリをFlask+waitressで実行するまでの手順のメモです。
手順は以下の通りです。OSセットアップ直後の環境でスタートします。OSは Ubuntu 22にしています。
手順
- sshでログイン。apt-get update を実行
- apt install python3.10-venv を実行
- venvで仮想環境を構築して、仮想環境をアクティブにする。
- 仮想環境で必要なライブラリなどをセットアップ。Flask 、waitressをインストール
- Flaskアプリ用のフォルダを作成してコード群をup
- 稼働テスト
手順1:
まずはSSHでインストールしてapt-get update します。インストール直後だと古いライブラリがあり、venvインストールでエラーになったりします。
手順2:
OSセットアップ直後だとvenvが入ってないので、まずはvenvをインストールします。
apt install python3.10-venv
手順3:
インストールできたら、以下のコマンドで仮想環境を作ります。yourvenvのところは実際の仮想環境名になります。
source ./yourvenv/bin/activate
Xserverの場合、sshでログインするとデフォルトが「/root」フォルダになり、そのまま作業していくとrootフォルダ以下にいろいろと展開されていくので、気になる人は適当なディレクトリ(例:/home/username/***)を作って、そちらに展開しましょう。
手順4:
無事に仮想環境がアクティブになると、コンソールの表示が以下のようになります。
(仮想環境名) root@IPアドレス #
この状態だとPythonのライブラリなどが何も入っていません。確かめたい人は「pip freeze」とかで確認しましょう。
必要最低限のライブラリをpipでインストールしていきます。とりあえず、今回は Flask と waitress の二つだけあればOKです。
pip install flask
pip install waitress
手順5:
flaskアプリを設置するフォルダを作成して、そこにテスト用のコードをアップします。scpコマンドないしsftpとかでfileをサーバにアップロードします。WindowsだとRloginというターミナルソフトがsftpも使えるので楽です。
テスト用に用意したコードとディレクトリ構造は以下の通りです。全部、app.pyに書いても良いのですが、少し込み入った検証を行うため、あらかじめroutesをわけて、templatesフォルダも設置しています。__init__.py も忘れずに設置します。
/app/app.py
/app/__init__.py
/app/routes/index_routes.py
/app/routes/__init__.py
/app/templates/index.html
各コードは以下の通り。
# /app/app.py
from flask import Flask
from flask import render_template, Blueprint
from waitress import serve
from routes.index_routes import index_bp
app = Flask(__name__)
# Blueprintを登録します。
app.register_blueprint(index_bp)
if __name__ == '__main__':
# app.run('0.0.0.0', port=5000)
serve(app, host='0.0.0.0', port=5000)
# /app/routes/index_routes.py
from flask import render_template, Blueprint
index_bp = Blueprint('index', __name__)
@index_bp.route('/')
def index():
return render_template('index.html')
/app/templates/index.html は、「test waitress」とだけ表示したhtmlにしています。
手順6:
python3 app.py を実行して、 http://ip:5000/ でアクセスして、無事に「test waitress」が表示されていれば成功です。
ちなみに、OSセットアップ直後だと、apacheもnginxもインストールされておらず、httpd が走っていないため、waitress をそのままwebサーバにして、80番ポートで公開も出来ます。app.pyの最後をport=80 とするだけです。
apacheないしnginxを挟むのが本番運用としては適切かとは思いますが、手軽にWebアプリを公開したいだけであれば、Python+Flask+waitressだけでも稼働します。
FlaskアプリをWaitressで起動する際、ターミナルを閉じるとアプリも終了してしまいますので、ターミナルを閉じても稼働させつづけるには、nohupコマンドを使用するか、systemd にきちんと登録して自動起動するようにしておきます。
nohup python server.py &
参考:
Waitress — Flask Documentation (2.2.x) (msiz07-flask-docs-ja.readthedocs.io)