django 项目
用dwebsocket 实现简单的聊天功能
本地调试已经成功
发布到服务器用nginx做代理, 链接失败
firefox 报错信息:
Firefox 无法建立到 ws://xxxxxx/ 服务器的连接。
chrome 报错信息:
WebSocket connection to 'ws://xxxxxxx/' failed: Error during WebSocket handshake: Unexpected response code: 400
nginx 配置如下:
server {
server_name xxxxxxxxxxxxx;
listen 80;
location /static {
root /var/fixpdq;
}
location /media {
root /var/fixpdq;
}
location / {
proxy_pass http://127.0.0.1:8100;
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Connection "upgrade";
}
}
django view 代码如下(多余代码省略了)
@require_websocket
def chat(request):
if request.is_websocket():
print('握手成功')
....
本地调试用127.0.0.1 访问是没问题的, 但在本机用局域网ip访问, 就不通, 发布到服务器, 用nginx做代理, 也是不通, 确定的是前端请求已经到达后台代码了.
我想可能是nginx配置的问题
或者是请求到达服务器nginx之前已然就不是socket请求了(因为本机用局域网ip访问也不通),
但是试过很多方法了,
在view 里request.is_websocket() 这句代码是false, nginx转发后居然不是socket请求了, 那肯定就是nginx的配置问题了, 不应该是django 的问题,
求大神帮帮忙!!!
nginx配置的问题。你把nginx配置文件中proxy_pass http://127.0.0.1:8100; 这一行改为uwsgi_pass 127.0.0.1:8100;
这样nginx在向后转发的时候,会使用wsgi协议,而不是http,然后该请求才可以被uwsgi进程识别并处理。