部署到域名后Django WebSocket出现404错误求助
问题分析
从ASGI日志能看到,到达ASGI服务的请求路径是/chat/1/,但你的WebSocket路由定义的是ws/chat/<str:room_name>/,路径不匹配直接导致404错误。核心问题出在Nginx的转发规则和WebSocket协议支持配置上。
解决方案
1. 修正Nginx的WebSocket转发路径
你的Nginx配置里,location /ws/下的proxy_pass末尾带了斜杠,这会让Nginx把请求路径中的/ws/部分替换为空,将/ws/chat/1/转发成/chat/1/,而ASGI服务期望接收完整的/ws/chat/1/路径。
修改Nginx配置如下:
location /ws/ { proxy_pass http://app-development-asgi; # 去掉末尾的斜杠 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 新增WebSocket协议必需的头信息 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; }
2. 确认ASGI路由匹配逻辑
你的ASGI配置中,WebSocket路由已经正确定义了ws/chat/<str:room_name>/,修正Nginx转发规则后,ASGI服务会收到完整的/ws/chat/1/请求,就能匹配到对应的ClubFeedConsumer。
3. 处理WSS(WebSocket over SSL)协议问题
如果要使用wss://协议,需要在Nginx中配置SSL证书并监听443端口:
server { listen 443 ssl; server_name domain_name; ssl_certificate /path/to/your/cert.pem; ssl_certificate_key /path/to/your/private.key; # 其余static、media、ws、/的location配置保持不变 }
同时要确保EC2实例的安全组开放443端口。
4. 验证配置生效
修改Nginx配置后,重启Nginx服务:
nginx -s reload
之后用Postman测试ws://mydomain.com/ws/chat/1/(配置SSL后用wss://),此时ASGI日志应显示请求路径为/ws/chat/1/,404问题即可解决。
内容的提问来源于stack exchange,提问作者Sultan Muhammad
相关产品推荐
相关产品推荐

