代理将websockets和http重定向到同一个(unix)套接字

时间:2016-09-27 01:13:21

标签: django nginx proxy websocket daphne

我做了一个小小的nginx conf来将trafic重定向到由daphne服务器(用于django的服务器)监听的unix套接字。

根据documentation

  

如果您将Daphne用于所有流量,它会在HTTP和之间自动协商   WebSocket,因此不需要单独使用WebSocket   端口或路径

所以我想将websockets和Http trafic代理到同一个unix套接字。

  1. 有可能吗?

  2. 我该怎么办?

  3. 这是我到目前为止所尝试的内容:

    upstream django_ws {
             server unix:///path/to/ws.sock;
    }
    
    server {
           listen 8082;
           server_name 127.0.0.1;
           charset utf-8;
    
           root /path/to/root;
    
           set $myroot $document_root;
    
           location / {
                    proxy_pass http://django_ws;
                    #proxy_http_version 1.1;
                    #proxy_set_header Upgrade websocket;
                    #proxy_set_header Connection upgrade;
           }
    }
    
    • 如果我取消注释位置块中的行,页面将显示为空白。

    • 如果不这样做,会显示页面,但网页框似乎不起作用。

    我怎么解决这个问题?

    开发服务器一切正常。

1 个答案:

答案 0 :(得分:1)

我找到了解决方案:

我像这样设置我的websockets:

var socket = new WebSocket(ws_scheme + "://" + window.location.host
                           + "/ws" + window.location.pathname);

因此,我可以将请求/ws与请求/分开。

所以我就这样做了:

upstream django_ws {
         server unix:///path/to/ws.sock;
}

server {
       listen 8082;
       server_name 127.0.0.1;
       charset utf-8;

       root /path/to/root;

       set $myroot $document_root;


       location /ws {
                proxy_pass http://django_ws;
                proxy_http_version 1.1;
                proxy_set_header Upgrade websocket;
                proxy_set_header Connection upgrade;
       }

       location / {
                proxy_pass http://django_ws;
       }
}

它运作得很好!