将WebSocket wss://代理到ws:// apache

50pmv0ei  于 2023-05-22  发布在  Apache
关注(0)|答案(8)|浏览(262)

我搜索了很多,但我无法连接我的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

这里有什么错误吗?谢谢您。

cbeh67ev

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并上传到我的服务器根目录,然后从终端可以用这些命令再次编译它:

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

nbnkbykc

nbnkbykc2#

您需要启用一些Apache 2模块:

$ 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

Apache 2自动升级连接到WebSocket与ws://,你不需要手动设置ws://.我尝试了几十种配置,这是唯一一种对我有效的配置。

zbwhf8kr

zbwhf8kr3#

我试图解决的问题与这个问题类似。我有一个反向代理在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证书位置和代理的目标。

nbewdwxp

nbewdwxp4#

wss需要在apache conf的httpd.conf中的以下模块Uncomment行LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel. so

dxxyhpgq

dxxyhpgq5#

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
mkshixfv

mkshixfv6#

我是为咏叹调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
pbossiut

pbossiut7#

还有另一种方法使用<Location>块来获得更短的配置和更好的可读性。
如果你想让一个支持HTTPs的前端Web服务器(使用Apache HTTPd)以明文形式代理请求到底层后端Web服务器,这里有一种可能性:

#
# https://example.com/websocket   -> [Apache:443] -> Websocket plaintext -> [Backend websocket:9000]
# https://example.com/other-stuff -> [Apache:443] -> HTTP      plaintext -> [Backend webserver:8080]
#
<VirtualHost *:443>
    ServerName example.com

    DocumentRoot /var/www/html

    # My application without websocket (if you have that)
    <Location />
        # This can be a Docker container, PHP-FPM, Tomcat, etc.
        ProxyPass        http://localhost:8080/
        ProxyPassReverse http://localhost:8080/
    </Location>

    # Plaintext websockets handled by their dedicated path
    <Location /websocket>
        ProxyPass ws://localhost:9090/
    </Location>

    SSLEngine on
    SSLCertificateFile      ssl/cert.pem # Public Certificate
    SSLCertificateKeyFile   ssl/key.pem  # Private certificate
    SSLCertificateChainFile ssl/ca.pem   # CA or chain certificate

</VirtualHost>

该示例还试图展示如何将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的问题。

ds97pgxw

ds97pgxw8#

我想分享这一点,以防它可以帮助其他人避免浪费时间和精力的日子。
我在研究了一切之后放弃了。我准备开始遵循不同代理模块的代码,是的,我知道,一个蜘蛛网...,但我绝望了。作为最后一个资源,我安装了wireshark,以准确跟踪我的网络中发生的事情。安装wireshark后,说明要求我通过一个电源关闭/打开周期重新启动我的服务器。当我开始跟踪它时,令我完全惊讶的是,服务器完美地代理了wss请求到ws,没有问题!所以我有正确的设置开始,但在Ubuntu 20.4 / Apache 2.4.41 / node 14.17.2中出现了一些混乱,需要完全重新启动服务器运行的机器。太疯狂了!但就是这样...

相关问题