java - 野蝇/WebSocket/Apache : WebSocket is already in CLOSING or CLOSED state

标签 java apache amazon-web-services websocket wildfly

我能够使用以下 apache 配置在我的本地机器上成功运行 websocket,

ProxyRequests off
ProxyPreserveHost on
<Location /chat>
   ProxyPass ws://localhost:8080/chat
   ProxyPassReverse ws://localhost:8080/chat
</Location>

我正在使用 mod_proxy_wstunnel适用于 Apache/2.4.7 (Ubuntu) 并使用 Wildfly 9.0.1。当我使用提到的相同配置将部署移动到我的生产服务器 (AWS) 时,我得到了以下响应,

WebSocket is already in CLOSING or CLOSED state.

奇怪的是我实际上能够使用 wscat 从托管服务器内连接到 WebSocket ,

wscat -c ws://example.com/chat/1/

但是,来自服务器/浏览器外部的连接会产生我上面所述的响应。首先,我认为问题可能是由于 AWS 过滤了 Hop-by-Hop header ,即删除了 websocket 请求的 Upgrade 和 Connection header 。但是,当我使用 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());
}

这是来自 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, deflate, sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:no-cache
Connection:Upgrade
Cookie:mp_c4f10660603c33a8e9307b70e6767539_mixpanel=%7B%22distinct_id%22%3A%20%2215210855b11180-0ffdda567-1821170c-d37aa-15210855b123f2%22%2C%22%24initial_referrer%22%3A%20%22%24direct%22%2C%22%24initial_referring_domain%22%3A%20%22%24direct%22%7D; mf_user=a60cd2cdcfc41836645d949f71ee3127; intercom-id=d1af89ac-9d55-4fef-8a17-3848d8ef0fce; wooTracker=VQf16pMBx4Pu; _ga=GA1.2.544774749.1447732319; JSESSIONID=z4a1hBpQJQz4YCsLivHRRFf8b0dzYzBsT_4PLadB.ip-172-30-0-20; mf_154095de-56ef-4099-9976-f9a298cf0677=8438220eda64d856436d798ca0b9188a|05132367e34aabbf7bcce5b1e8811235b0bd15d4|1463144963483||19|
Host:example.com
Origin:http://example.com
Pragma:no-cache
Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits
Sec-WebSocket-Key:94OH1SxHvszgJO6Rg31WGA==
Sec-WebSocket-Version:13
Upgrade:websocket
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36

如果您对主题有任何想法/建议,请告诉我。

最佳答案

我们发现客户端和服务器之间的 websocket 通信可能存在问题:卡巴斯基及其公司防火墙。

如果我们禁用防火墙,websocket 可以工作(websocketstest 是我们的 friend !)。但是这个变通办法不是一个好的解决方案,因为我们的安全人员不会高兴 :)。

其他问题可能是 Apache 中的正确配置(您的配置看起来是正确的):

ProxyRequests off
ProxyPreserveHost on

我们的方法是一个安全的网络套接字。我们使用网站 ( http://www.websocket.org/echo.html ) 中的回显服务器通过 TLS 编写了一个 websocket 测试,它成功了!!!

关于java - 野蝇/WebSocket/Apache : WebSocket is already in CLOSING or CLOSED state,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37211037/

相关文章:

java - 是否可以从 portlet 读取页面请求参数?

java - 如何在较新版本的 Android 3.1 及更高版本中实现 Firebase Recycler Adapter?

php - Apache 服务器: can't render php and html at once

php - 服务器如何同时管理不同用户的请求?

java - hibernate SQLIntegrityConstraintViolationException

java - MULE-Expression Transformer不替换表达式中的流量变量值

java - 如何在 Apache Nutch 2.x 中获取 webgraph

amazon-web-services - AWS Cloudformation如何使用条件资源作为其他资源的 DependsOn

mysql - 能否将 DMS 配置为在仅插入模式下运行?

mongodb - 在 Mongo 的数据上运行 Map/Reduce 的最佳方法是什么?