问题描述
我使用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作为反向代理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!