已经搭建好了一个Flask应用,当前启动方式是gunicorn -b 0.0.0.0:8000 wsgi:application,但是每次部署的时候都需要先cat router.pid,然后kill掉进程,代码更新后,再重启应用。显得有待呢让麻烦,网上有一票的关于Flask部署,以gunicorn + flask ++ supervisor部署测试。

创建虚拟环境 virtualenv

在一个系统中创建不同的 Python 隔离环境,相互之间还不会影响,为了使系统保持干净,遂决定用 virtualenv 跑应用程序,创建一个容易识别的目录,开始安装,再创建项目目录 super,然后激活环境:

1
2
3
4
sudo pip install virtualenv
mkdir ~/Documents/web_project && cd ~/Documents/web_project
virtualenv env
source env/bin/activate

安装各种需求库

创建了虚拟环境以后,需要在虚拟环境里面安装各种依赖库。很简单:

1
pip install -r requiremensts.txt

一系列时间等待以后,就安装好了。

生成supervisor配置文件

supervisor是守护进程的工具,首先需要生成配置文件

1
2
cd ~/Documents/web_project
echo_supervisord_conf > supervisor.conf

然后修改配置文件,我选择的方式是全部删除当前内容,放入我已经测试写好的配置内容:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
[unix_http_server]
file=/tmp/supervisor.sock ; (the path to the socket file)
[inet_http_server] ; inet (TCP) server disabled by default
port=0.0.0.0:9001 ; (ip_address:port specifier, *:port for all iface)
username=xx ; (default is no username (open server))
password=xx ; (default is no password (open server))
[supervisord]
logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10 ; (num of main logfile rotation backups;default 10)
loglevel=info ; (log level;default info; others: debug,warn,trace)
pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false ; (start in foreground if true;default false)
minfds=1024 ; (min. avail startup file descriptors;default 1024)
minprocs=200 ; (min. avail process descriptors;default 200)
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
serverurl=http://0.0.0.0:9001 ; use an http:// url to specify an inet socket
username=xx ; should be same as http_username if set
password=xx ; should be same as http_password if set
;prompt=mysupervisor ; cmd line prompt (default "supervisor")
;history_file=~/.sc_history ; use readline history if available
[include]
files = /etc/supervisor/*.conf
[program:webhook]
directory = /Users/djx/Documents/web_project/ci_ios/webhook ; 程序的启动目录
command = /Users/djx/Documents/web_project/env/bin/gunicorn -b 0.0.0.0:8000 wsgi:application ; 启动命令,可以看出与手动在命令行启动的命令是一样的
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 0 ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = false ; 程序异常退出后自动重启
startretries = 0 ; 启动失败自动重试次数,默认是 3
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数
stdout_logfile=/tmp/gunicorn.log
stderr_logfile=/tmp/gunicorn.err

可以通过supervisor -c supervisor.conf启动。
而且有一个web界面可以管理查看进程。
http://127.0.0.1:9001
Supervisord进程管理界面

supervisor相关命令介绍

supervisor的基本使用命令

1
2
3
4
5
supervisord -c supervisor.conf
supervisorctl -c supervisor.conf status 查看supervisor的状态
supervisorctl -c supervisor.conf reload 重新载入 配置文件
supervisorctl -c supervisor.conf start [all]|[appname] 启动指定/所有 supervisor 管理的程序进程
supervisorctl -c supervisor.conf stop [all]|[appname] 关闭指定/所有 supervisor 管理的程序进程

后续会加入nginx的配置,但是我还没有自己理清楚,未完待续。。。