第八章:部署haproxy代理 搭建nginx集群
Haproxy介绍
Haproxy是一个开源的高性能的反向代理或者说是负载均衡服务软件之一,它支持双机热备、虚拟主机、基于TCP和HTTP应用代理等功能。
其配置简单,而且拥有很好的对服务器节点的健康检查功能(相当于keepalived健康检查),当其代理的后端服务器出现故障时,
Haproxy会自动的将该故障服务器摘除,当服务器的故障恢复后Haproxy还会自动将RS服务器添加
Haproxy特别使用与那些访问量很大。但又需要会话保持或七层应用的业务。Haproxy运行在普通的服务器硬件上,仅仅进行简单的优化就可以支持数以万计的并发连接。
并且它的运行模式使得它可以很简单安全的整合到各种网站的架构中,同时使得应用服务器不会暴露到网络中。
Haproxy软件引入了frontend,backend的功能,frontend(acl规则匹配)可以运维管理人员根据任意HTTP请求头做规则匹配,
然后把请求定向到相关的backend(server pools等待前端把请求转过来的服务器组)。通过frontend和backup,
我们可以很容易的实现haproxy的7层代理功能,haproxy是一款不可多得的优秀代理服务软件
Haproxy支持两种主要代理模式:第一个是4层tcp代理(例如:可用于邮件服务内部协议通信服务器、Mysql服务等)。
第二个是7层代理(如HTTP代理)。在4层tcp代理模式下,Haproxy仅在客户端和服务器之间双向转发流量。
但是在7层模式下Haproxy会分析应用层协议,并且能通过运行、拒绝、交换、增加、修改或者删除请求(request)或者回应(reponse)里指定内容来控制协议。
haproxy主配置文件介绍
vim /usr/src/haproxy-1.5.19/examples/haproxy.cfg
#全局配置, 用于设定义全局参数, 属于进程级的配置, 通常与操作系统配置有关.
global
#定义全局日志, 配置在本地, 通过local0 输出, 默认是info级别,可配置两条
log 127.0.0.1 local0 warning
#定义日志级别【error warning info debug】
#log 127.0.0.1 local1 info
#运行路径
chroot /usr/local/haproxy
#PID 文件存放路径
pidfile /var/run/haproxy.pid
#设置每haproxy进程的最大并发连接数, 其等同于命令行选项“-n”; “ulimit -n”自动计算的结果参照此参数设定.
maxconn 4096
#运行haproxy 用户, 或者使用关键字uid
user haproxy
#运行haproxy 用户组, 或者使用关键字gid
group haproxy
#后台运行haproxy
daemon
#设置启动的haproxy进程数量, 只能用于守护进程模式的haproxy;
#默认只启动一个进程, 鉴于调试困难等多方面的原因, 一般只在单进程仅能打开少数文件描述符的场景中才使用多进程模式.
nbproc 1
#设置每进程所能够打开的最大文件描述符数目, 默认情况其会自动进行计算, 因此不推荐修改此选项.
#ulimit-n 819200
#调试级别, 一般只在开启单进程时调试, 且生产环境禁用.
#debug
#haproxy启动后不会显示任何相关信息, 这与在命令行启动haproxy时加上参数“-q”相同
#quiet
#定义统计信息保存位置
stats socket /usr/local/haproxy/stats
#默认配置
defaults
#默认的模式【tcp:4层; http:7层; health:只返回OK】
mode http
#继承全局的日志定义输出
log global
#日志类别, httplog
#option httplog
#如果后端服务器需要记录客户端真实ip, 需要在HTTP请求中添加”X-Forwarded-For”字段;
#但haproxy自身的健康检测机制访问后端服务器时, 不应将记录访问日志,可用except来排除127.0.0.0,即haproxy本身.
#option forwardfor except 127.0.0.0/8
option forwardfor
#开启http协议中服务器端关闭功能, 每个请求完毕后主动关闭http通道, 使得支持长连接,使得会话可以被重用,使得每一个日志记录都会被记录.
option httpclose
#如果产生了一个空连接,那这个空连接的日志将不会记录.
option dontlognull
#当与后端服务器的会话失败(服务器故障或其他原因)时, 把会话重新分发到其他健康的服务器上; 当故障服务器恢复时, 会话又被定向到已恢复的服务器上;
#还可以用”retries”关键字来设定在判定会话失败时的尝试连接的次数
option redispatch
retries 3
#当haproxy负载很高时, 自动结束掉当前队列处理比较久的链接.
option abortonclose
#默认http请求超时时间
timeout http-request 10s
#默认队列超时时间, 后端服务器在高负载时, 会将haproxy发来的请求放进一个队列中.
timeout queue 1m
#haproxy与后端服务器连接超时时间.
timeout connect 5s
#客户端与haproxy连接后, 数据传输完毕, 不再有数据传输, 即非活动连接的超时时间.
timeout client 1m
#haproxy与后端服务器非活动连接的超时时间.
timeout server 1m
#默认新的http请求连接建立的超时时间,时间较短时可以尽快释放出资源,节约资源.
timeout http-keep-alive 10s
#心跳检测超时时间
timeout check 10s
#最大并发连接数
maxconn 2000
#设置默认的负载均衡方式
#balance source
#balnace leastconn
#统计页面配置, frontend和backend的组合体, 监控组的名称可按需自定义
listen admin_status
#配置监控运行模式
mode http
#配置统计页面访问端口
bind 0.0.0.0:1080
#统计页面默认最大连接数
maxconn 10
#http日志格式
option httplog
#开启统计
stats enable
#隐藏统计页面上的haproxy版本信息
stats hide-version
#监控页面自动刷新时间
stats refresh 30s
#统计页面访问url
stats uri /stats
#统计页面密码框提示文本
stats realm mCloud\ Haproxy
#监控页面的用户和密码:admin, 可设置多个用户名
stats auth admin:admin
#手工启动/禁用后端服务器, 可通过web管理节点
stats admin if TRUE
#设置haproxy错误页面
errorfile 400 /usr/local/haproxy/errorfiles/400.http
errorfile 403 /usr/local/haproxy/errorfiles/403.http
errorfile 408 /usr/local/haproxy/errorfiles/408.http
errorfile 500 /usr/local/haproxy/errorfiles/500.http
errorfile 502 /usr/local/haproxy/errorfiles/502.http
errorfile 503 /usr/local/haproxy/errorfiles/503.http
errorfile 504 /usr/local/haproxy/errorfiles/504.http
#监控haproxy后端服务器的监控状态
listen site_status
bind 0.0.0.0:1081 #监听端口
mode http #http的7层模式
log 127.0.0.1 local2 err #[err warning info debug]
monitor-uri /site_status #网站健康检测URL,用来检测HAProxy管理的网站是否可以用,正常返回200,不正常返回503
acl site_dead nbsrv(php_server) lt 1 #定义网站down时的策略当挂在负载均衡上的指定backend的中有效机器数小于1台时返回true
acl site_dead nbsrv(html_server) lt 1
acl site_dead nbsrv(backend_default) lt 1
monitor fail if site_dead #当满足策略的时候返回503,网上文档说的是500,实际测试为503
monitor-net 192.168.4.171/32 #来自192.168.4.152的日志信息不会被记录和转发
monitor-net 192.168.4.172/32
#frontend, 名字自定义
frontend HAproxy_Cluster
#定义前端监听端口, 建议采用bind :80的形式,否则做集群高可用的时候有问题,vip切换到其余机器就不能访问.
bind 0.0.0.0:80
#acl后面是规则名称,当请求的url末尾是以.php结尾时,匹配触发php_web规则,以下两种写法均可.
#当请求的url末尾是以.css、.jpg、.png、.jpeg、.js、.gif结尾时,匹配并触发static_web规则.
#acl static_web path_end .gif .png .jpg .css .js .jpeg
#acl static_web url_reg /.(css|jpg|png|jpeg|js|gif)$
#-i为忽略大小写,当被请求的是以www.test.com开头的主机时,匹配并触发dns_name规则.
acl html_web hdr_beg(host) -i www.haproxytest.com
#acl html_web hdr_beg(host) 10.11.4.152
#当客户端的IP是x.x.x.x时,匹配并触发src_ip规则.
#acl src_ip src x.x.x.x
#如果匹配acl规则php_web,将请求转交到php_server组处理;如果匹配acl规则html_web,将请求转交到html_server组处理.
use_backend php_server if php_web
use_backend html_server if html_web
#如果以上规则都不匹配时,将请求转交到default_backend组处理.
default_backend backend_default
#backend后端配置, 配置php_server组与html_server组
backend php_server
#定义负载均衡方式为roundrobin方式, 即基于权重进行轮询调度的算法, 在服务器性能分布较均匀情况下推荐.
#另有如下几种负载均衡方式:
#-- static-rr: 也是基于权重进行轮转调度, 但属于静态方法, 运行时调整后端机组权重不会使用新的权重;
#-- source: 基于请求源IP进行hash运算匹配后端服务器组;
#-- leastconn: 不适合会话较短的环境, 如基于http的应用;
#-- uri: 对整个URI进行hash运算;
#-- uri_param: 对URI中的参数进行转发;
#-- hdr():根据http头进行转发, 无该头部则转为使用roundrobin.
balance roundrobin
mode http
#允许插入serverid到cookie中,serverid后面可定义
cookie SERVERID
#心跳检测方式为检测后端服务器index.html文件,还有其他方式
option httpchk GET /index.html
#后端服务器定义, maxconn 1024表示该服务器的最大连接数, cookie 1表示serverid为1, weight代表权重(默认1,最大为265,0则表示不参与负载均衡),
#check inter 1500是检测心跳频率, rise 2是2次正确认为服务器可用, fall 3是3次失败认为服务器不可用.
server php1 192.168.4.171:80 maxconn 1024 cookie 1 weight 3 check inter 1500 rise 2 fall 3
backend html_server
balance source
mode http
server html1 192.168.4.172:80 maxconn 1024 cookie 1 weight 3 check inter 1500 rise 2 fall 3
backend backend_default
balance source
mode http
server default1 192.168.4.171:80 maxconn 1024 cookie 1 weight 3 check inter 1500 rise 2 fall 3
实验环境:
- linux-1 haproxy代理服务器
192.168.10.1
2.linux-2 nginx-1
192.168.10.2
3.linux-3 nginx-2
192.168.10.3
实验过程:
一、编译安装Nginx服务器(nginx-1,nginx-2)
1.nginx-1 服务器
[root@localhost ~]# yum -y install pcre-devel zlib-devel
[root@localhost ~]# tar xf nginx-1.12.0.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/nginx-1.12.0
[root@localhost ~]# useradd -M -s /sbin/nologin nginx
[root@localhost ~]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx &&make &&make install
[root@localhost ~]# echo “
server 192.168.10.3
” >/usr/local/nginx/html/index.html
[root@localhost ~]# /usr/local/nginx/sbin/nginx
[root@localhost ~]# netstat -anput |grep nginx
如果需要关闭服务 /usr/local/nginx/sbin/nginx -s stop
2.nginx-2 服务器 (可以使用脚本安装,确认源码软件已存放在/root目录中)
[root@localhost ~]# vim nginx-install.sh
#!/bin/bash
read -p “请输入首页内容:” indexyum -y install pcre-devel zlib-devel
tar zxvf nginx-1.12.0.tar.gz -C /usr/src/
cd /usr/src/nginx-1.12.0
useradd -M -s /sbin/nologin nginx
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install
echo “$index” > /usr/local/nginx/html/index.html
/usr/local/nginx/sbin/nginx
netstat -anput|grep nginx &>/dev/null
if [ $? -eq 0 ] ;then
echo “nginx服务成功启动”
else
echo “nginx服务未成功启动,请检查安装过程”
fi…
[root@localhost ~]# chmod +x nginx-install.sh
[root@localhost ~]# ./nginx-install.sh
二、Haproxy代理服务器
1.编译安装haproxy
[root@localhost ~]# yum -y install pcre-devel bzip2-devel
[root@localhost ~]# tar xf haproxy-1.5.19.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/haproxy-1.5.19/
##64位系统
[root@localhost ~]# make TARGET=linux26
[root@localhost ~]# make install
2.配置Haproxy
[root@localhost haproxy-1.5.19]# vim /usr/src/haproxy-1.5.19/examples/haproxy.cfg
k注释:
global --全局部分
log /dev/log local0 info
log /dev/log local1 notice ----把info和notice日志分别存放,以便查看
maxconn 4096 ----最大连接数
uid 99
gid 99 —用户和组id
# pidfile /var/run/haproxy.pid —pid文件的路径及文件名
daemon – 后台运行
defaults ----默认配置
log global —应用全局部分的日志配置
mode http —模式为http
option httplog
option dontlognull
retries 3 ---------检查节点的失败次数,连续达到3次认为节点不可用
maxconn 2000-----最大连接数
contimeout 5000—连接超时时间5000
clitimeout 50000
srvtimeout 50000----客户端和服务器超时时间都是50000
# option httpclose ----关闭客户端请求
listen webcluster 0.0.0.0:80 ----web集群(侦听的地址和接口)
option httpchk GET /index.html ----检查http文件
balance roundrobin —负载均衡调度算法 轮询 roundrobin
server inst1 192.168.10.2:80 check inter 2000 fall 3
server inst2 192.168.10.3:80 check inter 2000 fall 3 —服务器节点的地址、名称、端口 、检查间隔时间、健康检查次数3次认为失败
/dev/log 目录中的log文件是一个套接字(socket)。它是一条通信线路的站点,而这些终点(sockets)之间存在着数据通讯网络。
它的通信过程是:
程序通过访问远程计算机的socket地址,访问的计算机socket地址跟远程计算机socket地址之间就建立了一条通讯线路。
[root@localhost ~]# cd
[root@localhost ~]# mkdir /etc/haproxy
编辑配置文件如下
[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
global
log /dev/log local0 info
log /dev/log local1 notice
maxconn 4096
uid 99
gid 99
daemondefaults
log global
mode http
option httplog
option dontlognull
retries 3
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000listen webcluster 0.0.0.0:80
option httpchk GET /index.html
balance roundrobin
server inst1 192.168.10.2:80 check inter 2000 fall 3
server inst2 192.168.10.3:80 check inter 2000 fall 3[root@localhost ~]# cp /usr/src/haproxy-1.5.19/examples/haproxy.init /etc/init.d/haproxy
[root@localhost ~]# chmod +x /etc/init.d/haproxy
[root@localhost ~]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
[root@localhost ~]# /etc/init.d/haproxy restart
三、验证
客户机打开2个ie浏览器访问:http://192.168.10.1
查看是否能够获取不同的网页内容即成功
四.haproxy日志管理:
Haproxy的日志默认是输出到系统的syslog中,查看起来不是很方便,为了方便管理haproxy的日志,在生产环境中单独定义
[root@localhost ~]# cd /etc/rsyslog.d/
[root@localhost ~]# vim haproxy.conf
local0.* /var/log/haproxy/ha-info.log
local1.* /var/log/haproxy/ha-notice.log
#如果不加下面的的配置则除了在/var/log/haproxy.log中写入日志外,也会写入message文件
[root@localhost ~]# vi /etc/sysconfig/rsyslog
添加:
SYSLOGD_OPTIONS="-r -m 0 -c 2"
:wq
#-c 2 使用兼容模式,默认是 -c 5
#-r 开启远程日志
#-m 0 标记时间戳。单位是分钟,为0时,表示禁用该功能
[root@localhost ~]# systemctl restart rsyslog
[root@localhost ~]# /etc/init.d/haproxy restart
[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
global
log /dev/log local0 info
log /dev/log local1 notice
经检查在配置haproxy.cfg已配置
验证测试:
[root@localhost ~]# tail /var/log/haproxy/ha-info.log
查看是否有日志产生
…
教材中相关rsyslog配置,使用rainerscript语言编写,适用于复杂环境。略—用上述方法实现即可
vim /etc/rsyslog.d/haproxy.conf
编辑内容:
if ($programname == ‘haproxy’ and $syslogserverity-text == ‘info’) then -/var/log/haproxy/haproxy-info.log
& ~
if ($programname == ‘haproxy’ and $syslogserverity-text == ‘notice’) then -/var/log/haproxy/haproxy-notice.log
& ~
…
Haproxy参数优化
maxconn 最大的连接数 推荐使用10240
daemon 守护进程模式 可以使用非守护默认
nbproc 负载均衡的并发进程数 建议与当前服务器cpu核相等或2倍
retries 重试次数 对集群节点的检查,节点多并发量大,设置为2到3次
option http-server-close 主动关闭http请求选项 生产环境中使用此选项,避免由于timeout时间设置过长导致http连接堆积
timeout http-keep-alive 长连接超时时间(10s)
timeout http-request http请求超时时间(5~10s) 增加http连接释放的速度
timeout client 客户端超时时间