【Flask-1】Nginx 、Gunicorn 、 Supervisor的联合部署

原理图:

nginx:一个反向代理服务器,用来连接本地与互联网

gunicorn:容器,容纳发布在云端的网站

supervisor:进程管理工具,管理gunicorn进程

  • 用gunicorn运行Flask项目

安装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实现本地访问服务器端发布的网站

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 配置管理进程

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已经自启动。

  • 启动这个demo进程
# 权限在test.conf中的user设置
supervisord -c /etc/supervisor/supervisord.conf

supervisor停止命令:

service supervisor stop
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 Flask-SocketIO 和 gunicorn 部署应用时,由于 gunicorn 默认使用的是 synchronous 的 worker class,因此需要使用 eventlet 或 gevent 等异步 worker class 才能够支持 WebSocket 的长连接。 使用 eventlet 或 gevent 时,不需要额外设置多线程,因为它们本身就是异步的并且支持并发处理请求。但是,需要注意的是,使用异步 worker class 时,需要在应用启动时设置 monkey patch,以确保所有的标准库在运行时都能够使用异步的方式进行处理。 在 Flask-SocketIO 中,可以使用 `socketio.run(app, **kwargs)` 方法启动应用,并且设置 `async_mode='eventlet'` 或 `async_mode='gevent'` 参数,以指定使用的异步模式。同时,也需要在启动应用前调用 `monkey_patch()` 方法进行 monkey patch。以下是一个使用 eventlet 异步 worker class 的示例代码: ``` from flask import Flask from flask_socketio import SocketIO app = Flask(__name__) socketio = SocketIO(app, async_mode='eventlet') # 进行 monkey patch import eventlet eventlet.monkey_patch() # 定义 SocketIO 事件处理函数 @socketio.on('connect') def handle_connect(): print('A client connected') # 启动应用 if __name__ == '__main__': socketio.run(app, host='0.0.0.0', port=5000) ``` 使用 gunicorn 启动应用时,可以使用以下命令: ``` gunicorn --worker-class eventlet -w 1 module:app ``` 其中,`--worker-class eventlet` 指定使用 eventlet 异步 worker class,`-w 1` 指定启动一个 worker 进程,`module:app` 指定 Flask 应用的入口模块和应用实例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值