反向代理设置
除了作为“基本” Web服务器并为最终用户提供静态和动态内容外,Apache httpd(以及大多数其他Web服务器)还可以充当反向代理服务器,也称为“网关”服务器。
在这种情况下,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的术语是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 Balancer使用基于I / O字节进行平衡的负载平衡算法。
暗示
平衡器成员有时也称为工作者。
平衡器和BalancerMember配置
您可以通过中定义的各种参数来调整平衡器和工人的许多配置细节ProxyPass
。例如,假设我们想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/"
故障转移
您还可以微调各种故障转移方案,详细说明在这种情况下应访问哪些工作人员,甚至应访问哪些平衡器。例如,以下设置实现了三种故障转移情况:
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
工作人员,备件和备用服务器均不可用,则只有这样才能使均衡器组中的http://bkup1.example.com:8080
和http://bkup2.example.com:8080
工人1
轮换。
因此,可以为每个负载均衡器集设置一个或多个热备用和热备用。
<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
,balancer-manager显示当前正在使用的平衡器和工作人员的工作配置以及状态。但是,它不仅可以显示这些参数,还可以对几乎所有参数进行动态,运行时,即时的重新配置,包括将新的BalancerMembers(工人)添加到现有的Balancer中。要启用这些功能,需要在配置中添加以下内容:
<Location "/balancer-manager"> SetHandler balancer-manager Require host localhost </Location>
警告
在确保服务器安全之前,请勿启用平衡器管理器。特别是,请确保严格限制对URL的访问。
当通过该URL访问反向代理服务器时(例如:)http://rproxy.example.com/balancer-manager/
,您将看到类似于以下内容的页面:
该表格允许devops管理员调整各种参数,使工作人员脱机,更改负载平衡方法并添加新作品。例如,单击平衡器本身,您将获得以下页面:
而单击工作人员,则显示此页面:
要使这些更改持续保持反向代理的重启,请确保BalancerPersist
已启用。
动态健康检查
在httpd向工作者发出请求之前,它可以通过使用为该工作者设置参数来“测试”该工作者是否可用。通常,以动态方式带外检查工人的健康状况会更有用。这是通过Apache httpd 模块实现的。ping
ProxyPass
mod_proxy_hcheck
BalancerMember状态标志
在平衡器管理器中,将显示工人的当前状态或状态,并可对其进行设置/重置。这些状态的含义如下:
Flag | String | Description |
---|---|---|
Ok | Worker is available | |
Init | Worker has been initialized | |
D | Dis | Worker is disabled and will not accept any requests; will be automatically retried. |
S | Stop | Worker is administratively stopped; will not accept requests and will not be automatically retried |
I | Ign | Worker is in ignore-errors mode and will always be considered available. |
R | Spar | Worker is a hot spare. For each worker in a given lbset that is unusable(draining, stopped, in error, etc.), a usable hot spare with the same lbset will be used in its place. Hot spares can help ensure that a specific number of workers are always available for use by a balancer. |
H | Stby | Worker is in hot-standby mode and will only be used if no other viable workers or spares are available in the balancer set. |
E | Err | Worker is in an error state, usually due to failing pre-request check; requests will not be proxied to this worker, but it will be retried depending on the retry setting of the worker. |
N | Drn | Worker is in drain mode and will only accept existing sticky sessions destined for itself and ignore all other requests. |
C | HcFl | Worker has failed dynamic health check and will not be used until it passes subsequent health checks. |