NGINX没有将标头传递给websocket端点

时间:2015-03-17 17:39:41

标签: nginx websocket

我正在尝试将nginx配置为进行身份验证和websockets的反向代理。它代理传递请求到apache(/ auth / wsgi)进行身份验证 - 一旦成功,然后代理传递给websocked后端,这是tomcat 8上基于java的websocket端点。

location /basic/alerting/websocket {
    auth_request /auth/wsgi;
    proxy_pass http://backend.com:8080/websocket;
    proxy_http_version 1.1;
    proxy_set_header Upgrade "Websocket";
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
}

apache上的身份验证成功。但是,在后端tomcat上,我收到此错误:

12572237 [http-nio-8080-exec-10]错误org.springframework.web.socket.server.support.DefaultHandshakeHandler - handleWebSocketVersionNotSupported()由于不支持的WebSocket版本,握手失败:null。支持的版本:[13]

似乎失败是因为后端正在期待未通过的标题(" Sec-WebSocket-Version")。我甚至在nginx日志中看到了:

2015/03/17 17:28:12 [debug] 20261#0:* 718 http proxy header:" Sec-WebSocket-Version:13"

在nginx配置中我需要做什么吗?非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

问题在于Nginx并没有通过所有" Sec-WebSocket - *"头。然后方法AbstractHandshakeHandler.java#handleWebSocketVersionNotSupported()将抛出异常。

修复是Nginx复制所有" Sec-WebSocket - *"头。 请求标头:Sec-WebSocket-ExtensionsSec-WebSocket-KeySec-WebSocket-ProtocolSec-WebSocket-Version 回复标题:Sec-WebSocket-AcceptSec-WebSocket-ExtensionsSec-WebSocket-Protocol

要复制自定义Nginx标头,您需要执行以下操作:

proxy_set_header Sec-WebSocket-Protocol $http_sec_websocket_protocol