我搜索了很多,但我无法连接我的WebSocket到wss://,我发现有一种方法可以代理wss://domain.com:9090和apache应用代理,并将请求重定向到正常的ws://domain.com:9090服务器运行的地方
ProxyPass /websocket ws://domain.com:9090
ProxyPassReverse /websocket ws://domain.com:9090
在apache配置中的这段代码将从任何以/WebSocket结尾的地址发送请求到ws:domain.com:9090 ex:ws://websocket将是ws://domain.com:9090
我想这样做的wss://也ex wss://WebSocket必须指向ws:domain.com:9090
它dosnt工作,我得到这个错误在浏览器控制台:
failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED
这里有什么错误吗?谢谢您。
8条答案
按热度按时间cbeh67ev1#
我工作了24小时才找到这个,搜了很多论坛,但没有人写成功。下面是我的服务器配置:
CentOS版本6.7,Apache 4.2.18
这是我最后做的:首先,我发现modules/mod_proxy_wstunnel. so必须在apache配置文件中启用,但我的apache没有该模块,经过大量搜索,我发现该模块在apache 2.4.5及更高版本中可用。
https://httpd.apache.org/docs/2.4/mod/mod_proxy_wstunnel.html
我下载了https://archive.apache.org/dist/httpd/httpd-2.4.18.tar.gz提取httpd-2.4.18\modules\proxy\mod_proxy_wstunnel.c并上传到我的服务器根目录,然后从终端可以用这些命令再次编译它:
pxs命令确实编译了模块,并在apache配置文件中写入了加载模块的代码
在那之后,我添加了这些行到Apache配置文件的末尾:
现在:它工作!在客户端js中,你可以像这样设置ws url:
并且它将把请求转发到ws:mysite.com:8091不管加载的页面是https还是http,它将把所有以/myws结尾的请求转发到ws://mysite.com:8091
nbnkbykc2#
您需要启用一些Apache 2模块:
然后,您可以使用此配置来解决您的问题。
Apache 2自动升级连接到WebSocket与ws://,你不需要手动设置ws://.我尝试了几十种配置,这是唯一一种对我有效的配置。
zbwhf8kr3#
我试图解决的问题与这个问题类似。我有一个反向代理在CentOs 7上的Apache 2.4下运行,它必须同时处理https和wss请求。
在反向代理背后,我的应用程序服务器运行在内部网络上。/etc/httpd/httpd.conf配置文件中的虚拟主机配置如下:
在这种情况下,您必须替换ServerName、SSL证书位置和代理的目标。
nbewdwxp4#
wss需要在apache conf的httpd.conf中的以下模块Uncomment行LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel. so
dxxyhpgq5#
ProxyPass配置路径中缺少/WebSocket路径。
用途:
其他信息:像其他人提到的,你必须取消注解这行:
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
如果你也使用相对路径为“/”的http ProxyPass(直接转发所有内容),必须先配置具体的“/WebSocket”路径配置,否则“/”优先抓取。
mkshixfv6#
我是为咏叹调2做的。我只是启用了一些模块,并添加了一行配置。(env:debian buster/apache 2.4)。启用模式:
并将这一行添加到虚拟主机指令中的ssl站点配置文件中:
pbossiut7#
还有另一种方法使用
<Location>
块来获得更短的配置和更好的可读性。如果你想让一个支持HTTPs的前端Web服务器(使用Apache HTTPd)以明文形式代理请求到底层后端Web服务器,这里有一种可能性:
该示例还试图展示如何将HTTP Web应用程序与WebSocket集成,因为这是一个常见的问题。
工作原理
以下是一些来自官方文档的参考:
在节内使用时,省略第一个参数,并从获取本地目录。
公司https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#ProxyPass
还要注意的是,在WebSocket位置很可能不需要任何
ProxyPassReverse
,因为理论上它在那里没有意义。还要注意,通常你只需要写
ProxyPass ws://localhost:9090/
而不是ProxyPass ws://localhost:9090/websocket
或其他东西,因为后端WebSocket服务器通常没有位置。这个答案至少在Apache/2.4.6中有用,但可能在其他版本中有用。
故障排除
如果它不起作用,请搜索Apache HTTPd Web服务器的错误日志。这确实值得专门研究,在此无法澄清。
尝试隔离问题,看看您是否有一般代理的问题,或者只是WebSocket的问题。
ds97pgxw8#
我想分享这一点,以防它可以帮助其他人避免浪费时间和精力的日子。
我在研究了一切之后放弃了。我准备开始遵循不同代理模块的代码,是的,我知道,一个蜘蛛网...,但我绝望了。作为最后一个资源,我安装了wireshark,以准确跟踪我的网络中发生的事情。安装wireshark后,说明要求我通过一个电源关闭/打开周期重新启动我的服务器。当我开始跟踪它时,令我完全惊讶的是,服务器完美地代理了wss请求到ws,没有问题!所以我有正确的设置开始,但在Ubuntu 20.4 / Apache 2.4.41 / node 14.17.2中出现了一些混乱,需要完全重新启动服务器运行的机器。太疯狂了!但就是这样...