HAProxy可以作为一款具备高并发(一万以上)、高性能的TCP和HTTP负载均衡器,可以实现对后端web服务器的代理转发。此次实验笔者以HAProxy作为代理服务器,后端两台Nginx作为web服务器,期望用户访问HAProxy服务器绑定的域名www.johnnyfang.com能转发到后端web服务器来演示相关操作。
- 后端web服务器设置
后端两台web服务器分别取名web-server1和web-server2,直接通过yum方式安装并启动Nginx服务,如果想要通过源码编译方式安装,可参考笔者上周作业的《配置虚拟主机,实现强制https跳转访问》(链接:https://blog.51cto.com/u_15473594/5394748)第一部分。为了查看效果,web首页均显示各自ip。
- HAProxy服务器设置
HAProxy服务器部分笔者就是用上一篇实验编译安装的2.4.17版本HAProxy,在做代理服务器时,可以使用frontend+backend的方式来进行配置,frontend相当于Nginx代理服务时使用的server {}部分,backend相当于upstream {}部分。也可以使用listen的方式来替换frontend+backend,从而简化设置,生产中建议使用listen。
2.1 frontend+backend
先来看frontend+backend的配置方式,frontend部分主要是4项内容的设置,第一项是自定义的服务名称;第二项是将用户访问的服务端口先绑定到本机;第三项是选择模式,可以选择http7层代理或者tcp4层代理,如果改成tcp模式,服务器的压力相对也会更小点;最后一项是要使用use_backend调用后端真实服务器,后面添加的分组名称需与backend部分保持一致。
backend部分对应后端真实服务器,可以是单台或者多台主机,server部分可设置主机的名称(主机特别多时可以改为ip或者域名以便区分),并要添加主机对应的ip和端口号,端口号可以和用户请求端口号不同。为了能更充分发挥HAProxy的功能,建议在server后面添加check做健康性检查,inter表示检查的时间间隔,默认为200毫秒,可以自己修改,fall和rise表示HAProxy在对后端服务器做健康性检查时的连续判定有效次数,即关闭或开启对后端指定服务器的转发,默认分别为3次和2次。
此时客户端修改/etc/hosts文件后,通过Linux主机或浏览器去访问HAProxy服务器绑定的域名www.johnnyfang.com,会按照默认的动态轮询算法往后端两台web服务器进行调度。
2.2 listen
使用listen替换frontend+backend的方式就比较简洁,listen后面跟上服务名称,下面填写本机的监听端口、采用何种模式以及对应的后端服务器主机信息即可。
客户端通过HAProxy服务器进行web服务访问时,效果通frontend+backend的方式相同,也是动态轮询调度显示后端两台web服务器的主页内容。
- 使用子配置文件
3.1 创建子配置文件
与上周作业中的Nginx服务相同,HAProxy也可以使用子配置文件的形式来保存不同服务的配置,例如主配置文件是放在/etc/haproxy/目录下,我们可以在该目录下创建一个/conf.d目录来管理各个服务的配置。需要注意的是,在创建HAProxy的子配置文件时,后缀也必须是cfg,例如笔者将之前在主配置文件中的web服务配置剪切到子配置文件中。
3.2 修改service文件
Nginx在创建子配置文件后需要在主配置文件中进行路径的声明,而在HAProxy中则需要在service文件中声明,添加子配置文件的路径后需重新加载并重启HAProxy服务。
3.3 客户端测试
在创建了子配置文件后,客户端通过Linux主机或浏览器访问,同样可以访问成功。
- HAProxy服务日志配置
4.1 HAProxy服务器开启日志
HAProxy默认是不记录日志的,例如笔者虽然在主配置文件的全局配置中添加了日志,要想使用的话还得修改rsyslog配置文件。
log可以设置在未使用的local{1-7}之间,级别有err、warning、info和debug这几种,只显示普通信息,笔者在主配置文件中使用info即可。
CentOS7/8系列开启rsyslog记录HAProxy日志有两处修改内容,一处是取消“$ModLoad imudp”和“$UDPServerRun 514”前面的注释,另一处就是添加日志的位置。
此外要在服务子配置文件中添加一行log global,即开启当前服务的日志功能,保存完毕需重启rsyslog和HAProxy服务。
客户端通过Linux主机或者浏览器访问时,HAProxy已经已经能够查看到日志。
4.2 web服务器开启HAProxy日志
以上是在HAProxy服务器中直接创建日志记录的,不过生产中的日志数据一般会比较大,不是很建议在HAProxy服务器上开启日志记录,更推荐的是在后端Nginx服务器或日志服务器开启。例如后端的web-server1性能比较好,想要把日志都放在该服务器上,则主配置文件中需要将日志记录对应到web-server2上去,同时要针对N63_web这个服务来记录日志。
web-server2参照HAProxy开启日志的方式修改rsyslog配置文件。
此时客户端访问时,已经能在web-server1上查看到HAProxy访问日志。
除了使用后端服务器,也可以用专门的日志服务器,例如客户端client就是专门的日志服务器,HAProxy服务器将log日志记录指向client的ip,client修改rsysloglog日志后(Rocky8系列与CentOS系列rsyslog配置文件内容有所不同),浏览器中访问时,也能查看到记录。
- HAProxy实现ip透传
HAProxy在实现ip方面可使用http模式的七层代理透传和tcp模式的四层代理透传。
5.1 http七层代理实现ip透传
由于笔者在编译安装环节就在主配置文件default语句块中添加了“option forwardfor”参数,并且一直使用的http模式,故7层代理模式下,后端Nginx服务器是默认能收到源地址的。如果后端的web服务器是编译安装的Nginx,默认是关闭log_format和Nginx访问日志的,需要在Nginx配置文件中取消对应项的注释。
5.2 tcp四层代理实现ip透传
如果在以上的服务子配置文件中直接将模式修改tcp,以web-server2为例,后端web服务器是无法查看到客户端真实ip的。
要实现tcp模式的四层代理ip透传,需要HAProxy服务修改服务子配置文件,并且后端web服务器也进行相应的修改。HAProxy服务器需要在服务子配置文件的server部分添加send-proxy参数,以后端的web-server2为例,需要将配置文件中的log-format部分http模式相关内容删除,并添加$proxy_protocol_addr这一变量,同时在监听端口部分添加proxy_protocol。
客户端再去访问时,后端web服务器已经能查看到客户端真实ip。