我能够使用以下apache配置在本地计算机上成功运行websocket,
ProxyRequests off
ProxyPreserveHost on
<Location /chat>
ProxyPass ws://localhost:8080/chat
ProxyPassReverse ws://localhost:8080/chat
</Location>
Run Code Online (Sandbox Code Playgroud)
我正在为Apache / 2.4.7(Ubuntu)使用mod_proxy_wstunnel,并使用Wildfly 9.0.1。当我将部署转移到具有相同配置的生产服务器(AWS)时,我得到的是以下响应,
WebSocket已经处于CLOSING或CLOSED状态。
奇怪的是,我实际上能够使用wscat从托管服务器内部连接到WebSocket ,
wscat -c ws://example.com/chat/1/
Run Code Online (Sandbox Code Playgroud)
但是,来自服务器/浏览器外部的连接导致了我上面所述的响应。首先,我认为该问题可能是由于AWS过滤了Hop-by-Hop标头,即删除了websocket请求的Upgrade和Connection标头。但是,当我使用websocketd创建一个虚拟websocket服务器时,我能够通过相同的URL来获取结果。
我不确定该问题是否与Wildfly应用程序服务器或Apache Proxy Pass有关。我也尝试使用NGINX,但得到的响应与使用Apache的响应相同。一些Stackoverflow帖子建议禁用我已经完成的mod_reqtimeout。
Websocket请求成功触发了Websocket的@OnOpen事件,并立即关闭而没有任何重要日志。下面对码结果行1006是CLOSED_ABNORMALLY。
@OnClose
public void close(Session session, CloseReason c) {
logger.info("Closing:" + c.getCloseCode());
}
Run Code Online (Sandbox Code Playgroud)
这是来自Chrome开发工具的请求/响应日志,
General
Request URL:ws://example.com/chat/3
Request Method:GET
Status Code:101 Switching Protocols
Response Headers
Connection:Upgrade
Content-Length:0
Date:Fri, 13 May 2016 13:09:11 GMT
Origin:http://example.com
Sec-WebSocket-Accept:pPjTLv5Dz+/vyjY/SkeMihaXDd0=
Sec-WebSocket-Location:ws://example.com/chat/3
Server:WildFly/9
Upgrade:WebSocket
X-Powered-By:Undertow/1
Request Headers
Accept-Encoding:gzip, …Run Code Online (Sandbox Code Playgroud)