如何使用Apache作为WebSockets的反向代理,将Undertow作为服务器

时间:2016-06-18 19:55:09

标签: apache websocket reverse-proxy undertow

我使用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的任何帮助吗?

1 个答案:

答案 0 :(得分:1)

我累了,决定试试Nginx

3小时内,我不仅获得了WebSockets working,而且还将我服务器上的所有网站都移到了它上面。超级容易。

nginx.conf中WebSockets的神奇线条是:

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

据我所知,“升级”是一个特殊的“逐跳”标头,必须明确配置才能保留。

我希望Apache有一个类似的解决方案,但是man,关于这个的文档很少!