flask+uWSGI+nginx+flask_socketio+docker+vue部署

部署环境说明

在Ubuntu18.04的服务器上部署的程序。然后分别启动了两个docker,dockerA是我自己用DockerFile编写的环境,用于运行vue项目。dockerB则是直接从nginx官网拉下来的docker(docker pull nginx

方式一:通过HTTP协议

  • 使用 HTTP 协议,通过端口(如 :5000)接收请求
  • 需要 Nginx 或其他 Web 服务器代理,然后转发到 uWSGI
  • 配置简单,适合小型项目

uWSGI的配置文件:

[uwsgi]
http = :5000  # 监听5000的端口来处理HTTP请求
chdir = /tired/gate/management  # 运行目录
wsgi-file = main.py  # 指定运行的Python文件
callable = APP  # 这个文件中名为APP的可调用对象,它是一个Flask应用程序对象。
master = true  # 启用主进程模式
http-websockets = true  # 启用通过HTTP进行WebSocket通信的支持
gevent = 1000 # 将gevent工作进程的数量设置为1000。Gevent是一个基于协程的并发库

nginx的配置文件:

# 运行的子线程数量
worker_processes  5;
events {
    worker_connections  1024;
}
http {
    include    mime.types;
    default_type    application/octet-stream;
    keepalive_timeout  65;
    server {
        listen    80;
        server_name  localhost;
        # web应用后端服务
        location /api {
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_pass http://XXX.XXX.XXX.XXX:5000/api;
        }
        # web应用的前端服务
        location / {
            add_header Access-Control-Allow-Origin *; 
            add_header Access-Control-Allow-Headers X-Requested-With;
            add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
            uwsgi_send_timeout 600;    
            uwsgi_connect_timeout 600; 
            uwsgi_read_timeout 600;
            root /management/dist;
            index index.html;
            try_files $uri $uri/ /index.html;
        }
        # 代理 uWSGI 和 Flask-SocketIO 之间的 WebSockets 连接
        location /socket.io/ {
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;

            proxy_pass http://XXX.XXX.XXX.XXX:5000/socket.io/;
            proxy_http_version 1.1;
            proxy_buffering off;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
        }
    }
}

后端的关键代码

APP = Flask(__name__)
APP.config['SECRET_KEY'] = 'secret!'
SOCKETIO = SocketIO(APP, async_mode="gevent_uwsgi")
SOCKETIO.init_app(APP, cors_allowed_origins='*')
NAME_PLACE = "/realtime"

前端的关键代码

const socket = io('/realtime')
注意事项
  1. dockerA在运行启动的时候,需要把5000端口映射出来
  2. nginx中的http://XXX.XXX.XXX.XXX要根据不同部署机器的IP进行修改
  3. 其中nginx中的配置可以进行替换,前提在nginx的docker中含有/etc/nginx/proxy_params文件
 proxy_set_header Host $http_host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header X-Forwarded-Proto $scheme;

可替换为include proxy_params;
4. 前端代码的IO可以修改为对应的io('http://XXX.XXX.XXX.XXX:5000/realtime'),这样nginx配置文件中的location /socket.io/就不需要弄了(也会失去nginx高性能代理的能力)。
5. uWSGI配置文件中gevent = 1000不能丢了,不然前端 socketio可以访问到后端,后端的socketio无法访问前端。(这个不知道为啥会这样,欢迎懂得一起交流)

方式二:通过socket协议

  • 使用 uWSGI 的 socket 协议,通过文件(/tired/gate/management/uwsgi_main.sock)接收请求
  • 无需 Web 服务器,uWSGI 自身就可以处理请求
  • 配置相对复杂,但性能更高,适合大型项目
    uWSGI的配置文件:
[uwsgi]
module = main:APP
socket = /tired/gate/management/uwsgi_main.sock
chmod-socket = 666
vacuum = true
die-on-term = true
master = true
http-websockets = true
gevent = 1000
processes = 1

nginx的配置文件:

# 运行的子线程数量
# 运行的子线程数量
worker_processes  5;

events {
    worker_connections  1024;
}

http {
    include    mime.types;
    default_type    application/octet-stream;
    keepalive_timeout  65;
    
    server {
        listen    80;
        server_name  localhost;
        # web应用后端服务及,代理 uWSGI 和 Flask-SocketIO 之间的 WebSockets 连接
        location ~ ^/(api|socket.io) {
            include uwsgi_params;
            uwsgi_pass unix:/management/uwsgi_main.sock;
            # 提高uwsgi服务器接受请求数据的缓冲区大小,防止JS过大,访问失败
            uwsgi_buffer_size 2m;
            uwsgi_buffers 4 2m;
        }
        # web应用的前端服务
        location / {
            root /management/dist;
            index index.html;
            try_files $uri $uri/ /index.html;
        }
    }
}
说明

建议使用该方法,原因:

  1. 不用每部署到一台机器,就修改对应的IP地址
  2. socket文件的性能比http的要高
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值