HAProxy是一款功能强大、灵活好用的反向代理的开源软件,它提供了负载均衡、服务器代理的功能。HAProxy是Willy Tarreau使用C语言编写的,它支持SSL、压缩、keep-alive、自定义日志格式和header重写。 HAProxy是轻量级的负载均衡和代理服务软件,占用系统资源较少。很多大型的网站都在使用它,例如Github、StackOverflow。 下面我安装配置HAProxy做为两个Nginx服务器的负载均衡。一共需要使用3个服务器,在一台机器上安装HAProxy,另两台机器安装Nginx服务。
HAProxy的基本概念 4层和7层 HAProxy可以使用两种模式运行:TCP 4层模式和HTTP 7层模式。TCP模式:HAProxy把原始TCP数据包从客户端转向到应用服务器;HTTP模式:解析http请求,然后转向到web服务器。我们将使用HTTP 7层模式。 负载均衡算法 HAProxy使用负载均衡算法决定把请求发送给哪个服务器,使用的算法: Roundrobin-轮流算法 这是最简单的负载均衡算法。对每个新连接,总是下一个后端服务器处理。如果到达最后一个后端服务器,从头开始。 Lastconn 有最少连接的后端服务器处理新请求。当请求量较大时非常好。 Source 根据客户端IP决定哪个后端服务器处理。如果IP1是server1处理,那么这个IP1的所有请求都由server1处理。根据IP地址的哈希值决定后端服务器。
系统要求 3个CentOS 7服务器: 处理负载均衡的HAProxy服务器:192.168.0.101 Nginx1服务器:192.168.0.108 Nginx2服务器:192.168.0.109
第一步 编辑HAProxy服务器(102.168.0.101)的/etc/hosts: vim /etc/hosts 添加Nginx1和Nginx2的主机名: 192.168.0.108 nginx1.your_domain.com nginx1 192.168.0.109 nginx2.your_domain.com nginx2 保存退出。 同样,编辑两个Nginx服务器的/etc/hosts,添加: 192.168.0.101 loadbalancer 在两个Nginx服务器上都要设置。
第二步 在HAProxy服务器上安装HAProxy: # yum update # yum install haproxy haproxy的配置文件位于/etc/haproxy/。为了防止出错,先备份原始配置文件: # cd /etc/haproxy/ # mv haproxy.cfg haproxy.cfg.backup 编辑配置文件: # vim haproxy.cfg 写入如下内容: #--------------------------------------------------------------------- # 全局设置 #--------------------------------------------------------------------- global log 127.0.0.1 local2 # 日志 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy # Haproxy在haproxy用户和组下运行 group haproxy daemon # 开启 stats unix socket stats socket /var/lib/haproxy/stats #--------------------------------------------------------------------- # 基本设置 #--------------------------------------------------------------------- defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 #--------------------------------------------------------------------- # HAProxy Monitoring 配置 #--------------------------------------------------------------------- listen haproxy3-monitoring *:8080 # Haproxy Monitoring 的使用端口:8080 mode http option forwardfor option httpclose stats enable stats show-legends stats refresh 5s stats uri /stats # HAProxy monitoring的网址 stats realm Haproxy\ Statistics stats auth testuser:test1234 # 登录Monitoring的用户和密码 stats admin if TRUE default_backend app-main #--------------------------------------------------------------------- # FrontEnd 配置 #--------------------------------------------------------------------- frontend main bind *:80 option http-server-close option forwardfor default_backend app-main #--------------------------------------------------------------------- # 使用roundrobin做为负载均衡算法 #--------------------------------------------------------------------- backend app-main balance roundrobin # 使用的负载均衡算法 option httpchk HEAD / HTTP/1.1\r\nHost:\ localhost # 检查nginx服务器是否连通- 200状态码 server nginx1 192.168.0.108:80 check # Nginx1 server nginx2 192.168.0.109:80 check # Nginx2 配置rsyslog 我们需要使用rsyslog记录HAProxy的日志,编辑rsyslog.conf配置文件,打开UDP的514端口: # vim /etc/rsyslog.conf 去掉如下行的注释: $ModLoad imudp $UDPServerRun 514 如果你想指定特定IP,可以更改如下行: $UDPServerAddress 127.0.0.1 保存退出。 创建rsyslog配置文件: # vim /etc/rsyslog.d/haproxy.conf 写入如下内容: local2.=info /var/log/haproxy-access.log # 访问日志 local2.notice /var/log/haproxy-info.log # haproxy执行信息 重启rsyslog: # systemctl restart rsyslog 启动HAProxy: # systemctl start haproxy # systemctl enable haproxy
第三步 安装配置Nginx。 Nginx1和Nginx2服务器配置方法相同。 安装epel-release: # yum install epel-release 安装Nginx: # yum install nginx 创建index.html测试文件,Nginx1(192.168.0.108): # cd /usr/share/nginx/html/ # echo "<h1>nginx1.your_domain.com</h1>" > index.html Nginx2(192.168.0.109): # cd /usr/share/nginx/html/ # echo "<h1>nginx2.your_domain.com</h1>" > index.html 启动Nginx服务: # systemctl enable nginx # systemctl start nginx
测试 测试nginx1、2,使用浏览器访问: 192.168.0.108 192.168.0.109 正常访问网站:http://192.168.0.101,如果有域名,指向这个IP。 登录HAProxy web管理页面: http://192.168.0.101:8080/stats 你应该可以看到nginx、http请求的转发信息。 |