Nginx代理下Socket IO请求被拒绝问题求助
问题排查与解决方案
核心原因:Socket.IO路径前缀不匹配
通过Nginx访问/app/socket.io/时,客户端发起的Socket.IO握手请求会携带路径/app/socket.io,但后端python-socketio服务默认只监听/socket.io路径,导致握手阶段路径不匹配,连接被中断。
具体修复方案
方案1:调整后端Socket.IO配置适配代理前缀
修改asgi.py中的socketio.ASGIApp初始化代码,指定Socket.IO的处理路径为/app/socket.io:
# 替换原application初始化代码 application = socketio.ASGIApp(sio, django_application, path='/app/socket.io')
当前Postman请求的路径已符合要求,无需调整客户端连接地址。
方案2:调整Nginx配置保持路径一致性
若不想修改后端代码,可调整Nginx的proxy_pass配置,让请求路径完整转发到后端:
location /app/socket.io/ { 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; # 去掉末尾的/socket.io/,保留完整路径转发 proxy_pass http://app:8000; proxy_read_timeout 86400s; proxy_send_timeout 86400s; }
同时仍需修改asgi.py,让Socket.IO服务监听/app/socket.io路径(同方案1的代码调整)。
额外验证点
- 检查Django的
ALLOWED_HOSTS是否包含Nginx所在主机或*(开发环境),避免主机验证失败中断连接。 - 查看Uvicorn debug日志,确认收到的请求路径是否符合预期(如是否包含
/app/socket.io)。 - 确认Nginx与Docker容器间网络连通正常,无防火墙或端口映射问题。
内容的提问来源于stack exchange,提问作者lordsarcastic
相关产品推荐
相关产品推荐

