django websocket 聊天功能 用nginx代理 访问失败

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 的问题,

求大神帮帮忙!!!

1个回答

nginx配置的问题。你把nginx配置文件中proxy_pass http://127.0.0.1:8100; 这一行改为uwsgi_pass 127.0.0.1:8100;
这样nginx在向后转发的时候,会使用wsgi协议,而不是http,然后该请求才可以被uwsgi进程识别并处理。

weixin_43975295
weixin_43975295 supervisor只是一个管理工具,他也是调用的uwsgi来启动的,你把nginx的报错发一下看看可以,源头我感觉还是在nginx
11 个月之前 回复
u011034683
dsczijizuo 回复: 像我这种情况, django websocket 部署服务器用nginx代理, 必须要用uwsgi 启动吗?
11 个月之前 回复
u011034683
dsczijizuo 我试了, 这样nginx启动不起来 , nginx会报错, 我部署django使用supervisor gunicorn wsgi 启动的
11 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问