使用HAProxy终止HTTPS流量和负载均衡

2.1 HAProxy描述

可以从繁忙的web服务器中卸载HTTPS解密和加密过程。TLS处理是CPU密集型的。通过将该操作委托给不同的系统,可以从web服务器释放一些资源,然后web服务器就有更多的处理能力来管理其工作负载。
另一种减少web服务器负载的方法是部署相同的web服务器群,然后在它们之间分发(或负载平衡)传入的web请求。
HAProxy是一个负载均衡器,可以将其配置为一个HTTPS终止程序,以从后端web服务器卸载TLS处理。将HAProxy部署在这些web服务器的前面。而不是直接访问web服务器,web客户端联系HAProxy。代表这些客户端,HAProxy从后端web服务器检索并返回所请求的对象。
2.1.1 终止HTTPS连接
下面的模式说明了如何使用HAProxy作为web服务器前的HTTPS终止程序。

#1. web客户端使用HTTPS从HAProxy请求web文档。对于客户端,HAProxy就像web服务器
#2. HAProxy使用其TLS证书和私钥来解密HTTPS流量
#3. HAProxy以纯文本形式将请求转发到后端web服务
#4. 后端web服务将其回复发送到HAProxy
#5. HAProxy使用其TLS证书和私钥来加密回复,发回到web客户端
某些web应用会动态构建HTML文档,以回复来自客户端的请求。这些文档可能包含引用网站其他部分的HTML链接。在构建这些链接时,web应用必须使用 https://架构,即使该请求通过HTTP来自HAProxy。HAProxy可将X-Forwarded-Proto HTTP标头插入到请求中,值设为https,以指示web应用在其链接中使用正确的方案
其他web应用使用传入请求的来源IP地址来识别其客户端。但由于HAProxy在web服务前面,应用会看到来自HAProxy系统的请求,而不是来自单个客户端。为解决此问题,HAProxy在其转发到后端web服务器的所有请求中插入了X-Forwarded-For HTTP标头。HAProxy将该标头的值设置为客户端的IP地址。
2.1.2 负载均衡请求
下面的模式说明HAProxy如何作为负载均衡器工作。

Web客户端通过HAProxy访问Web服务器。然后HAProxy在后端web服务器之间分发请求。通过这种方式,HAProxy将负载分散到web服务器群之间。HAProxy还可以监视后端服务器并停止向无响应的服务器发送请求。
2.1.3 维护会话
当与web应用程序交互时,应用程序通常使用某种HTTP会话抽象来维护用户状态,通常使用HTTP cookie。因为HAProxy可以将您的请求定向到任何web服务器,所以会话信息必须是全局可用的,而不仅仅是在到达的第一个服务器上。
一些web应用程序将会话信息保存在一个中央存储中,例如数据库或内存中的共享存储(如Redis或memcached)。对于这些应用程序,HAProxy不需要任何特定的配置。
有些应用程序不能正确地处理web场中的多个自身实例。对于这些应用程序,可以在HAProxy中选择一个负载均衡算法来始终将客户端引导到相同的后端web服务器。
2.1.4 选择负载均衡算法
HAProxy支持多种负载均衡算法来在后端web服务器之间分发请求。
- roundrobin
该算法依次向每个web服务器发送请求。当web交付静态内容时,或者当web应用程序运行在后端服务器上,将用户会话保存在全局存储中时,将使用它。
- source
该算法使用客户端的IP地址来选择后端服务器。使用这种算法,HAProxy总是将客户端请求转发到同一台服务器。当运行在后端服务器上的web应用程序不能全局管理会话时,可以使用此算法。
HAProxy 支持用于不同用例的其他算法。有关完整的列表,可参阅 /usr/share/doc/haproxy/configuration.txt

2.2 部署和配置HAProxy

