Django聊天在xx.xx.xx.xx:8000正常,映射80端口后失效问题咨询
WebSocket流量适配问题:聊天功能通常依赖WebSocket协议,若客户端代码硬编码了
8000端口(比如new WebSocket('ws://xx.xx.xx.xx:8000/ws/chat/')),当通过80端口访问时,客户端仍会尝试连接8000端口。如果EC2安全组未对外开放8000端口,外部请求无法建立WebSocket连接,导致聊天失效。需修改客户端代码,用window.location.host自动适配当前访问端口,比如:const wsProtocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'; const wsUrl = `${wsProtocol}//${window.location.host}/ws/chat/`; const socket = new WebSocket(wsUrl);Django ALLOWED_HOSTS配置错误:若
settings.py中ALLOWED_HOSTS仅添加了xx.xx.xx.xx:8000,未包含xx.xx.xx.xx,Django会拒绝不带端口的IP请求,直接导致聊天相关的API或WebSocket连接被拦截。需更新配置:ALLOWED_HOSTS = ['xx.xx.xx.xx', 'xx.xx.xx.xx:8000']iptables规则不完整:仅添加PREROUTING链规则只处理外部进入的请求,若存在本地发起的请求(比如服务器内部测试),需补充OUTPUT链规则确保本地流量也被转发:
iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 8000WebSocket服务的请求解析问题:若使用Django Channels实现聊天,iptables的端口转发不会传递原始请求的端口信息,Channels可能无法正确识别请求的实际端口,导致WebSocket路由匹配失败。可在
settings.py中配置ASGI_APPLICATION对应的路由时,确保支持任意端口的请求,或通过设置X-Forwarded-Port等头信息辅助解析(需额外配置中间件传递头信息)。
内容的提问来源于stack exchange,提问作者Whiteox

