You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Flask项目集成Flask-SocketIO时Nginx反向代理下Socket连接问题

解决Flask-SocketIO在Nginx反向代理下的连接问题

我来帮你搞定这个Socket连接的问题~ 你遇到的情况是因为Nginx默认的反向代理配置没有适配SocketIO的WebSocket和长轮询机制,再加上路径重写的影响,需要调整Nginx配置和前端连接代码。

第一步:修改Nginx配置

你现有的Nginx配置只处理了普通HTTP请求,SocketIO需要额外的配置来支持WebSocket升级和长连接。把你的location /plivo_api块改成下面这样:

location /plivo_api {
    rewrite ^/plivo_api(.*) /$1 break;
    proxy_pass http://127.0.0.1:8090;

    # SocketIO 必需的配置
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $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_read_timeout 86400;
    proxy_send_timeout 86400;
}

关键参数说明:

  • proxy_http_version 1.1:WebSocket依赖HTTP/1.1协议,必须开启
  • UpgradeConnection头:告诉Nginx处理WebSocket的协议升级请求
  • 各种X-*头:确保后端能获取到真实的客户端信息(比如IP、访问协议)
  • 长超时设置:SocketIO的长轮询模式需要比普通请求更长的超时时间,避免连接被意外断开

第二步:调整前端Socket连接代码

因为Nginx把/plivo_api路径重写为后端的/,所以前端连接时需要指定SocketIO的请求路径为/plivo_api/socket.io(SocketIO默认的请求路径是/socket.io)。

把你的前端连接代码改成这样:

// 如果你是在域名根目录下访问
var socket = io.connect('/', { path: '/plivo_api/socket.io' });

// 或者用绝对域名(更稳妥)
var socket = io.connect('https://your-domain.com', { path: '/plivo_api/socket.io' });

第三步:验证后端Flask-SocketIO配置

确保你的Flask-SocketIO初始化没有自定义path参数(默认就是/socket.io),如果之前设置过app.config['SOCKETIO_PATH'],要保证它和Nginx重写后的路径一致(比如如果后端设置为/custom/socket.io,那前端路径就要是/plivo_api/custom/socket.io)。

完成以上三步后,重启Nginx和你的Flask服务,应该就能正常建立Socket连接了~

内容的提问来源于stack exchange,提问作者Freddy

火山引擎 最新活动