Apache HTTP 服务器版本 2.4
除了作为“基本”Web 服务器,并向最终用户提供静态和动态内容外,Apache httpd(以及大多数其他 Web 服务器)还可以充当反向代理服务器,也称为“网关”服务器。
在这种情况下,httpd 本身不会生成或托管数据,而是内容由一个或多个后端服务器获取,这些服务器通常没有与外部网络的直接连接。当 httpd 从客户端接收请求时,请求本身会被代理到这些后端服务器之一,然后后端服务器处理请求,生成内容,然后将内容发送回 httpd,然后 httpd 生成实际的 HTTP 响应返回给客户端。
这种实现有很多原因,但通常来说,典型的理由是出于安全、高可用性、负载均衡和集中式身份验证/授权。在这些实现中,后端基础设施(实际处理请求的服务器)的布局、设计和架构必须与外部隔离开来并受到保护;就客户端而言,反向代理服务器是所有内容的唯一来源。
下面是一个典型的实现
ProxyPass
指令指定传入请求到后端服务器(或称为Balancer
组的服务器集群)的映射。最简单的示例将所有请求("/"
)代理到单个后端
ProxyPass "/" "http://www.example.com/"
为了确保从后端生成的Location:
头被修改为指向反向代理,而不是指向自身,通常需要使用ProxyPassReverse
指令
ProxyPass "/" "http://www.example.com/" ProxyPassReverse "/" "http://www.example.com/"
可以只代理特定的 URI,如以下示例所示
ProxyPass "/images" "http://www.example.com/" ProxyPassReverse "/images" "http://www.example.com/"
在上面的示例中,任何以/images
路径开头的请求都将被代理到指定的后端,否则将由本地处理。
虽然上面的示例很有用,但它仍然存在一些缺陷,例如,如果(单个)后端节点出现故障或负载过重,代理这些请求并不会带来任何实际优势。我们需要的是能够定义一组或一组后端服务器来处理这些请求,并让反向代理在它们之间进行负载均衡和故障转移。这组服务器有时被称为集群,但 Apache httpd 的术语是负载均衡器。可以使用<Proxy>
和BalancerMember
指令来定义负载均衡器,如下所示
<Proxy balancer://myset> BalancerMember http://www2.example.com:8080 BalancerMember http://www3.example.com:8080 ProxySet lbmethod=bytraffic </Proxy> ProxyPass "/images/" "balancer://myset/" ProxyPassReverse "/images/" "balancer://myset/"
balancer://
方案告诉 httpd 我们正在创建一个负载均衡器集,名为myset。它包含 2 个后端服务器,httpd 称之为负载均衡器成员。在这种情况下,任何对/images
的请求都将被代理到其中一个后端。ProxySet
指令指定myset负载均衡器使用基于 I/O 字节的负载均衡算法。
负载均衡器成员有时也称为工作器。
可以通过ProxyPass
中定义的各种参数来调整负载均衡器和工作器的众多配置细节。例如,假设我们希望http://www3.example.com:8080
处理 3 倍的流量,并且超时时间为 1 秒,那么我们将如下调整配置
<Proxy balancer://myset> BalancerMember http://www2.example.com:8080 BalancerMember http://www3.example.com:8080 loadfactor=3 timeout=1 ProxySet lbmethod=bytraffic </Proxy> ProxyPass "/images" "balancer://myset/" ProxyPassReverse "/images" "balancer://myset/"
还可以微调各种故障转移场景,详细说明在这种情况下应该访问哪些工作器,甚至应该访问哪些负载均衡器。例如,以下设置实现了三种故障转移情况
http://spare1.example.com:8080
和http://spare2.example.com:8080
只在http://www2.example.com:8080
或http://www3.example.com:8080
之一或两者不可用时才会接收流量。(一个备用将用于替换同一个负载均衡器集中一个不可用的成员。)http://hstandby.example.com:8080
只在负载均衡器集0
中的所有其他工作器都不可用时才会接收流量。0
中的所有工作器、备用和备用都不可用,那么才会将负载均衡器集1
中的http://bkup1.example.com:8080
和http://bkup2.example.com:8080
工作器加入轮询。因此,可以为每个负载均衡器集设置一个或多个热备用和热备用。
<Proxy balancer://myset> BalancerMember http://www2.example.com:8080 BalancerMember http://www3.example.com:8080 loadfactor=3 timeout=1 BalancerMember http://spare1.example.com:8080 status=+R BalancerMember http://spare2.example.com:8080 status=+R BalancerMember http://hstandby.example.com:8080 status=+H BalancerMember http://bkup1.example.com:8080 lbset=1 BalancerMember http://bkup2.example.com:8080 lbset=1 ProxySet lbmethod=byrequests </Proxy> ProxyPass "/images/" "balancer://myset/" ProxyPassReverse "/images/" "balancer://myset/"
对于故障转移,热备用用作同一个负载均衡器集中不可用工作器的替换。如果工作器处于排空、停止或其他错误/故障状态,则该工作器被视为不可用。如果负载均衡器集中的所有工作器和备用都不可用,则使用热备用。负载均衡器集(及其各自的热备用和备用)始终按从低到高的顺序尝试。
Apache httpd 反向代理最独特和最有用的功能之一是嵌入式负载均衡器管理器应用程序。类似于mod_status
,负载均衡器管理器显示当前正在使用的已启用负载均衡器和工作器的当前工作配置和状态。但是,它不仅显示这些参数,还允许对几乎所有参数进行动态、运行时、即时重新配置,包括将新的负载均衡器成员(工作器)添加到现有负载均衡器中。要启用这些功能,需要在配置中添加以下内容
<Location "/balancer-manager"> SetHandler balancer-manager Require host localhost </Location>
在保护服务器之前,请勿启用负载均衡器管理器。特别是,确保对 URL 的访问受到严格限制。
当以该 URL 访问反向代理服务器时(例如:http://rproxy.example.com/balancer-manager/
),您将看到类似于以下内容的页面
此表单允许 DevOps 管理员调整各种参数,使工作器脱机,更改负载均衡方法,并添加新的工作器。例如,单击负载均衡器本身,您将看到以下页面
而单击工作器,则会显示此页面
要使这些更改在反向代理重启后仍然生效,请确保启用了BalancerPersist
。
在 httpd 将请求代理到工作器之前,可以通过使用ProxyPass
为工作器设置ping
参数来“测试”该工作器是否可用。通常,在带外以动态方式检查工作器的运行状况更有用。这在 Apache httpd 中通过mod_proxy_hcheck
模块实现。
在负载均衡器管理器中,显示工作器的当前状态或状态,并且可以设置/重置状态。这些状态的含义如下
标志 | 字符串 | 描述 |
---|---|---|
Ok | 工作器可用 | |
Init | 工作器已初始化 | |
D | Dis | 工作器已禁用,不会接受任何请求;将自动重试。 |
S | Stop | 工作器已由管理员停止;不会接受请求,也不会自动重试 |
I | Ign | 工作器处于忽略错误模式,始终被视为可用。 |
R | Spar | 工作器是热备用。对于给定 lbset 中的每个不可用工作器(排空、停止、错误等),将使用具有相同 lbset 的可用热备用代替。热备用可以帮助确保始终有特定数量的工作器可供负载均衡器使用。 |
H | Stby | 工作器处于热备用模式,只有在负载均衡器集中没有其他可用的工作器或备用时才会使用。 |
E | Err | 工作器处于错误状态,通常是由于请求前检查失败;请求不会被代理到该工作器,但会根据工作器的retry 设置进行重试。 |
N | Drn | 工作器处于排空模式,只接受为其自身设计的现有粘性会话,并忽略所有其他请求。 |
C | HcFl | 工作器动态健康检查失败,在通过后续健康检查之前不会使用。 |