之前有好几次网站出现了500的内部错误,然后每次我都要去登一下服务器,重启一下uwsgi服务,才能正常访问。我想可能是服务器挂不住了吧,因为我的服务器配置并不高,才会出现这种异常的现象,但是每次都要手动重启还是挺麻烦的,而且我也不能时刻关注服务器异常,所以就学习了一下Supervisor的配置,我的网站架构是Django+uwsgi+Nginx。
Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。
1.Supervisor的安装
sudo apt-get install supervisor
2.配置文件
通过apt-get install安装后,supervisor的配置文件在:
/etc/supervisor/supervisord.conf
supervisor的配置文件默认是不全的,不过在大部分默认的情况下,上面说的基本功能已经满足。而其管理的子进程配置文件在
/etc/supervisor/conf.d/*.conf
然后,开始给自己需要的脚本程序编写一个子进程配置文件,让supervisor来管理它,放在/etc/supervisor/conf.d/目录下,以.conf作为扩展名(每个进程的配置文件都可以单独分拆也可以把相关的脚本放一起)。如任意定义一个和脚本相关的项目名称的选项组(/etc/supervisor/conf.d/uwsgi.conf):
[program:uwsgi] # program:不能省,类似于声明这是你定义的自启动程序 command=/home/xxx/sites/jzfblog.com/env/bin/uwsgi --ini /home/xxx/sites/jzfblog.com/site_uwsgi/uwsgi.ini # --ini 后跟ini配置文件的目录,而且注意我用的虚拟环境 stopsignal=QUIT autostart=true # 设置该程序在supervisor启动后自动启动 autorestart=true # 当该程序停止后,无条件重新启动。有三个选项分别为true false 和 unexcepted. stdout_logfile=/home/xxx/sites/jzfblog.com/site_uwsgi/supervisor.log # 日志保存路径 stderr_logfile=/home/xxx/sites/jzfblog.com/site_uwsgi/supervisor_err.log # 日志保存路径
3.载入添加的自启动程序
首先切换到root权限(非root会报错error <class 'socket.error'>, [Errno 13] Permission denied: file: /use/lib/python2.7/socket.py line: 228)。
接着输入
supervisorctl reload
会提示Restart supervisord,最后,检验是否成功自启动了程序,输入 ps -ef|grep uwsgi 查看uwsgi是否执行。
4.Supervisor常用命令
①更新新的配置到supervisord
supervisorctl update
②重新启动配置中的所有程序
supervisorctl reload
③启动某个进程(program_name=你配置中写的程序名称)
supervisorctl start program_name
④查看正在守候的进程
supervisorctl
⑤停止某一进程 (program_name=你配置中写的程序名称)
pervisorctl stop program_name
⑥重启某一进程 (program_name=你配置中写的程序名称)
supervisorctl restart program_name
⑦停止全部进程
supervisorctl stop all
注意:显示用stop停止掉的进程,用reload或者update都不会自动重启。