gunicorn+supervisor
1.gunicorn
安装:
pip3 install gunicorn
配置:
两种方式:命令和文件,因为配置项比较多,所以放在文件里,启动时指明配置文件即可
命令:
如:gunicorn –w 4 –b 0.0.0.0:5000 –c config.py manager:app
-b 绑定应用的ip和端口
-w work的数量,官方说可以有:核心数*+1个
-c 指定配置文件
manager 入口程序文件,即manager.py
app manager中的flask对象
配置文件config.py:
import multiprocessing
import os# 如果没有日志目录,创建一个;在当前gunicorn运行目录
if not os.path.exists(‘log‘):
os.mkdir(‘log‘)
debug = True
bind = ‘0.0.0.0:5000‘
# pid文件为文本文件,内容只有一行, 记录了该进程的ID;
# 防止进程启动多个副本。只有获得pid文件(固定路径固定文件名)写入权限(F_WRLCK)的进程才能正常启动并把自身的PID写入该文件中。其它同一个程序的多余进程则自动退出。
pidfile = ‘log/gunicorn.pid‘
loglevel = ‘debug‘ # 日志等级,与accesslog相关
logfile = ‘log/gunicorn_debug.log‘ # debug日志?实际没有生成
errorlog = ‘log/gunicorn_error.log‘ # 运行产生的具体日志信息
accesslog = ‘log/gunicorn_access.log‘ # 只有请求日志,每个请求一条,包括请求的时间,大小,路径
access_log_format = ‘%(h)s %(l)s %(p)s %(u)s %(t)s %(r)s %(s)s %(b)s %(f)s %(a)s %(D)s‘
reload = True# 启动的进程数
workers = multiprocessing.cpu_count()# 以何种方式处理请求
# (同步:sync),(异步:gevent/eventlet),(asyncIO:gthread/ gaiohttp),(tornado:tornado)
worker_class = ‘gunicorn.workers.ggevent.GeventWorker‘
x_forwarded_for_header = ‘X-FORWARDED-FOR‘
配置好后通过gunicorn –c config.py manager:app启动
将flask日志整合进gunicorn
这样就不需要单独存储flask的日志,最终只需要查看gunicorn记录的flask日志即可
if __name__ != ‘__main__‘:
# 如果不是直接运行,则将日志输出到 gunicorn 中# 会读取gunicorn的日志配置,如存放目录、格式等
gunicorn_logger = logging.getLogger(‘gunicorn.error‘)
app.logger.handlers = gunicorn_logger.handlers
app.logger.setLevel(gunicorn_logger.level)
原文:https://www.cnblogs.com/justaman/p/11888392.html