我正在使用Nginx 1.3.7和Play! Framework 2.1和我需要将我的HTTP,HTTPS和WebSocket连接代理到Play!服务器通过nginx。
我依赖于nginx trunk的websocket代理功能,我确实设置了“upgrade”和“connection”标头来正确转发websocket连接的标头(http://nginx.org/en/docs/http/websocket.html):
map $http_upgrade $connection_upgrade {
default Upgrade;
'' close;
}
location / {
proxy_pass http://my-backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
我确定播放!在websocket初始化期间得到正确的标题。 Play中的request.headers对象!我们没有nginx看起来完全一样。
Map(
Cache-Control -> Buffer(no-cache),
Connection -> Buffer(Upgrade),
Host -> Buffer(my-backend),
Origin -> Buffer(https://my-host:8443),
Pragma -> Buffer(no-cache),
Sec-WebSocket-Extensions -> Buffer(x-webkit-deflate-frame),
Sec-WebSocket-Key -> Buffer(nk5JVO4I5QRMQnSxAJaRCg==),
Sec-WebSocket-Version -> Buffer(13),
Upgrade -> Buffer(websocket)
)
以下是问题:如果请求来自nginx,则来自Play的响应!是空的,不包含任何标题,只包含协议版本:“HTTP / 1.1 0”。 正确地来自Play的回应!看起来像那样:
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Sec-WebSocket-Accept: YHVb1xdsVqaObgQxqksBQPhdkvc=
Upgrade: websocket
答案 0 :(得分:1)
是的,解决方案当然是使用正确版本的nginx。 1.3.7无法转发“连接:升级”标志,因为该功能仅在nginx 1.3.13中引入。
我建议使用最新的dev / trunk版本。