本文介绍了以Undertow为服务器的WebSockets如何使用APACHE作为反向代理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用Undertow服务器启用了WebSockets。当我直接运行Undertow服务器时,WebSockets工作得很好。我使用HTTPS提供我的页面,并使用Java脚本中的"wss:"测试终结点:它起作用了。

但现在,我尝试使用Apache作为反向代理,我希望它能让WebSocket连接到达Undertow服务器。这是我当前的虚拟主机:

<VirtualHost *:80 *:443>
    ServerName test.example.org

    SSLEngine on 
    SSLCertificateFile /etc/letsencrypt/live/example.org/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.org/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/example.org/chain.pem

    ProxyPass / http://test.example.org:44444/
    ProxyPassReverse / http://test.example.org:44444/

</VirtualHost>

此处,Undertow在端口44444上作为http服务器(而不是HTTPS)启动,而SSLSecurity由apache完成。

所有的HTML页都工作正常,但当我尝试启动WebSocket连接时,收到以下错误(Chrome):

WebSocket connection to 'wss://test.example.org/websockets/echo' failed: Error during WebSocket handshake: 'Upgrade' header is missing

并且,当我查看Network选项卡时,当调用"wss://"时,我看到来自服务器的响应中确实缺少两个头:"Connection: Upgrade"和"Upgrade: WebSocket"。当我不使用Apache直接连接到UnderTow时,会显示这些标头

"Sec-WebSocket-Accept"和"Sec-WebSocket-Location"头是存在的,但我猜这是第二个问题,"Sec-WebSocket-Location"不是‘wss://test.example.org/websockets/echo’,因为UnderTow在HTTPS上运行,而不是HTTPS。

最后,mod_proxy_wstunnel文档显示"该连接将自动升级为WebSocket连接"。这是什么意思?Apache会自行将HTTP连接升级为WebSocket连接吗?这是不是我想要的!我想使用Undertow自己处理初始的HTTP请求和升级过程。我使用来自初始HTTP连接的信息来验证用户是否可以连接到请求的终结点,如果可以,我将以编程方式调用Undertow的WebSocketProtocolHandshakeHandler#handleRequest(exchange)以升级到WebSocket连接。我只想让阿帕奇不受干扰地让一切过去。

有什么关于如何在Apache反向代理后使用Undertow运行WebSocket的帮助吗?

推荐答案

我累了,决定试试Nginx

3小时内,我不仅得到了WebSockets working,而且我在一台服务器上的所有站点都被移到了它。超级简单。

nginx.conf中WebSocket的神奇行是:

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

我知道"升级"是一个特殊的"逐跳"标头,必须显式配置才能保留。

我希望有一个类似的针对阿帕奇的解决方案,但是天哪,关于这方面的文档太少了!

这篇关于以Undertow为服务器的WebSockets如何使用APACHE作为反向代理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-24 19:37