Run flask via waitress
Table of contents
Background
在開發階段 Flask default 所提供的 WSGI ( Python Web Server Gateway Interface ) 連官方都提醒僅適用於開發環境,那之前我都是透過 Gunicorn 跑在前面,這次我想嘗試看看用 Waitress,因此產出了這篇筆記。
Purpose
為了避免 Flask 不穩,先改用 waitress 取代原本的 Werkzeug。
Enable SSL。
手順
1. 安裝 waitress
透過 pip 套件管理安裝,目前專案用 pipenv 管理。
pipenv install waitress
2. 修改既有 app.py
目前專案的 flask run 是 based on app.py,所以為了要讓 waitress 在運行時,知道是在為哪隻 python script 服務,要將剛剛所安裝的 waitress module 裡的 serve import 進去。
另外,因為該 service 需要掛 certificate 以支援 HTTPS 連線,在不想要在前面再新增一台 nginx 去做 reverse proxy 的前提下,直接透過 Python 裡內建的 ssl 去處理。
# WSGI
from waitress import serve
# SSL
import ssl
# 將原本的 app.run 改成 serve, 目前這樣的設定代表該 service listen 0.0.0.0:50924
if __name__ == "__main__":
# Create SSL context
context = ssl.SSLContext(ssl.PROTOCOL_TLS)
context.load_cert_chain(certfile='./static/k8s.crt', keyfile='./static/k8s.key')
# Serve with SSL
serve(app, host='0.0.0.0', port=50920, ssl_context=context)
3. 運行方式
從原本的 flask run 改成用 waitress 跑
python app.py
Case - 如果前面有 reverse proxy server 做 ssl 處理
僅需要在原本擁有 app.py 的 folder 底下,透過 waitress-server 直接 run service。( 要先做完手順 1 的安裝 )
waitress-serve --port=50920 app:app
結語
不過實際上轉成 waitress 後,我還有遇到 access log 的問題,這部分可以之後再開一篇來做紀錄,以及如何將其容器化的手順。
參考
https://minglunwu.com/notes/2021/flask_plus_wsgi.html/
https://flask.palletsprojects.com/en/2.3.x/deploying/
https://docs.pylonsproject.org/projects/waitress/en/latest/
https://github.com/Pylons/waitress?tab=readme-ov-file
Subscribe to my newsletter
Read articles from Kanglin Wu directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by