(1)HAProxy描述

     HAProxy是一个负载均衡器,可以将其配置为一个HTTPS终止程序,以从后端web服务器卸载TLS处理。将HAProxy部署在这些web服务器的前面。而不是直接访问web服务器,web客户端联系HAProxy。代表这些客户端,HAProxy从后端web服务器检索并返回所请求的对象。

终止HTTPS连接
下面的模式说明了如何使用HAProxy作为web服务器前的HTTPS终止程序。

RH358学习笔记--8(使用HAProxy终止HTTPS流量和并进行负载均衡)_终止程序

 

 

 

 

1. web 客户端使用 HTTPS 从 HAProxy 请求 web 文档。对于客户端,HAProxy 就像 web 服务器
2. HAProxy 使用其 TLS 证书和私钥来解密 HTTPS 流量
3. HAProxy 以纯文本形式将请求转发到后端 web 服务
4. 后端 web 服务将其回复发送到 HAProxy
5. HAProxy 使用其 TLS 证书和私钥来加密回复,发回到 web 客户端

 

负载均衡请求
下面的模式说明了HAProxy如何作为负载均衡器工作。

RH358学习笔记--8(使用HAProxy终止HTTPS流量和并进行负载均衡)_linux_02

 

 维护会话
当与web应用程序交互时,应用程序通常使用某种HTTP会话抽象来维护用户状态,通常使用HTTP cookie。因为HAProxy可以将您的请求定向到任何web服务器,所以会话信息必须是全局可用的,而不仅仅是在到达的第一个服务器上。

HAProxy选择负载均衡算法

roundrobin(轮训)
该算法依次向每个web服务器发送请求。
当web交付静态内容时,或者当web应用程序运行在后端服务器上,将用户会话保存在全局存储中时,将使用它。

source
该算法使用客户端的IP地址来选择后端服务器。使用这种算法,HAProxy总是将客户端请求转发到同一台服务器。当运行在后端服务器上的web应用程序不能全局管理会话时,可以使用此算法。

(2)部署和配置 HAProxy

安装haproxy包。
[root@host ~]# yum install haproxy

启动haproxy systemd服务。
[root@host ~]# systemctl enable --now haproxy

global:global部分定义了与haproxy进程相关的参数,比如用于守护进程的Linux用户帐户。通常不需要改变这个部分的任何内容。
defaults:defaults节为其他节的参数设置默认值。可以在下面的部分中重写这些参数
frontend name:frontend部分配置HAProxy的面向客户端。在本节中,将指定监听传入请求的网络端口。这也是将HAProxy配置为HTTPS终止程序的地方。
backend name:backend部分列出了所有后端web服务器。在本节中,您将指定用于检查后端服务器健康状况的负载均衡算法和机制。
listen name:listen部分允许以更紧凑的方式定义前端和后端配置。当设置很简单时,可以使用单个侦听部分,而不是前端和后端部分。

--------------------------展示了frontend和backend部分-----------------------------

 

RH358学习笔记--8(使用HAProxy终止HTTPS流量和并进行负载均衡)_负载均衡_03

 

 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

配置HAProxy为HTTPS终结程序

在将HAProxy配置为HTTPS终止程序之前,请先获取服务器的TLS证书和私钥。HAProxy希望将证书和密钥放在一个文件中,因此可能必须创建该文件。因为该文件包含私钥,请将其存储在一个安全的目录中:

 [root@yuan ~]# mkdir /etc/pki/haproxy/
[root@yuan ~]# chmod 700 /etc/pki/haproxy/
[root@yuan~]# cat www.example.com.crt www.example.com.key > /etc/pki/haproxy/haproxy.pem

在 /etc/haproxy/haproxy.cfg配置文件中,在front一节中定义了HTTPS终止程序的配置。

RH358学习笔记--8(使用HAProxy终止HTTPS流量和并进行负载均衡)_web服务器_04

 

 HAProxy配置SELinux
SELinux允许HAProxy绑定并连接到http_cache_port_t和http_port_t端口类型。可以使用semanage port -l命令列出相关联的端口号。

[root@yuan ~]# semanage port -l | grep -w -e http_cache_port_t -e http_port_t | grep tcp
RH358学习笔记--8(使用HAProxy终止HTTPS流量和并进行负载均衡)_负载均衡_05

 

 要让HAProxy监听或连接到任何其他端口,可将haproxy_connect_any SELinux布尔值设置为on
[root@yuan ~]# setsebool -P haproxy_connect_any on

(3)在Varnish前面配置HAProxy

HAProxy和Varnish一起使用是典型的配置。在这种设置中,HAProxy终止HTTPS连接,然后将流量以纯文本的形式转发给Varnish。Varnish将请求转发到后端web服务器,缓存响应,然后将它们发送回HAProxy以交付给web客户端。

 RH358学习笔记--8(使用HAProxy终止HTTPS流量和并进行负载均衡)_linux_06

 

 

HAProxy和Varnish都将X-Forwarded-For HTTP报头插入到请求中,而且Varnish将HAProxy视为一个web客户端,所以正确配置报头是很复杂的。为了简化设置,HAProxy开发人员创建了HTTP 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

 

为代理协议配置Varnish

对于Varnish,在varnishd命令的-a选项的末尾添加PROXY关键字。为此,通过创建一个drop-in目录重新配置varnish systemd服务

[root@yuan ~]# mkdir /etc/systemd/system/varnish.service.d/
[root@yuan ~]# 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@yuan ~]# systemctl daemon-reload
[root@yuan ~]# systemctl restart varnish

(4)监控和管理HAProxy

HAProxy提供了一个HTML统计报表页面。在该页面中,可以检查和监视安装的行为。

RH358学习笔记--8(使用HAProxy终止HTTPS流量和并进行负载均衡)_终止程序_07

 

/etc/haproxy/haproxy.cfg 配置文件在 global 部分下定义UNIX socket。若要激活 admin 模式,将 level admin 选项添加到 stats socket 指令中。 

RH358学习笔记--8(使用HAProxy终止HTTPS流量和并进行负载均衡)_linux_08