安装haproxy包。
[root@host ~]# yum install haproxy
启动haproxy systemd服务。
[root@host ~]# systemctl enable --now haproxy
HAProxy使用/etc/haproxy/haproxy.cfg配置文件实现。该配置文件参数分组:
- global:
global部分定义了与haproxy进程相关的参数,比如用于守护进程的Linux用户帐户。通常不需要改变这个部分的任何内容。
- defaults:
defaults节为其他节的参数设置默认值。可以在下面的部分中重写这些参数
- frontend name:
frontend部分配置HAProxy的面向客户端。在本节中,将指定监听传入请求的网络端口。这也是将HAProxy配置为HTTPS终止程序的地方。
- backend name:
backend部分列出了所有后端web服务器。在本节中,您将指定用于检查后端服务器健康状况的负载均衡算法和机制。
- listen name:
listen部分允许以更紧凑的方式定义前端和后端配置。当设置很简单时,可以使用单个侦听部分,而不是前端和后端部分。
下面的例子展示了frontend和backend部分的声明。
frontend my-clients
  bind *:80 #①
  default_backend my-web-farm #②
  
backend my-web-farm
  balance roundrobin #③
  server web1 192.168.0.101:80 check inter 1s #④
  server web2 192.168.0.102:80 check inter 1s
  server web3 192.168.0.103:80 check inter 1s 
#①HAProxy在端口80上的所有接口上侦听传入请求。
#②HAProxy将请求分发到后端my-web-farm部分的web服务器上。
#③负载均衡算法为roundrobin。
#④HAProxy将请求分发到三个后端web服务器上。此外,HAProxy每秒检查这些服务器的健康状况,这样它就不会向停机的web服务器发送请求。
如果您愿意,可以使用listen部分来获得前面配置的更紧凑版本。
listen my-clients-and-web-farm
  bind *:80
  balance roundrobin
  server web1 192.168.0.101:80 check inter 1s
  server web2 192.168.0.102:80 check inter 1s
  server web3 192.168.0.103:80 check inter 1s
2.2.1 配置HAProxy为HTTPS终止器
在将HAProxy配置为HTTPS终止程序之前,请先获取服务器的TLS证书和私钥。HAProxy希望将证书和密钥放在一个文件中,因此可能必须创建该文件。因为该文件包含私钥,请将其存储在一个安全的目录中:
[root@host ~]# mkdir /etc/pki/haproxy/
[root@host ~]# chmod 700 /etc/pki/haproxy/
[root@host ~]# cat www.example.com.crt www.example.com.key >  /etc/pki/haproxy/haproxy.pem
在/etc/haproxy/haproxy.cfg配置文件中,您在frontend部分下定义HTTPS终结器配置。
frontend my-clients
  bind *:443 ssl crt /etc/pki/haproxy/haproxy.pem #① 
  bind *:80 #② 
  redirect scheme https if !{ ssl_fc } #③
  option forwardfor #④ 
  http-request add-header X-Forwarded-Proto https #⑤ 
  default_backend my-web-farm
#①HAProxy在443端口监听传入的HTTPS请求。该端口上的流量使用TLS。证书和私钥位于/etc/pki/haproxy/haproxy.pem
#②HAProxy还在80端口上侦听不使用TLS加密的HTTP请求。
#③如果一个未使用TLS加密的请求到达,HAProxy会响应一个302 HTTP重定向来指示客户端使用HTTPS代替。
#④在将X-Forwarded-For HTTP标头转发到后端web服务器时,HAProxy会将其插入到请求中,以便为它们提供客户端的IP地址。默认的配置文件定义在defaults部分下定义option forwardfor指令。因此,可在frontend部分中省略它
#⑤当将请求转发到后端web服务器时,HAProxy会将X-Forwarded-Proto HTTP头插入到请求中,这样后端web服务器就知道初始连接使用的是HTTPS
2.2.2 为HAProxy准备SELinux
SELinux允许HAProxy绑定并连接到http_cache_port_t和http_port_t端口类型。可以使用semanage port -l命令列出相关联的端口号。
[root@host ~]# semanage port -l | grep -w -e http_cache_port_t -e http_port_t | grep tcp
http_cache_port_t    tcp        8080, 8118, 8123, 10001-10010
http_port_t           tcp       80, 81, 443, 488, 8008, 8009, 8443, 9000
要让HAProxy监听或连接到任何其他端口,可将haproxy_connect_any SELinux布尔值设置为on
[root@host ~]# setsebool -P haproxy_connect_any on

