【问题标题】:Cannot connect to Tomcat web socket behind Apache无法连接到 Apache 后面的 Tomcat Web 套接字
【发布时间】:2019-07-14 14:44:15
【问题描述】:

当我尝试从 Android stomp 客户端连接到 Spring Boot Web 套接字时,它没有连接并且 Catalina 日志显示

Handshake failed due to invalid Upgrade header: null

Tomcat 服务器在 Apache 后面运行,而 Apache 服务器在 https 上运行。 我没有在 Tomcat 中添加 https。所有的 http 请求都被重定向到 https 这就是我尝试连接到 websocket 的方式

mStompClient = Stomp.over(Stomp.ConnectionProvider.JWS, "wss://chat.example.com/ws/chat/websocket", headers);

但在本地机器上运行时它可以工作

mStompClient = Stomp.over(Stomp.ConnectionProvider.JWS, "http://10.0.2.2:8080/chat/ws/chat/websocket", headers);

这是我的跺脚端点设置

registry.addEndpoint("/chat").setHandshakeHandler(new HandShakeHandler()).withSockJS();

我已启用mod proxy wstunnel 并在虚拟主机配置中添加了

ProxyPass / http://localhost:8080/chat/
proxyPassReverse / http://localhost:8080/chat/
ProxyPass /wss/ ws://localhost:8080/chat/

我该如何解决这个问题?

【问题讨论】:

标签: java android spring-boot spring-websocket stomp


【解决方案1】:

我从this server faultlin 那里得到了答案。我必须添加

RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
RewriteRule /api/(.*) ws://newapp.example.com:8080/api/$1 [P]

并将最后一行更改为

RewriteRule /chat/(.*) ws://localhost:8080/chat/chat/$1 [P]

现在它已连接

【讨论】:

    【解决方案2】:

    问题可能出在您的代理命令的顺序上:

    ProxyPass / http://localhost:8080/chat/
    proxyPassReverse / http://localhost:8080/chat/
    ProxyPass /wss/ ws://localhost:8080/chat/
    

    documentation

    订购 ProxyPass 指令

    配置的 ProxyPass 和 ProxyPassMatch 规则按照配置顺序进行检查。第一条匹配的规则获胜。所以通常你应该首先从最长的 URL 开始对有冲突的 ProxyPass 规则进行排序。

    由于第一个规则匹配/wss/ URL,所以后面的规则从不触发。正确的顺序是:

    ProxyPass /wss/ ws://localhost:8080/chat/
    ProxyPass / http://localhost:8080/chat/
    proxyPassReverse / http://localhost:8080/chat/
    

    (我不确定您是否需要反向规则。)

    我花了几个小时试图让重定向规则在我的系统上工作,但显然你根本不需要它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-17
      • 2021-10-27
      • 2017-12-08
      • 2020-12-09
      • 2017-07-13
      • 1970-01-01
      • 2014-11-22
      • 2017-03-25
      相关资源
      最近更新 更多