反向代理指南

除了作为“基本” Web 服务器并向最终用户提供静态和动态内容之外,Apache httpd(以及大多数其他 Web 服务器)还可以充当反向代理服务器,也称为“网关”服务器。

在这种情况下,httpd 本身不会生成或托管数据,而是通过一台或几台后端服务器获取内容,这些服务器通常没有与外部网络的直接连接。当 httpd 收到来自 Client 端的请求时,该请求本身被“代理”到这些后端服务器之一,然后由这些后端服务器处理请求,生成内容,然后将该内容发送回 httpd,然后生成实际的 HTTP 响应回 Client 端。

这种实现有很多原因,但是通常典型的理由是由于安全性,高可用性,负载平衡和集中式身份验证/授权。在这些实现中,至关重要的是后端基础结构(那些实际处理请求的服务器)的布局,设计和体系结构必须与外界隔离并受到保护。就 Client 端而言,反向代理服务器是所有内容的唯一来源。

典型的实现如下:

reverse-proxy-arch

Reverse Proxy

Related ModulesRelated Directives
mod_proxy
mod_proxy_balancer
mod_proxy_hcheck
ProxyPass
BalancerMember

简单的反向代理

ProxyPass指令指定将传入请求 Map 到后端服务器(或称为Balancer组的服务器集群)。最简单的示例将所有请求("/")代理到单个后端:

ProxyPass "/"  "http://www.example.com/"

为了确保从后端生成的和Location:Headers 被修改为指向反向代理而不是返回自身,最常需要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路径开头的请求都将代理到指定的后端,否则将在本地处理。

群集和平衡器

如上所述,它仍然有用,但仍然存在缺陷,即(单个)后端节点出现故障或负载沉重时,代理这些请求不会提供任何 true 的优势。所需要的是能够定义一组或一组后端服务器,这些后端服务器可以处理此类请求,并使反向代理在其中进行负载平衡和故障转移。该组有时称为* cluster ,但是 Apache httpd 的术语是 balancer *。一个人通过利用<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 称为 BalancerMembers 。在这种情况下,对/images的任何请求都将被代理到 2 个后端中的一个中。 ProxySet指令指定* myset *平衡器使用基于 I/O 字节进行平衡的负载平衡算法。

Hint

  • BalancerMembers 有时也称为 workers *。

Balancer 和 BalancerMember 配置

您可以通过ProxyPass中定义的各种参数来调整* balancers workers *的众多配置细节。例如,假设我们希望http://www3.example.com:8080以 1 秒的超时来处理 3 倍的流量,我们将调整配置如下:

<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/"

Failover

您还可以微调各种故障转移方案,详细说明在这种情况下应访问哪些工作人员,甚至应访问哪些平衡器。例如,以下设置实现了三种故障转移情况:

  • 仅当http://www2.example.com:8080http://www3.example.com:8080之一或两者都不可用时,才发送http://spare1.example.com:8080http://spare2.example.com:8080的流量。 (一个备件将用于替换同一平衡器集中一个不可用的成员.)

  • 仅当平衡器组0中的所有其他工作人员都不可用时,才会向http://hstandby.example.com:8080发送流量。

  • 如果所有负载平衡器组0工作人员,备用工和备用工不可用,则只有平衡器组1http://bkup1.example.com:8080http://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/"

对于故障转移,将热备用用作同一负载均衡器集中无法使用的工作人员的替代品。如果工作人员正在排干,停止或处于错误/失败状态,则认为该 Worker 不可用。如果负载均衡器集中的所有工作人员和备件都不可用,则使用热备用。始终按从最低到最高的 Sequences 尝试负载均衡器集(及其各自的热备用和备用)。

Balancer Manager

嵌入式* balancer-manager 应用程序是 Apache httpd 反向代理的最独特和有用的功能之一。与mod_status相似, balancer-manager 显示当前的工作配置以及当前正在使用的已启用的均衡器和 Worker 的状态。但是,它不仅可以显示这些参数,还可以对几乎所有参数进行动态,运行时和即时的重新配置,包括向现有的平衡器中添加新的 BalancerMembers *(Worker)。要启用这些功能,需要在配置中添加以下内容:

<Location "/balancer-manager">
    SetHandler balancer-manager
    Require host localhost
</Location>

Warning

在拥有保护您的服务器之前,请勿启用* balancer-manager *。特别是,请确保严格限制对 URL 的访问。

当通过该 URL 访问反向代理服务器时(例如http://rproxy.example.com/balancer-manager/),您将看到类似于以下内容的页面:

balancer-manager page

该表格允许 devops Management 员调整各种参数,使工作人员脱机,更改负载平衡方法并添加新作品。例如,单击平衡器本身,您将获得以下页面:

balancer-manager page

而单击工作人员,则显示此页面:

balancer-manager page

要使这些更改持续反向代理的重启,请确保启用了BalancerPersist

动态健康检查

在 httpd 向工作者发出请求之前,它可以通过使用ProxyPass设置该工作者的ping参数来*“测试” 该工作者是否可用。通常,以动态方式检查带外*的 Worker 的健康状况更为有用。这是通过mod_proxy_hcheck模块在 Apache httpd 中实现的。

BalancerMember 状态标志

在* balancer-manager 中,显示工作人员的当前状态或 status *,并且可以对其进行设置/重置。这些状态的含义如下:

FlagStringDescription
OkWorker 可用
Init工作器已初始化
DDis工作者被禁用,将不接受任何请求;将自动重试。
SStopWorker 在行政上被停止;将不接受请求,也不会自动重试
IIgnWorker 处于忽略错误模式,将始终被视为可用。
RSparWorker 是热备用。对于给定磅重中无法使用的每个 Worker(排水,停止,错误等),将使用具有相同磅重的可用热备用。热备用可以帮助确保平衡器始终可以使用特定数量的 Worker。
HStbyWorker 处于热备用模式,并且仅在平衡器集中没有其他可行的 worker 或备件时才使用。
EErr工作者处于错误状态,通常是由于请求前检查失败所致;请求不会被代理给该工作程序,但是将根据工作程序的retry设置重试该请求。
NDrnWorker 处于耗尽模式,将仅接受发往其自身的现有粘性会话,而忽略所有其他请求。
CHcFl工作者动态健康检查失败,只有通过后续的健康检查后才能使用。