我使用Undertow服务器启用了WebSockets。当我直接运行Undertow服务器时,WebSockets运行良好。我使用HTTPS提供我的页面,并在javascript中使用“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)启动,SSL安全性由Apache完成。
所有HTML页面都运行良好,但是当我尝试启动WebSocket连接时,我收到此错误(Chrome):
WebSocket connection to 'wss://test.example.org/websockets/echo' failed: Error during WebSocket handshake: 'Upgrade' header is missing
而且,当我查看“网络”选项卡时,我发现在发出“wss://”调用时,服务器的响应中确实缺少两个标头:“Connection: Upgrade
”和“{ {1}}”。当我在没有Apache的情况下直接连接到Undertow时,那些标题存在。
“Upgrade: WebSocket
”和“Sec-WebSocket-Accept
”标题在那里,但我想这是第二个问题,“Sec-WebSocket-Location
”是'ws://test.example。 org / websockets / echo'not' wss ://test.example.org/websockets/echo'因为Undertow在HTTP上运行,而不是在HTTPS上运行。
最后,mod_proxy_wstunnel文档说“连接自动升级为websocket连接”。这是什么意思? Apache正在将HTTP连接升级为WebSocket连接吗?这是不我想要的!我想使用Undertow处理初始HTTP请求和自己的升级过程。我使用来自初始HTTP连接的信息来验证用户是否可以连接到请求的端点,如果是,我以编程方式调用Undertow的Sec-WebSocket-Location
来升级到WebSocket连接。我只是希望Apache让一切都通过而不会干扰。
有关如何在Apache反向代理后面使用Undertow运行WebSockets的任何帮助吗?
答案 0 :(得分:1)
我累了,决定试试Nginx。
在 3小时内,我不仅获得了WebSockets working,而且还将我服务器上的所有网站都移到了它上面。超级容易。
nginx.conf
中WebSockets的神奇线条是:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
据我所知,“升级”是一个特殊的“逐跳”标头,必须明确配置才能保留。
我希望Apache有一个类似的解决方案,但是man,关于这个的文档很少!