部署一个标准Python(Flask)应用的备忘录
使用到的工具链:
- virtualenv
- gunicorn
- supervisord
创建隔离独立的Python运行环境
使用virtualenv创建独立的应用环境
virtualenv myProjectName
如果想指定Python的版本virtualenv -p /path/to/python myProjectName
修改requirements.txt 文件,添加gunicorn和supervisor的安装
例如:1
2
3
4......
supervisor==3.3.3
gunicorn==19.7.1安装依赖包
pip install -r requirements.txt
配置多进程访问Python App的环境
创建gunicorn配置文件:vim gunicorn_config.py
文件模版:
1 | # |
如果到这一步不需要守护进程,就只需要在配置文件中将daemon=False
改为daemon=True
然后通过启动gunicorn的命令将应用启动gunicorn myProjectMainModual:app -c /path/to/myProjectName/gunicorn_config.py
此时应用就已经启动起来了(如果不需要守护进程的情况下)
配置守护进程
在CentOS7环境下使用supervisor Supervisor: A Process Control System 做为gunicorn的守护进程, 以下是如何在CentOS7环境下安装和配置supervisor的过程。
supervisor
安装supervisor
- 切换用户到
root
用户:sudo su -
- 使用
pip install
安装supervisorpip install supervisor
- 创建
supervisord
配置文件echo_supervisord_conf > /etc/supervisord.conf
- 切换用户到
配置supervisor
- 切换回需要运行supervisord的系统用户
exit
- 编辑
/etc/supervisord.conf
配置文件,添加program
节点
配置文件模版:
1
2
3
4
5
6
7[program:demo]
command=/usr/local/bin/gunicorn myProjectMainModual:app -c /path/to/myProjectName/gunicorn_config.py
directory=/path/to/myProjectName
user=<user_name>
autostart=true
autorestart=true
redirect_stderr=true- 切换回需要运行supervisord的系统用户
启动supervisord
supervisord -c /etc/supervisord.conf
- 启动supervisorctl 控制配置
事实上如果是第一次启动,上面启动supervisord的过程就已经将新加载的program
节点加载进来了,后续如果想再添加和加载program
节点可以通过supervisorctl
进行。
配置好之后通过supervisorctl命令将刚才配置好的需要被守护的程序加载到supervisord中:supervisorctl -c /etc/supervisord.conf
以下以之上配置的demo
程序为例
在supervisorctl的命令行中supervisor>
输入:supervisor> reread
supervisor> add demo
没有提示任何错误后,这个程序就完成了守护进程的配置工作。
更多supervisorctl指令请参照官方文档supervisorctl Command-Line Options
将supervisord设置为系统开机自动启动进程
创建systemd开机自动脚本
- 创建文件
sudo vim /etc/systemd/system/supervisord.service
- 按照以下配置文件模版进行编辑
Running supervisord automatically on startup
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# supervisord service for systemd (CentOS 7.0+)
# by ET-CS (https://github.com/ET-CS)
# https://github.com/Supervisor/initscripts/blob/master/centos-systemd-etcs
[Unit]
Description=Supervisor daemon
[Service]
Type=forking
ExecStart=/usr/bin/supervisord
ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target- 创建文件
启动服务
sudo systemctl start supervisord
查看服务
sudo systemctl status supervisord
设置服务为系统开机自动启动
sudo systemctl enable supervisord
进程服务重启
通过以上配置就形成了 systemd
-> supervisord
-> gunicorn
-> Python Application(Flask)
的守护调用关系。
由于supervisord
在这里扮演的是守护进程角色,所以WSGI Python 应用进程的意外退出将有supervisord
负责重启和守护;
但是由于supervisord
本身也是一个系统进程,只是这个进程身份稍微比较特殊而已,也就是说这个进程也是存在意外退出的风险,遇到这样upstream服务不可用的状态可以用sudo systemctl status supervisord
来查看服务状态,如果确定是服务进程意外退出可以使用sudo systemctl restart supervisord
重启服务。
补充更新
在 Ubuntu 发行版下
在Ubuntu 发行版下,supervisor可以通过 apt install supervisor
的方式安装即可,supervisor 自动就设置为systemd的自启动服务。