如何使用Apache 2.4反向代理Websocket

时间:2020-01-09 10:39:37  来源:igfitidea点击:

说明

在本教程中,我们将学习如何配置Apache Web Server 2.4来反向代理WebSocket。

引入了WebSocket,以在客户端和服务器之间打开双向交互式通信会话。这为事件驱动的响应铺平了道路,例如在不刷新页面的情况下通知用户新内容。

本教程的目的是说明如何使用RewriteEngine和ProxyPass将Apache正确配置为反向代理WebSocket。

准备

为了启用WebSocket反向代理,必须启用用于处理此类请求的Apache模块。

  • proxy
  • proxy_http
  • proxy_wstunnel

Ubuntu 16.04 / 18.04 / 19.04
如果我们正在运行Ubuntu 16.04或者更高版本,请运行以下命令以启用模块。

a2enmod proxy
a2enmod proxy_http
a2enmod proxy_wstunnel

CentOS的7

默认情况下,在httpd的CentOS 7安装中已启用了必备模块。通过编辑配置文件来启用和禁用这些模块。

  • 打开代理的模块配置文件。 sudo vi /etc/httpd/conf.modules.d/00-proxy.conf
  • 此配置文件中列出了与代理相关的所有模块。验证以下行是否存在并且未注释。LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_wstunnel modules/mod_proxy_wstunnel.so
  • 如果我们对文件进行了任何更改,请立即保存。
  • 重新启动Apache Web Server使更改生效。 sudo systemctl restart httpd

配置WebSocket反向代理

以下是支持Web套接字的虚拟主机的示例。我们必须了解两个重要的配置部分。

必须完成使用重写模块的第一部分,才能将其转换为适用于WebSockets的正确格式。这是Apache特有的,因为其他支持WebSocket的Web服务器将自动为我们执行此任务。

第二部分是我们将请求反向代理到后端服务器。

<VirtualHost *:443>
  ServerName ws.theitroad.com
  
  RewriteEngine on
  RewriteCond ${HTTP:Upgrade} websocket [NC]
  RewriteCond ${HTTP:Connection} upgrade [NC]
  RewriteRule .* "wss:/localhost:3000/" [P,L]
  
  ProxyPass / https://localhost:3000/
  ProxyPassReverse / https://localhost:3000/
  ProxyRequests off
</VirtualHost>

为了准确地了解上面已配置的内容,下面将描述每个指令及其作用。

ServerName ws.theitroad.com
将处理WebSocket连接的虚拟Web主机的主机名。

在RewriteEngine上
用于将RewriteEngine的状态设置为on或者off。要支持WebSocket,必须将其打开。

RewriteCond $ {HTTP:Upgrade} websocket [NC]
必须匹配的条件,RewriteRule才能处理请求。

RewriteCond $ {HTTP:Connection}升级[NC]
为了某事

RewriteRule .* "wss:/ws-backend%{REQUEST_URI}" [P]
重写所有传入请求以使用wss协议,并将目标主机名替换为后端服务的主机名。

反向代理负载平衡

当后端应用程序和Apache Proxy服务器都在同一主机上运行时,将使用上面给出的示例。

当反向代理需要将流量发送到多个后端服务器时,将使用代理负载均衡器模块。使用负载均衡器模块,我们定义了一个后端服务器池,Apache将使用定义的均衡算法发送请求。

为了扩展第一个示例,我们将对其进行修改以包括负载均衡器指令。

<VirtualHost *:443>
  ServerName ws.theitroad.com
  
  RewriteEngine on
  RewriteCond ${HTTP:Upgrade} websocket [NC]
  RewriteCond ${HTTP:Connection} upgrade [NC]
  RewriteRule .* "wss:/localhost:3000/" [P,L]
  
  <Proxy balancer://backend-cluster>
    BalancerMember http://server01:3000
    BalancerMember http://server02:3000
    BalancerMember http://server03:3000
  </Proxy>

  ProxyPass / balancer://backend-cluster/
  ProxyPassReverse / balancer://backend-cluster/
  ProxyRequests off
</VirtualHost>