原理图:
nginx:一个反向代理服务器,用来连接本地与互联网
gunicorn:容器,容纳发布在云端的网站
supervisor:进程管理工具,管理gunicorn进程
安装gunicorn,需安装在项目使用的虚拟环境中。
pip install gunicorn
当我们安装好 gunicorn 之后,需要用 gunicorn 启动 flask,注意test.py代码中的name启动了 app.run(),这个含义是用 flask 自带的服务器启动 app。这里我们使用了 gunicorn,test.py 就等同于一个库文件,被gunicorn 调用。
启动Flask有下述两种方式:
1、手动命令启动
# 在test.py的目录下
gunicorn -w 4 -b (0.0.0.0):5000 test:app
浏览器中访问http://10.1.93.28:5000,这里的10.1.93.28是ubuntu系统的ip地址。
-w 表示开启多少个 worker,-b 表示 gunicorn 开发的访问地址,是指绑定本机ip,可以省略掉不写,使用的端口是5000,test为模块名,test:app意味着我的test.py中的服务器实例化对象为app。
另:work count=(2*cpu count)+1
# 查询CPU数量
import multiprocessing
print(multiprocessing.cpu_count())
2、创建配置文件启动
# gunicron.py
worker = 4
worker_class ="gevent" # 采用gevent库,支持异步处理请求
bind = "0.0.0.0:8000"
启动命令:
gunicorn -c gunicorn.py test:app
另:相关命令:
# 查看Gunicorn进程:
ps -aux | grep gunicorn
# pid是第二列
kill -9 进程号
# 杀掉gunicorn进程
pkill gunicorn
nginx安装命令:
sudo apt-get install nginx
编辑配置文件/etc/nginx/sites-available/default,修改location/如下
# 注意下这里的监听端口,访问的时候会用到
listen 80 default_server;
listen [::]:80 default_server;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
proxy_pass http://localhost:9000/;
proxy_redirect off;
proxy_set_header Host $http_post;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
接下来重启nginx服务
sudo /etc/init.d/nginx restart
这时候一定要确保gunicorn服务已经启动,然后访问http://10.1.93.28
其他相关命令:
# 关闭nginx
sudo /etc/init.d/nginx stop
# 重启nginx
sudo /etc/init.d/nginx restart
supervisor不是必需品,若不嫌麻烦,每次都可以通过gunicorn来启动,并且kill进程来关闭。
supervisor安装命令:
pip install supervisor
#或通过apt安装,通过此方式安装后会自动加入到系统服务里,随着系统启动而启动
sudo apt install supervisord
1、生成配置文件:
# 创建 /etc/supervisor 文件夹
mkdir /etc/supervisor
# 生成默认supervisord.conf 文件
echo_supervisord_conf > /etc/supervisor/supervisord.conf
# 为supervisord.conf增加执行权限
chmod +x /etc/supervisor/supervisord.conf
2、在/etc/supervisor/中创建conf.d文件夹
# 创建 /etc/supervisor/conf.d 文件夹
mkdir /etc/supervisor/conf.d
3、修改supervisord.conf最后的[include]部分配置:
[include]
files = /etc/supervisor/conf.d/*.conf
这样就可以支持子配置文件,而不用改动主配置文件。
4、在/etc/supervisor/conf.d/中新增子进程配置文件test.conf。
# 创建test.conf 文件
vim /etc/supervisor/conf.d/test.conf
# 为hello.conf增加执行权限
chomod +x hello.conf
创建test.conf配置文件
[program:test]
command=/home/zxh/anaconda3/envs/yolov5/bin/gunicorn -w 4 -b :9000 test:app
directory=/home/zxh/impediment_perception_service //项目目录
autostart=true
autorestart=true
user=zxh
redirect_stderr=true
在上面的配置文件中,[program:hello]设置了进程名,这与之后操作进程的状态名称有关,为test;command为进程运行的命令,必须使用绝对路径,并且使用虚拟环境下的gunicorn命令;user指定了运行进程的用户。
注:hello.conf中不要有汉字
5、配置supervisor开机自启动
在/lib/systemd/system/中添加supervisord.service文件,配置如下:
[Unit]
Description=Supervisord Service
[Service]
Restart=on-failure
RestartSec=42s
User=zxh
ExecStart=/home/zxh/anaconda3/bin/supervisord -n -c /etc/supervisor/supervisord.conf
[Install]
WantedBy=multi-user.target
执行如下命令:
sudo systemctl daemon-reload
sudo systemctl enable supervisord.service
sudo systemctl start supervisord.service
最后重启就可以看到,supervisor已经自启动。
# 权限在test.conf中的user设置
supervisord -c /etc/supervisor/supervisord.conf
supervisor停止命令:
service supervisor stop