我正在尝试将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配置中我需要做什么吗?非常感谢您的帮助。
答案 0 :(得分:1)
问题在于Nginx并没有通过所有" Sec-WebSocket - *"头。然后方法AbstractHandshakeHandler.java#handleWebSocketVersionNotSupported()将抛出异常。
修复是Nginx复制所有" Sec-WebSocket - *"头。
请求标头:Sec-WebSocket-Extensions
,Sec-WebSocket-Key
,Sec-WebSocket-Protocol
,Sec-WebSocket-Version
回复标题:Sec-WebSocket-Accept
,Sec-WebSocket-Extensions
,Sec-WebSocket-Protocol
要复制自定义Nginx标头,您需要执行以下操作:
proxy_set_header Sec-WebSocket-Protocol $http_sec_websocket_protocol