Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js WebSocket和Apache代理:如何配置mod_proxy_wstunel?_Node.js_Apache_Proxy_Websocket_Socket.io - Fatal编程技术网

Node.js WebSocket和Apache代理:如何配置mod_proxy_wstunel?

Node.js WebSocket和Apache代理:如何配置mod_proxy_wstunel?,node.js,apache,proxy,websocket,socket.io,Node.js,Apache,Proxy,Websocket,Socket.io,我有: www.domain1.com(v2.4)的服务器端口80上的Apache,并启用 同一服务器的3001端口上的node.js+socket.io 访问www.domain2.com(带有端口80)将重定向到2。幸亏我已经在Apache配置中设置了这一点: <VirtualHost *:80> ServerName www.domain2.com ProxyPass / http://localhost:3001/ ProxyPassReverse /

我有:

  • www.domain1.com
    (v2.4)的服务器端口80上的Apache,并启用

  • 同一服务器的3001端口上的node.js+socket.io

  • 访问
    www.domain2.com
    (带有端口80)将重定向到2。幸亏我已经在Apache配置中设置了这一点:

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

    问题:如何使Apache代理也成为WebSocket?多亏了

    待办事项:

    1) 安装Apache 2.4(与2.2不兼容),并执行以下操作:

    2) 在端口3001上运行
    nodejs

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

    <VirtualHost *:80>
      ServerName www.domain2.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>
    
    
    服务器名www.domain2.com
    重新启动发动机
    RewriteCond%{REQUEST_URI}^/socket.io[NC]
    RewriteCond%{QUERY_STRING}transport=websocket[NC]
    重写规则/(*)ws://localhost:3001/$1[P,L]
    ProxyPass/http://localhost:3001/
    ProxyPassReverse/http://localhost:3001/
    

    注意:如果在使用WebSocket的同一台服务器上有多个服务,则可能需要将它们分开。

    可能有用。 只是所有查询都通过ws-to节点发送

    <VirtualHost *:80>
      ServerName www.domain2.com
    
      <Location "/">
        ProxyPass "ws://localhost:3001/"
      </Location>
    </VirtualHost>
    
    
    服务器名www.domain2.com
    ProxyPass“ws://localhost:3001/”
    
    我的设置:

    • Apache 2.4.10(运行Debian)
    • Node.js(版本4.1.1)应用程序运行在端口3000上,在路径
      /api/ws
    如上@Basj所述,确保已启用a2enmod代理和ws_隧道

    这是解决我的问题的Apache配置文件的屏幕截图:

    相关部分如下:

    <VirtualHost *:80>
      ServerName *******
      ServerAlias *******
      ProxyPass / http://localhost:3000/
      ProxyPassReverse / http://localhost:3000/
    
      <Location "/api/ws">
          ProxyPass "ws://localhost:3000/api/ws"
      </Location>
    </VirtualHost>
    
    
    服务器名*******
    服务器别名*******
    ProxyPass/http://localhost:3000/
    ProxyPassReverse/http://localhost:3000/
    ProxyPass“ws://localhost:3000/api/ws”
    

    希望对您有所帮助。

    您也可以通过HTTP头进行过滤,而不是通过URL进行过滤。此配置适用于使用WebSocket的任何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>
    
    
    服务器名www.domain2.com
    重新启动发动机
    RewriteCond%{HTTP:Upgrade}=websocket[NC]
    重写规则/(*)ws://localhost:3001/$1[P,L]
    重写cond%{HTTP:Upgrade}=websocket[NC]
    重写规则/(*))http://localhost:3001/$1[P,L]
    ProxyPassReverse/http://localhost:3001/
    
    自Socket.IO 1.0(2014年5月)起,所有连接都以HTTP轮询请求开始(更多信息)。这意味着除了转发WebSocket流量外,还需要转发任何
    transport=polling
    HTTP请求

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

  • 启用以下Apache2模块:

    sudo a2enmod proxy rewrite proxy\u http proxy\u wstunnel
    
  • 在*.conf文件中使用这些设置(例如,
    /etc/apache2/sites available/mysite.com.conf
    )。我已经加入了注释来解释每件作品:

    
    服务器名www.mydomain.com
    #启用重写引擎
    #需要:sudo a2enmod proxy rewrite proxy\u http proxy\u wstunnel
    #在规则/条件中,[NC]表示不区分大小写,[P]表示代理
    重新启动发动机
    #socket.io 1.0+使用HTTP轮询请求启动所有连接
    RewriteCond%{QUERY_STRING}传输=轮询[NC]
    重写规则/(*))http://localhost:3001/$1[P]
    #当socket.io想要启动WebSocket连接时,它会发送一个
    #应传输到ws的“升级:websocket”请求://
    RewriteCond%{HTTP:Upgrade}websocket[NC]
    重写规则/(*)ws://localhost:3001/$1[P]
    #可选:将/节点上的所有HTTP流量路由到端口3001
    代理请求关闭
    代理过程/节点http://localhost:3001
    ProxyPassReverse/节点http://localhost:3001
    
  • 我已经为路由
    /node
    流量添加了一个额外的部分,我觉得这很方便,有关更多信息,请参阅


  • 在这些答案的帮助下,我终于得到了Node RED的反向代理,它运行在Raspberry Pi上,Ubuntu Mate和Apache2正在运行,使用Apache2站点配置:

    <VirtualHost *:80>
        ServerName nodered.domain.com
        RewriteEngine On
        RewriteCond %{HTTP:Upgrade} =websocket [NC]
        RewriteRule /(.*)           ws://localhost:1880/$1 [P,L]
        RewriteCond %{HTTP:Upgrade} !=websocket [NC]
        RewriteRule /(.*)           http://localhost:1880/$1 [P,L]
    </VirtualHost>
    
    用于“轮询”传输

    阿帕奇方面:

    <VirtualHost *:80>
        ServerName mysite.com
        DocumentRoot /my/path
    
    
        ProxyRequests Off
    
        <Proxy *>
            Order deny,allow
            Allow from all
        </Proxy>
    
        ProxyPass /my-connect-3001 http://127.0.0.1:3001/socket.io
        ProxyPassReverse /my-connect-3001 http://127.0.0.1:3001/socket.io   
    </VirtualHost>
    

    使用此链接可获得ws-perfact解决方案

    您只需执行以下步骤

    转到可用的
    /etc/apache2/mods

    步骤…1

    使用以下命令启用
    模式代理\u wstunnel.load

    $a2enmod proxy_wstunnel.load
    
    第二步

    转到
    /etc/apache2/可用站点

    并在虚拟主机内的.conf文件中添加以下行

    ProxyPass "/ws2/"  "ws://localhost:8080/"
    
    ProxyPass "/wss2/" "wss://localhost:8080/"
    
    注意:8080表示您的tomcat运行端口,因为我们希望连接
    ws
    ,我们的War文件放在tomcat中,tomcat为
    ws
    提供apache服务。 多谢各位

    我的配置

    ws://localhost/ws2/ALLCAD-Unifiedcommunication-1.0/chatserver?userid=4 =Connected
    
    待办事项:

  • 安装Apache 2.4(不适用于2.2)、
    a2enmod代理
    a2enmod代理_wstunnel.load

  • 在Apache配置中执行此操作
    只需在文件中添加两行,其中8080是tomcat的运行端口

    <VirtualHost *:80>
    ProxyPass "/ws2/" "ws://localhost:8080/" 
    ProxyPass "/wss2/" "wss://localhost:8080/"
    
    </VirtualHost *:80>
    
    
    ProxyPass“/ws2/”ws://localhost:8080/“
    ProxyPass“/wss2/”wss://localhost:8080/"
    

  • 除了主要答案之外:如果在使用WebSocket的同一台服务器上有多个服务,您可能希望使用(*)将它们分开:

    节点服务器:

    var io = require('socket.io')({ path: '/ws_website1'}).listen(server);
    
    客户端HTML:

    <script src="/ws_website1/socket.io.js"></script>
    ...
    <script>
    var socket = io('', { path: '/ws_website1' });
    ...
    


    (*)注意:使用默认的
    RewriteCond%{REQUEST_URI}^/socket.io
    不会特定于某个网站,而websockets请求会在不同的网站之间混淆

    对运行静态、rest和websocket内容的spring应用程序执行了以下操作

    Apache用作以下URI的代理和SSL端点:

    • /应用程序→ 静态内容
    • /原料药→ RESTAPI
    • /api/ws→ 网袋
    Apache配置 F
    ws://localhost/ws2/ALLCAD-Unifiedcommunication-1.0/chatserver?userid=4 =Connected
    
    <VirtualHost *:80>
    ProxyPass "/ws2/" "ws://localhost:8080/" 
    ProxyPass "/wss2/" "wss://localhost:8080/"
    
    </VirtualHost *:80>
    
    var io = require('socket.io')({ path: '/ws_website1'}).listen(server);
    
    <script src="/ws_website1/socket.io.js"></script>
    ...
    <script>
    var socket = io('', { path: '/ws_website1' });
    ...
    
    RewriteEngine On
    
    RewriteRule ^/website1(.*)$ http://localhost:3001$1 [P,L]
    
    RewriteCond %{REQUEST_URI}  ^/ws_website1 [NC]
    RewriteCond %{QUERY_STRING} transport=websocket [NC]
    RewriteRule ^(.*)$ ws://localhost:3001$1 [P,L]
    
    RewriteCond %{REQUEST_URI}  ^/ws_website1 [NC]
    RewriteRule ^(.*)$ http://localhost:3001$1 [P,L]
    
    <VirtualHost *:80>
        ServerName xxx.xxx.xxx    
    
        ProxyRequests Off
        ProxyVia Off
        ProxyPreserveHost On
    
        <Proxy *>
             Require all granted
        </Proxy>
    
        RewriteEngine On
    
        # websocket 
        RewriteCond %{HTTP:Upgrade}         =websocket                      [NC]
        RewriteRule ^/api/ws/(.*)           ws://localhost:8080/api/ws/$1   [P,L]
    
        # rest
        ProxyPass /api http://localhost:8080/api
        ProxyPassReverse /api http://localhost:8080/api
    
        # static content    
        ProxyPass /app http://localhost:8080/app
        ProxyPassReverse /app http://localhost:8080/app 
    </VirtualHost>
    
    server.use-forward-headers: true
    
    
    <VirtualHost *:80>
        ServerName: xxxxx
    
        #ProxyPassReverse is not needed
        ProxyPass /log4j ws://localhost:4711/logs
    <VirtualHost *:80>