2.3 在Varnish前配置HAProxy

因为Varnish不能作为HTTPS终止程序工作,所以将HAProxy和Varnish一起使用是典型的配置。在这种设置中,HAProxy终止HTTPS连接,然后将流量以纯文本的形式转发给Varnish。Varnish将请求转发到后端web服务器,缓存响应,然后将它们发送回HAProxy以交付给web客户端。
下图显示了HAProxy终止HTTPS连接,然后对Varnish服务器进行负载均衡请求。

因为HAProxy和Varnish都将X-Forwarded-For HTTP报头插入到请求中,而且Varnish将HAProxy视为一个web客户端,所以正确配置报头是很复杂的。为了简化设置,HAProxy开发人员创建了HTTP PROXY协议。
HAProxy使用HTTP PROXY协议与Varnish进行通信。该协议传输来自web客户端的原始请求,以及特定的代理数据,如客户端的IP地址。有了这些信息,Varnish自动将正确的X-Forwarded-For HTTP头插入到后端web服务器的请求中。
2.3.1 配置PROXY协议的HAProxy
在backend部分,设置send-proxy-v2选项以使用Varnish激活HTTP PROXY协议。
backend my-varnish
  server varnish 192.168.0.42:6081 send-proxy-v2 check inter 1s
因为HTTP代理协议管理X-Forwarded-For HTTP报头,所以要确保在defaults和backend部分下,从配置中移除option forwardfor指令。
2.3.2 配置PROXY协议的Varnish
对于Varnish,在varnishd命令的-a选项的末尾添加PROXY关键字。为此,通过创建一个drop-in目录重新配置varnish systemd服务
[root@host ~]# mkdir /etc/systemd/system/varnish.service.d/
[root@host ~]# vim /etc/systemd/system/varnish.service.d/httpport.conf
[Service]
ExecStart=
ExecStart=/usr/sbin/varnishd -a :6081,PROXY -f /etc/varnish/default.vcl -s malloc,256m
[root@host ~]# systemctl daemon-reload
[root@host ~]# systemctl restart varnish

2.4 监控和管理HAProxy

HAProxy提供了一个HTML统计报表页面。从该页面,您可以检查和监视您的安装行为。如果激活管理模式,则可以暂时禁用后端服务器,使其不再接收流量。该特性对于维护非常有用
默认配置禁用统计报表页面。要激活它,请在frontend部分中添加以下指令。
frontend stat-page
  bind *:8080 #① 
  stats enable #② 
  stats uri /haproxystats #③ 
  stats auth operator1:redhat123 #④ 
  stats admin if TRUE #⑤ 
#①可以创建一个专门的frontend部分,并在一个特定的端口上监听统计报告页面。也可以使用现有的frontend部分。
#②stats enable指令激活统计报表页面。
#③默认情况下,使用/haproxy?stats的URL路径。可以使用stats uri指令更改该默认路径。在本例中,使http://www.example.com:8080/haproxystats URL访问该页面。
#④因为统计数据报告页面提供了关于您的配置的信息,所以使用stats auth指令使用登录名和密码来保护它。
#⑤默认情况下,统计报表页面是只读的。通过激活管理模式,您还可以直接从web界面禁用和启用后端web服务器。
HAProxy还创建/var/lib/haproxy/stats UNIX套接字。监视和报告工具,如Performance Co-Pilot (PCP),使用该套接字来检索HAProxy守护进程的状态并收集统计信息。在管理模式下,管理工具(如Ansible)可以禁用和启用后端web服务器。
/etc/haproxy/haproxy.cfg配置文件在global部分下定义UNIX socket。若要激活admin模式,将level admin选项添加到stats socket指令中。
global
...output omitted...
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats level admin
...output omitted...
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xtgby

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值