我在精确的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上阅读的所有内容都与逐跳升级工作的基本设置有关,而且我已经掌握了这一点。没有人可以说为什么从服务器端发送回来似乎无处可去。