当前位置: 首页 > 知识库问答 >
问题:

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

百里海超
2023-03-14

我使用Undertow服务器启用了WebSockets。当我直接运行Undertow服务器时,WebSockets运行良好。我使用HTTPS提供我的页面,并使用javascript中的“wss:”测试endpoint:它可以工作。

但是现在,我尝试使用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作为HTTP服务器(不是HTTPS)在端口44444上启动,SSL安全由Apache完成。

所有HTML页面都运行良好,但是当我尝试启动WebSocket连接时,我收到此错误(Chrome):

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

而且,当我查看网络选项卡时,我发现服务器的响应中确实缺少两个标题,即“wss://”调用:“连接:升级”和“升级:WebSocket”。当我不使用Apache直接连接到Undertow时,这些标头就会出现。

“< code > Sec-web socket-Accept ”和“< code > Sec-web socket-Location ”头是存在的,但我想这是第二个问题,“< code > Sec-web socket-Location ”是“ws://test . example . org/web sockets/echo”而不是“WSS://test . example . org/web sockets/echo”,因为Undertow运行在HTTP上,而不是HTTPS上。

最后一件事,mod_proxy_wstunnel留档说“连接自动升级到webocket连接”。这是什么意思?Apache正在自己将HTTP连接升级到WebSocket连接?这不是我想要的!我想自己使用Undertow处理初始HTTP请求和升级过程。我使用来自初始HTTP连接的信息来验证用户是否可以连接到请求的endpoint,如果可以,我以编程方式调用Undertow的WebSocketPROcolHandshakeHandler#handleRequest(交换)升级到WebSocket连接。我只希望Apache让一切都通过而不会干扰。

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

共有1个答案

锺离玮
2023-03-14

我累了,决定试试Nginx。

在3个小时内,我不仅让WebSockets工作了,而且我在服务器上的所有站点都被转移到了它上面。超级简单。

在< code>nginx.conf中,WebSockets的神奇代码是:

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

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

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

 类似资料:
  • 使用nginx作为前端的反向代理将请求传递给应用是可行的。然而,只有nginx 1.4版本以上才支持WebSocket协议。下面是nginx代理HTTP和WebSocket请求的一个最基本的配置: server { listen 80; server_name _; location / { include proxy_params; pro

  • 我有一个Apache-Server在端口80上运行我的PHP应用程序。PHP应用程序通过端口3000与NodeJS-Server(socket.io)通信。

  • 我有一个可以通过公共IP访问的Windows服务器,其中一些Apache虚拟主机被配置为代理传递到带有web应用程序和服务的各种内部服务器(Apache充当反向代理)。在其中一个内部服务器上,我希望使用LetsEncrypt配置HTTPS。 我设法在内部服务器上获得了工作证书和服务器配置,但问题是我的反向代理(Apache)不想通过隧道传输这个HTTPS通信量。 编辑:我知道用证书配置反向代理会更

  • 我有一个apache服务器在运行,在这个服务器上我也有一个mongo数据库在运行,监听标准端口27017。 我试过这个,但似乎一点也不起作用:

  • 我已经被这个问题困扰了3天。 我的服务器是Centos,在Httpd服务中使用wordpress(WP)。 它的IP是'103.232.120.178' 我想使用nginx作为WP的反向代理。 Httpd位于端口2101 Nginx位于端口80 WP位于子目录'bongda69'(URL:'103.232.120.178:2101/bongda69') 我想如果访问我的网站,它重定向到WordPr

  • 我希望使用Apache HTTP服务器作为OpenShift或Kubernetes中托管的一组微服务的反向代理。我想在Kubernetes路线上使用TLS passthrough。也就是说,需要在Apache(出站)创建TLS连接,并在POD终止。为了实现这一点,OpenShift需要在不解密有效负载的情况下识别目标主机,以便将每个请求转发给正确的微服务。TLS中的服务器名称指示(SNI)将具有主