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

WebSockets和Apache代理:如何配置mod_proxy_wstunnel?

裴良弼
2023-03-14

我有:

>

  • Apache 2.4在我服务器的80端口上,启用了mod_proxy和mod_proxy_wstunnel

    节点.js socket.io 在同一服务器的端口 3001 上

    访问<code>示例。com(带有端口80)重定向到2。这得益于具有以下Apache配置的此方法:

    <VirtualHost *:80>
        ServerName example.com
        ProxyPass / http://localhost:3001/
        ProxyPassReverse / http://localhost:3001/
        ProxyPass / ws://localhost:3001/
        ProxyPassReverse / ws://localhost:3001/
    </VirtualHost>
    

    它适用于所有事情,除了websocket部分 :ws://...不是由代理传输的。

    当我访问 example.com 上的页面时,我有:

    Impossible to connect ws://example.com/socket.io/?EIO=3&transport=websocket&sid=n30rqg9AEqZIk5c9AABN.
    

    问题:如何让Apache也代理WebSocket?

  • 共有3个答案

    鲜于河
    2023-03-14

    从1.0Socket.IO(2014年5月)开始,所有连接都以HTTP轮询请求开始(更多信息在这里)。这意味着除了转发WebSocket流量之外,您还需要转发任何传输=轮询HTTP请求。

    下面的解决方案应该正确地重定向所有套接字流量,而不重定向任何其他流量。

    >

  • 启用以下 Apache2 模组:

    sudo a2enmod proxy rewrite proxy_http proxy_wstunnel
    

    在*中使用这些设置。conf文件(例如/etc/apache2/sites-available/mysite.com.conf)。我为每一篇文章都做了评论:

    <VirtualHost *:80>
        ServerName www.mydomain.com
    
        # Enable the rewrite engine
        # Requires: sudo a2enmod proxy rewrite proxy_http proxy_wstunnel
        # In the rules/conds, [NC] means case-insensitve, [P] means proxy
        RewriteEngine On
    
        # socket.io 1.0+ starts all connections with an HTTP polling request
        RewriteCond %{QUERY_STRING} transport=polling       [NC]
        RewriteRule /(.*)           http://localhost:3001/$1 [P]
    
        # When socket.io wants to initiate a WebSocket connection, it sends an
        # "upgrade: websocket" request that should be transferred to ws://
        RewriteCond %{HTTP:Upgrade} websocket               [NC]
        RewriteRule /(.*)           ws://localhost:3001/$1  [P]
    
        # OPTIONAL: Route all HTTP traffic at /node to port 3001
        ProxyRequests Off
        ProxyPass           /node   http://localhost:3001
        ProxyPassReverse    /node   http://localhost:3001
    </VirtualHost>
    

    我已经包含了一个额外的部分,用于路由/节点流量,我觉得很方便,请参阅此处了解更多信息。

  • 咸昊昊
    2023-03-14

    除了按URL过滤,还可以按HTTP头过滤。此配置将适用于任何使用websockets的web应用程序,即使它们没有使用socket.io:

    <VirtualHost *:80>
      ServerName www.domain2.com
    
      RewriteEngine On
      RewriteCond %{HTTP:Upgrade} =websocket [NC]
      RewriteRule /(.*)           ws://localhost:3001/$1 [P,L]
      RewriteCond %{HTTP:Upgrade} !=websocket [NC]
      RewriteRule /(.*)           http://localhost:3001/$1 [P,L]
    
      ProxyPassReverse / http://localhost:3001/
    </VirtualHost>
    
    公西志文
    2023-03-14

    多亏了这个话题,我终于做到了。待办事项:

    1)安装Apache 2.4(不适用于2.2),并执行:

    a2enmod proxy
    a2enmod proxy_http
    a2enmod proxy_wstunnel
    

    2)让nodejs在端口3001上运行

    3)在Apache配置中执行此操作

    <VirtualHost *:80>
      ServerName example.com
    
      RewriteEngine On
      RewriteCond %{REQUEST_URI}  ^/socket.io            [NC]
      RewriteCond %{QUERY_STRING} transport=websocket    [NC]
      RewriteRule /(.*)           ws://localhost:3001/$1 [P,L]
    
      ProxyPass / http://localhost:3001/
      ProxyPassReverse / http://localhost:3001/
    </VirtualHost>
    

    注意:如果您在同一台服务器上有多个使用web套接字的服务,您可能希望这样做以将它们分开。

     类似资料:
    • 问题内容: 我有 : (v2.4)在我服务器的端口80上,启用了 mod_proxy 和 mod_proxy_wstunnel 在同一服务器的端口3001上。 由于使用此处描述的方法,访问(使用端口80)将重定向到2 .。我已经在Apache配置中对此进行了设置: 它适用于除websocket部分之外的所有内容:不会像代理服务器那样传输。 访问上的页面时,我有: 问: 如何也使Apache代理We

    • 除了websocket部分之外,不会像代理那样传输。 当我访问上的页面时,我有: 问题:如何使Apache代理也成为WebSockets?

    • 配置代理服务器能干嘛 NEI toolkit 提供了代理服务器的功能,帮助将接口代理到NEI官网或者特定的服务器上 将接口代理到NEI官网 开启该功能只需将server.config.js中的online设为true, 那么对Mock Server的所有请求都将会代理到NEI官网上,该模式也被称为在线模式。 启用在线模式可以减少执行nei update的操作,在频繁更改官网数据的情况下能够大幅加快

    • 我在设置apache反向代理服务器时遇到问题,希望您能提供帮助。 我安装了带有apache的ubuntu服务器,并启用了以下模块: 然后我用以下内容在代理上设置000-default.conf: 路由器上的端口80和443被转发到代理服务器。在服务(1-3)服务器上,使用来自Lets Encrypt的证书启用SSL。 谢谢你的帮助!

    • 我在将nginx配置为代理WebSockets时遇到了一些麻烦。我有一个Node.js应用程序,它使用Socket.io V0.9.16侦听端口9090上的连接,使用nginx V1.6.2侦听端口9000上的连接,并且(应该)配置为将请求代理到我的Node.js应用程序。nginx配置如下所示: 这可能是安全问题吗?浏览器是否以某种方式“知道”Socket.io在端口9090上运行,并拒绝通过9

    • 我不确定这是否可以实现。我正在使用以下版本以群集模式运行docker: 客户端:版本:17.03.0-CE API版本:1.26Go版本:GO1.7.5 Git提交:3A232C8构建:周二2月28日08:10:07 2017 OS/arch:linux/amd64 显然,客户端套接字连接无法解析到群集中托管的服务集群。docker swarm是否有一个变通配置,或者它只是不可能?我没有太多的运气