centos7安装部署Haproxy+keepalived高可用负载均衡调度器------源码方式
一、实验环境
IP地址 | 主机名称 | 角色 |
192.168.200.111 | haproxy_master | haproxy,keepalived |
192.168.200.112 | haproxy_slave | haproxy,keepalived |
192.168.200.113 | nginx_master | nginx,keepalived |
192.168.200.114 | nginx_slave | nginx,keepalived |
二、haproxy安装配置(111、112都配置不同的地方会指出)
1. haproxy下载安装包
haproxy下载地址:https://pan.baidu.com/s/1n4-8mIOy9sdfs8iT08eSOA
提取码:vv35
2.安装haproxy
uname -r
3.10.0-229.el7.x86_64
1 #配置主机名 2 hostname haproxy-master 3 bash 4 [root@haproxy-master ~]# 5 ------------------------------------------ 6 ls 7 anaconda-ks.cfg haproxy-1.7.8.tar.gz 8 ----------------------------------------------- 9 #解压安装包 10 tar xf haproxy-1.7.8.tar.gz -C /usr/src/ 11 [root@haproxy-master ~]# cd /usr/src/haproxy-1.7.8/ 12 #编译安装haproxy 13 make TARGET=linux3100 PREFIX=/usr/local/haproxy 14 make install PREFIX=/usr/local/haproxy 15 #查看安装haproxy的安装版本 16 /usr/local/haproxy/sbin/haproxy -v 17 HA-Proxy version 1.7.8 2017/07/07 18 Copyright 2000-2017 Willy Tarreau <willy@haproxy.org> 19 #配置启动软链接 20 ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/ 21 #创建启动程序用户 22 useradd -M -s /sbin/nologin haproxy 23 #配置配置文件 24 mkdir /etc/haproxy 25 vim /etc/haproxy/haproxy.cfg
3. 配置文件内容
global log 127.0.0.1 local3 info chroot /usr/local/haproxy user haproxy group haproxy daemon maxconn 4000 defaults log global mode http option httplog option dontlognull timeout connect 5000 timeout client 50000 timeout server 50000 frontend http_front bind *:80 stats uri /haproxy?stats default_backend http_back backend http_back balance roundrobin option httpchk GET /index.html option forwardfor header X-Forwarded-For server node1 192.168.200.113:80 check inter 2000 rise 3 fall 3 weight 30 server node2 192.168.200.114:80 check inter 2000 rise 3 fall 3 weight 30
4. 配置rsyslog
1 vim /etc/rsyslog.conf 2 $ModLoad imudp 3 $UDPServerRun 514 4 local3.* /var/log/haproxy.log 5 #重新启动rsyslog 6 systemctl restart rsyslog
5. 启动haproxy
haproxy -f /etc/haproxy/haproxy.cfg #查看端口 netstat -lnupt | grep haproxy tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 29996/haproxy udp 0 0 0.0.0.0:50181 0.0.0.0:* 29996/haproxy
三、安装配置keepalived
1. 安装keepalived
yum -y install keepalived
2. 配置keepalived文件
vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived vrrp_script chk_http_port { script "/etc/keepalived/check_haproxy.sh" interval 2 global_defs { router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER #备服务器要改为BACKUP interface eno16777728 virtual_router_id 51 priority 100 #备服务器优先级要降低 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_http_port } virtual_ipaddress { 192.168.200.254 } } }
准备脚本
vim /etc/keepalived/check_haproxy.sh #!/bin/bash num=`ps -C haproxy --no-header |wc -l` if [ $num -eq 0 ] then systemctl restart haproxy sleep 3 if [ `ps -C haproxy --no-header |wc -l` -eq 0 ] then systemctl stop keepalived fi fi #脚本执行权限 chmod +x /etc/keepalived/check_haproxy.sh
启动keepalived
systemctl restart keepalived #查看是否有VIP ip a | grep inet inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host inet 192.168.200.111/24 brd 192.168.200.255 scope global eno16777728 inet 192.168.200.254/32 scope global eno16777728 inet6 fe80::20c:29ff:feed:63fb/64 scope link
四、haproxy配置文件解析(及模板配置文件)
global #全局参数设置 log 127.0.0.1 local2 #指定使用127.0。0.1上的syslog服务中的local2日志设备,记录日志等级为info chroot /var/lib/haproxy #当前的haproxy的工作目录 pidfile /var/run/haproxy.pid #当前进程的pid号 maxconn 4000 #最大连接数4000 user haproxy #所属用户 group haproxy #所属组 daemon #以守护进程的方式运行haproxy stats socket /var/lib/haproxy/stats defaults mode http #默认模式为mode{tcp|http|health},tcp是4层,http是7层,health只会返回OK log global #应用全局日志配置 option httplog #启用日志记录http请求,默认是不支持http请求的日志 option dontlognull #启用该项,日志中将不会记录空连接。 option http-server-close #每次请求完毕后主动关闭http通道 option forwardfor except 127.0.0.0/8 #如果服务器上的应用程序想记录发起请求的客户端的IP地址 option redispatch # 当使用了cookie时,haproxy将会将其请求的后端服务器的serverID插入到
cookie中,以保证会话的SESSION持久性 retries 3 #访问后端服务器的失败次数,超过3此表示后端服务器为不可用 timeout http-request 10s #http请求超时时间 timeout queue 1m #一个请求在队列里的超时时间 timeout connect 10s #连接超时 timeout client 1m #客户端超时 timeout server 1m #服务器端超时 timeout http-keep-alive 10s #设置http-keep-alive的超时时间 timeout check 10s #检查超时 maxconn 3000 #每个进程的可用最大连接数 frontend main *:80 #这里建议使用bind *:80的方式,要不然做集群高可用的时候有问题,vip切换到其他机器就不能访问了监听地址为80 acl url_static path_beg -i /static /images /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js use_backend static if url_static default_backend my_webserver #定义一个名为my_app前端部分。此处将对于的请求转发给后端 backend static #使用了静态动态分离(如果url_path匹配 .jpg .gif .png .css .js静态文件则访问此后端) balance roundrobin #负载均衡算法(#banlance roundrobin 轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数) server static 127.0.0.1:80 check #静态文件部署在本机(也可以部署在其他机器或者squid缓存服务器) backend my_webserver #定义一个名为my_webserver后端部分。 balance roundrobin #负载均衡算法,支持static-rr,leastconn,first,uri等参数 server web01 172.31.2.33:80 check inter 2000 rise 2 fall 3 weight 30 #check inter 检测心跳频率 server web02 172.31.2.34:80 check inter 2000 rise 2 fall 3 weight 30 #rise 表示2次正确认为服务器可用 server web03 172.31.2.35:80 check inter 2000 rise 2 fall 3 weight 30 #fall 3次失败认为服务器不可用 errorfile 400 /etc/haproxy/errorpages/400badreq.http #代表如果是错误的话返回本地的一个页面 errorfile 403 /etc/haproxy/errorpages/403forbid.http errorfile 503 /etc/haproxy/errorpages/503sorry.http listen admin bind :9090 server web6c 192.168.137.111:9090 check stats enable #开启监听 stats uri /status #设置监听的url stats auth admin:123 #认证信息 stats auth qq:123 stats realm admin\ xxx #设置认证的默认提示 stats hide-version #隐藏版本 stats refresh 10s stats admin if TRUE #TRUE这个关键字表示只有经过认证成功后才能被管理
-----------------------------------------------
在用户请求不存在的页面时,返回一个页面文件给客户端而非由haproxy生成的错误代码;可用于所有段中。
code 指定对HTTP的哪些状态码返回指定的页面;这里可用的状态码有200、400、403、408、500、502、503和504;
file :指定用于响应的页面文件;
ACL
(1).4层常用检查标准
src <ip_addr>
src_port
dst <ip_addr>
dst_port
其中src、src_port、dst和dst_port就是检查标准creiterion,其后的值就是value。
例如:
acl accept_clients src 192.168.100.0/24
acl reject_clients src 172.16.0.0/16
tcp-request content accept if accept_clients
tcp-request content reject if reject_clients
tcp-request content reject # 此项表明不匹配前两项的默认都拒绝
(2).7层常用检查标准
hdr(HEADER):检查首部字段的值是否为指定的值,如hdr(Connection) -i close表示首部字段Connection的值是否为不区分大小写的close。hdr(Host) -i www.linuxidc.com表示首部字段Host的值是否为www.linuxidc.com,即请求的主机是否是指定的值。
•hdr_reg(HEADER):检查首部字段是否匹配指定的模式。如hdr_reg(Host) -i .*.linuxidc.com。
•http_first_req:当正处理的请求是第一个请求时返回true。
•method:请求的方法为指定的方法时返回方法对应的数值,也就表示true。例如"method GET"。
◦acl valid_method method GET
◦http-request deny if ! valid_method
•path:匹配uri的path部分,一般用来匹配精确的文件资源。例如path -i /a.png。
•path_beg:匹配path的前缀部分。
•path_end:匹配path的后缀部分。
•path_reg:使用正则表达式来匹配path。
•url:对整个url进行匹配。
•url_beg:对url的前缀进行匹配。
acl url_static path_beg /static /images /img /css /viedo /download # 定义静态检查标准
acl url_static path_end .gif .png .jpg .css .js .bmp # 定义静态检查标准
acl host_www path /index.html # 为主页专门定制acl
acl url_dynamic path_end .php .php5 # 定义动态检查标准
acl host_www hdr_beg(Host) -i www.linuxidc.com # 定位到主页
use_backend static if url_static #表示若满足url_static 则请求给static的所代表的后端服务器
use_backend dynamic if url_dynamic #同上
use_backend www if host_www #同上