如何使用Apache 2.4反向代理Websocket
说明
在本教程中,我们将学习如何配置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.
soLoadModule 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>