2020-04-26 15:24:14 Cyberbolt
上篇笔记 CentOS下通过Gunicorn+Nginx部署Python Flask网站,并配置https和Nginx访客日志 实现了Gunicorn部署Flask网站,采用新建 独立命令窗口 的方法实现Gunicorn后台运行。然而,实际生产环境中,我们可能需要Gunicorn 随服务器开机自启 或 系统出错时及时重启。下面记录我部署Supervisor的全过程。
这篇笔记建立于 CentOS下通过Gunicorn+Nginx部署Python Flask网站,并配置https和Nginx访客日志 实现后的优化,若您暂没有实现Gunicorn部署上线,请先阅读它。
环境: CentOS 7, Python 3.6.8
进入CentOS命令窗口,输入如下命令安装Supervisor
yum install supervisor
按提示操作,安装完成后,默认位置为 /etc/supervisord.conf 。我们需要在 /etc/supervisord.d 目录新建一个 ini 配置文件。这里使用 vi 命令新建文件,如下
vi /etc/supervisord.d/xxx.ini #xxx为自定义名称
按下键盘 i 进入编辑页面,输入如下信息(SSH客户端窗口按 Shift + Insert键 粘贴)
[program:xxx] ; :右边是项目名称
directory = /www/flask/xxx ;程序的启动目录,这里是Flask网站根目录
command = /www/flask/xxx/venv/bin/gunicorn -w 4 -t 30 -b 0.0.0.0:5000 app:app ;启动虚拟环境下的gunicorn,这里建议使用绝对路径
autostart = true ; 在 supervisord 启动的时候也自动启动
autorestart = true ;程序异常退出后自动重启
stdout_logfile = /supervisor_log/supervisor.log ;日志存放路径,这个路径需要是已存在的路径
startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了
stopwaitsecs=0 ; 停止等待时间
上述信息中
; 是注释符
command行 /www/flask/xxx/venv/bin/gunicorn 是该项目虚拟环境中Gunicorn的绝对路径,请根据实际路径不同灵活调整(Gunicorn的命令见笔记首部链接的文章)
输入正确信息后,依次按下键盘 esc 键、: 键、w 键、q 键,然后回车(保存并退出)
此时已成功安装并配置Supervisor,Supervisor貌似是自动启动的,在命令窗口输入
supervisorctl reload #保存配置文件并重启
如图,Supervisor已重启
继续输入
supervisorctl
这时能看到 XXX RUNNING 字段,代表网站已启动
现在试试重启服务器吧!网站将自动启动。
若更新了Flask源码,输入 supervisorctl reload 即可重启新代码
Supervisor常用命令如下:
#关闭所有任务
supervisorctl shutdown
# 启动某个进程
supervisorctl start programxxx
# 重启某个进程
supervisorctl restart programxxx
# 停止全部进程 注:start、restart、stop都不会载入最新的配置文件
supervisorctl stop all
# 载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程。
supervisorctl reload
# 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启。
supervisorctl update
为什么直接指定虚拟环境的路径运行的gunicorn 就不会报找不到模块的错
我之前在脚本里还加source venv/bin/activate这句
回复 embryo:
我自己的测试中,无法使用source venv/bin/activate激活虚拟环境后再运行gunicorn(可能supervisor只支持执行一个命令)
最好的方法是,按虚拟环境中gunicorn的绝对路径直接运行Flask项目
回复 Cyberbolt:
我倒是看到网上有些写到脚本里再放到supervisor的conf里来弄的,但是没有尝试
只是我好奇为什么这样直接也能得到虚拟环境
看这里https://www.v2ex.com/t/489371有人说python 能自己找自己的环境
回复 embryo:
写脚本将问题复杂化了。Python可以直接用虚拟环境的解释器运行,参考https://www.cyberlight.xyz/passage/python3-double-click 这篇笔记,直接指定虚拟环境的python解释器路径即可运行
回复 embryo:
程序根目录下使用 venv/bin/python3 app.py 和 . venv/bin/activate&&python3 app.py 是等效的