我搜索了很多,但我无法将我的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 例如:ws:// websocket将是ws://domain.com:9090
我想为wss://也这样做 ex wss:// websocket必须指向ws://domain.com:9090
它dosnt工作,我在浏览器控制台中收到此错误:
failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED
这里有什么错吗? 谢谢你。
答案 0 :(得分:10)
我24小时工作找到这个并搜索了很多论坛,但没有人写成功。 这是我的服务器配置:
CentOS版本6.7,Apache 4.2.18
这是我最后做的事情: 首先我发现必须在apache配置文件中启用modules / mod_proxy_wstunnel.so,但我的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并上传到我的服务器root 那么终端可以用这些语言再次编译它:
chmod 755 mod_proxy_wstunnel.c #set permission
pxs -i -a -c mod_proxy_tunnel.c #compile module
pxs命令编译模块并在apache配置文件中写入以加载它
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
之后我将这些行添加到apache配置文件的末尾:
RewriteEngine on
ProxyRequests Off
ProxyPreserveHost on
ProxyPass /myws ws://mysite.com:8091
ProxyPassReverse /myws ws://mysite.com:8091
现在:它有效! 在客户端js你可以这样设置ws url:
var protocol = 'ws://';
if (window.location.protocol === 'https:') {
protocol = 'wss://';
}
var wsUri =protocol+ "mysite.com/myws";
var ws = new WebSocket(wsUri);
它会将请求转发给ws://mysite.com:8091 对于使用https或http加载的页面无关紧要,它会将所有以/ myws结尾的请求指向ws://mysite.com:8091
答案 1 :(得分:3)
您需要启用一些Apache2模块:
$ a2enmod proxy proxy_wstunnel proxy_http rewrite
然后,您可以使用此配置解决问题。
ProxyRequests off
ProxyVia on
RewriteEngine On
RewriteEngine On
RewriteCond %{HTTP:Connection} Upgrade [NC]
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteRule /(.*) ws://example.com:9090/$1 [P,L]
ProxyPass /websocket http://example.com:9090/websocket
ProxyPassReverse /websocket http://example.com:9090/websocket
Apache2使用ws://自动升级到websocket的连接,您无需手动设置ws://。我尝试了数十种配置,这是唯一对我有用的配置。
答案 2 :(得分:1)
wss需要以下模块 apache conf的httpd.conf中的注释行 LoadModule proxy_wstunnel_module modules / mod_proxy_wstunnel.so
答案 3 :(得分:1)
我试图解决的问题与此类似。我有一个在 CentOs 7 上的 Apache 2.4 下运行的反向代理,它必须同时处理 https 和 wss 请求。
在反向代理之后,我的应用服务器运行在内部网络上。 /etc/httpd/httpd.conf配置文件中的虚拟主机配置如下:
<VirtualHost *:443>
ServerName example.com
RewriteCond %(HTTP:Upgrade) websocket [NC] # Required to handle the websocket connection
RewriteCond %(HTTP:Connection) upgrade [NC]
RewriteRule /(.*) ws://192.160.0.1/$1 [P,L]
SSLEngine on # SSL Certificates handling
SSLCertificateFile ssl/cert.pem # Public Certificate
SSLCertificateKeyFile ssl/key.pem # Private certificate
SSLCertificateChainFile ssl/ca.pem # CA or chain certificate
ProxyPreserveHost On
ProxyPass /websocket ws://192.168.0.1 # First you need to write the specific rules
ProxyPassReverse /websocket ws://102.168.0.1
ProxyPass / http://192.168.0.1 # Then the generic rules for the proxy.
ProxyPassReverse / http://192.168.0.1
</VirtualHost>
在您的情况下,您必须替换 ServerName、SSL 证书位置和代理的目的地。
答案 4 :(得分:0)
您的ProxyPass配置路径中缺少/ websocket路径。
使用:
ProxyPass /websocket ws://example.com:9090/websocket
ProxyPassReverse /websocket ws://example.com:9090/websocket
其他信息: 像其他人一样,您必须取消注释:
LoadModule proxy_wstunnel_module modules / mod_proxy_wstunnel.so
如果您还使用相对路径为“ /”(直接转发所有内容)的http ProxyPass,则必须首先配置特定的“ / websocket”路径配置,否则必须首先配置“ /”。
ProxyPass /websocket ws://example.com:9090/websocket
ProxyPassReverse /websocket ws://example.com:9090/websocket
ProxyPass balancer://ac-cluster/
ProxyPassReverse / http://example.com:9090
答案 5 :(得分:0)
我是为aria 2做的。我只是启用了一些模块,并在配置中添加了一行。 (env:debian buster / apache 2.4)。 启用模式:
sudo a2enmod proxy proxy_balancer proxy_wstunnel proxy_http
并将此行添加到虚拟主机指令内的ssl站点配置文件中:
ProxyPass /jsonrpc ws://127.0.0.1:6888/jsonrpc
答案 6 :(得分:0)
我想分享这个,以防它帮助其他人避免浪费几天的时间和精力。
我在研究了一切之后放弃了。我准备开始遵循不同代理模块的代码,是的,我知道,蜘蛛网......,但我很绝望。作为最后一个资源,我安装了wireshark 以准确跟踪我的网络中发生的情况。安装wireshark后,说明要求我通过断电/开机循环重新启动服务器。所以我做了。当我开始跟踪它时,令我完全惊讶的是,服务器完美地将 wss 请求代理到 ws,没有问题!所以我有正确的设置开始,但在 Ubuntu 20.4 / Apache 2.4.41 / node 14.17.2 中出现了一些问题,需要完全重新启动服务器运行的机器。疯狂的!但就是这样...