第一种启动方式:使用supervisor控制的原生flask启动【适合调试环境,一旦高度并发可能会崩溃!】
[program:flask_main]
directory=/root/youproject ; 非常重要,选择在那个目录下执行命令
command=/usr/local/Anaconda3/envs/youproject/bin/python -u flask_main.py ; command这里的gunicorn一定是你程序运行的python环境【如果虚拟环境就必须选择虚拟环境下面的路径】
autostart = true ; 在 supervisord 启动的时候也自动启动
autorestart = true ; 程序异常退出后自动重启
startsecs = 3 ; 启动 3 秒后没有异常退出,就当作已经正常启动了
startretries = 3 ; 启动失败自动重试次数,默认是 3
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
user=root
loglevel=info
; 这一配置项的作用是:如果supervisord管理的进程px又产生了若干子进程,使用supervisorctl停止px进程,停止信号会传播给px产生的所有子进程,确保子进程也一起停止。这一配置项对希望停止所有进> 程的需求是非常有用的。
stopasgroup=true
[supervisord] ; 必须配置
[supervisorctl] ; 必须配置
第二种启动方式,使用supervisor控制的gunicorn+gevent启动Flask项目【适合生产环境推荐使用】
[program:flask_main]
directory=/root/youproject; 非常重要,选择在那个目录下执行命令
command=/usr/local/Anaconda3/envs/youproject/bin/gunicorn -c other_config/gunicorn.py flask_main:app ; command这里的gunicorn一定是你程序运行的python环境【如果虚拟环境就必须选择虚拟环境下面的路径】
autostart = true ; 在 supervisord 启动的时候也自动启动
autorestart = true ; 程序异常退出后自动重启
startsecs = 3 ; 启动 3 秒后没有异常退出,就当作已经正常启动了
startretries = 3 ; 启动失败自动重试次数,默认是 3
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
user=root
loglevel=info
stopasgroup=true
[supervisord] ; 必须配置
[supervisorctl] ; 必须配置
gunicorn.py配置文件
# gunicorn+gevent启动Flask服务器的配置文件【gevent兼容配置websocket】
import multiprocessing
import gevent.monkey
# 【使用gevent启动默认都会执行此方法】运行启动添加猴子补丁
gevent.monkey.patch_all()
debug = True
loglevel = "debug"
bind = "0.0.0.0:8099"
workers = multiprocessing.cpu_count() * 2 + 1
chdir = "/root/flaskBlockChainGamble"
backlog = 2048
worker_class = "geventwebsocket.gunicorn.workers.GeventWebSocketWorker"
worker_connections = 1000
# 是否开启后台启动【True开启】----如果使用supervisor监控不能开启【只能前端运行】
daemon = False
# gunicorn -c other_config/gunicorn.py flask_main:app
flask_main.py文件
"""
功能:基于【gunicorn+gevent的linux运行服务器】gevent兼容websocket,且性能最佳!
特殊说明:
1、gevent默认是单线程运行【可使用Python运行,相互请求之间是同步阻塞】
2、gevent必须结合gunicorn运行,开启并发模式【不同请求之间相互独立】,且性能非常给力!
3、gevent是否开启debug模式,请在gunicorn的配置文件下配置debug属性!
"""
from gevent import pywsgi
from geventwebsocket.handler import WebSocketHandler
server = pywsgi.WSGIServer(
('0.0.0.0', 8099), app, handler_class=WebSocketHandler)
server.serve_forever()