玩!如果请求来自nginx,Framework将返回websocket连接的空标头

时间:2013-03-26 16:33:31

标签: nginx playframework websocket playframework-2.1

我正在使用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

1 个答案:

答案 0 :(得分:1)

是的,解决方案当然是使用正确版本的nginx。 1.3.7无法转发“连接:升级”标志,因为该功能仅在nginx 1.3.13中引入。

我建议使用最新的dev / trunk版本。