Gunicorn教學

slash

細數flask使用gunicorn的坑…

你要先知道

問題都在log檔案配置上面

如果用deamon不會顯示訊息

如果你的flask有session驗證的部分,worker數量建議用1,不然會機率性出現HTTP 500,因為可能在/跟在/callback兩個不同路徑時會切換到不同worker導致session遺失。不然就是要把session寫在資料庫na

設定檔

使用設定檔可以讓你更方便的去啟動gunicorn 不用每次都抄一堆參數,當然如果是小project根本沒差

path

假設今天有個flask檔案叫main.py,位於/flaskapp/main.py
那gunicorn的設定檔就要寫在跟main.py同級的/flaskapp/gun.conf.py
有些人可能google查到會叫你檔名用gun.conf,但在以前的版本中會出現非常多bug,建議使用gun.conf.py,python檔案去寫。

撰寫 gun.conf.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import os
import multiprocessing
from pathlib import Path
# 綁定要監聽的port跟ip,
# 假設main.app是app.run(host='0.0.0.0',port='7654'),那就這樣寫
bind = '0.0.0.0:7654'
# 同時執行的進程數,推薦為當前CPU個數*2+1
workers = 1
# 等待服務客戶的數量,最大為2048,即最大掛起的連接數
backlog = 2048
# sync, gevent,meinheld
# 工作模式選擇,默認為sync,這裡設定為gevent異步
worker_class = "gevent"
# 默認的最大客戶端並發數量
max_requests = 2000
# 是否在後台運行
daemon = True
# 當代碼有修改時,自動重啟workers。適用於開發環境。
reload = True
# 在keep-alive連接上等待請求的秒數,默認情況下值為2。一般設定在1~5秒之間。
# 就是今天client發送請求之後要監聽多久之後才斷開,單位為秒,下面這就是5秒的意思
keepalive = 5
# 設置pid文件的文件名,當前使用的pid號會寫在上面
pidfile = './gunicore.pid'
# debug error warning error critical
loglevel = 'info'
# 訪問、錯誤日誌(log)的路徑還有檔名
accesslog = str('gunicorn_acess.log')
errorlog = str('gunicorn_error.log')
# log的格式
access_log_format = '%({X-Real-IP}i)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"'

command

使用conf設定檔 啟動專案

後面那個main:app
main指的是要啟用的flask app的檔名 指的是main.py
app指的就是在main.py中要啟用的module名字,就是app = Flask(__name__)的那個app

1
gunicorn --config=gun.conf.py main:app

查看目前所有gunicorn的pid

1
pstree -ap | grep gunicorn

成功之後會看到這樣

最上面的為根進程,一定要刪根,刪子的話會刪不掉ㄛ

刪除gunicorn任務

1
2
kill -p <root pid>
kill -p 17768

重啟gunicorn任務

1
2
kill -HUP <root pid>
kill -HUP 17768
  • 標題: Gunicorn教學
  • 作者: slash
  • 撰寫于: 2022-06-01 01:50:40
  • 更新于: 2023-04-25 00:58:47
  • 連結: https://slasholy.tw/2022/06/01/gunicorn01/
  • 版權宣告: 本作品采用 CC BY-NC-SA 4.0 进行许可。