Nginx没有将websocket升级响应传递回客户端?

时间:2015-06-08 20:45:39

标签: c# nginx websocket vagrant

我在精确的64个流浪盒上使用Nginx + Websockets,使用c#/ mono作为应用服务器。目标是直接通过Nginx提供静态内容,并在同一端口上处理普通的http服务请求(on / service)和websocket请求(on / webSocket)。这是相关的conf:

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
    listen              80  default_server;

    # (1)
    location / {
        root            /var/www;
        index           index.html;
    }

    # (2)
    location /service {
        add_header      Access-Control-Allow-Origin *;
        proxy_pass      http://localhost:9000;
    }

    # (3)
    location /webSocket {
        proxy_pass         http://localhost:9000;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection $connection_upgrade;
    }
}

大部分都运作良好。静态内容,是的,服务请求,是的,甚至是websockets的第一部分。我从我的客户端(Firefox或Chrome)获得了一个格式良好的101切换协议请求。我正在做一个很好的http升级响应并发送它。然后客户端......没有......没有收到任何东西。

但疯狂的是,当我放弃并手动终止我的服务器端应用程序,并且客户端Web套接字关闭时出现错误,然后响应标头显示在客户端浏览器调试器上。整个事情看起来像:

REQUEST HEADERS
Request URL:    http://localhost:8086/webSocket
Request Method:     GET
Status Code:    HTTP/1.1 101 Switching Protocols
Request Headers 16:18:50.000
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0)    Gecko/20100101  Firefox/38.0
Upgrade:    websocket
Sec-WebSocket-Version:  13
Sec-WebSocket-Key:  Nx0sUAemOFWM2rsaCAJpfQ==
Sec-WebSocket-Extensions:   permessage-deflate
Pragma: no-cache
Origin: http://localhost:8086
Host:   localhost:8086
Connection: keep-alive, Upgrade
Cache-Control:  no-cache
Accept-Language:    en-US,en;q=0.5
Accept-Encoding:    gzip, deflate
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

RESPONSE HEADERS Δ19660ms
Upgrade:    websocket
Transfer-Encoding:  chunked
Server: nginx/1.1.19
Sec-WebSocket-Accept:   gNiAeqxcVjkiReIpdtP0EZiClpg=
Date:   Mon, 08 Jun 2015 20:18:48 GMT
Connection: keep-alive

NO RESPONSE BODY Δ0ms

没有证据表明我的服务器应用程序没有立即刷新其发送数据 - 我使用异步TcpSocket.BeginSend和FinishSend并且发送似乎立即完成。它在纯http服务通信上工作正常。

那我的websocket消息数据在哪里?看起来Nginx并不想将它发送回我的客户端,除非我从服务器端关闭Tcp连接。

以前是否有人经历过这样的事情。我在Nginx和Websockets上阅读的所有内容都与逐跳升级工作的基本设置有关,而且我已经掌握了这一点。没有人可以说为什么从服务器端发送回来似乎无处可去。

0 个答案:

没有答案