二、Haproxy的部署及配置文件说明
一、Haproxy在centos7上的部署
1、实验环境
System OS: CentOS Linux release 7.8.2003 (Core) 内核:3.10.0-1127.el7.x86_64
[root@node4 ~]# yum provides haproxy Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile haproxy-1.5.18-9.el7.x86_64 : TCP/HTTP proxy and load balancer for high availability environments Repo : base [root@node4 ~]# yum install -y haproxy #yum部署的haproxy版本为比较旧
#https://pkgs.org/download/haproxy #下载rpm包 #部署步骤 #准备工作 mkdir /app cd /app #Download latest cheese-release rpm from #http://www.nosuchhost.net/~cheese/fedora/packages/epel-7/x86_64/cheese-release.html wget http://www.nosuchhost.net/~cheese/fedora/packages/epel-7/x86_64/cheese-release-7-1.noarch.rpm #Install cheese-release rpm: rpm -Uvh cheese-release*rpm #查看可以安装的haproxy版本 [root@node4 ~]# yum provides haproxy Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile haproxy-1.5.15-1.el7.x86_64 : HAProxy reverse proxy for high availability environments Repo : cheese haproxy-1.5.18-9.el7.x86_64 : TCP/HTTP proxy and load balancer for high availability environments Repo : base haproxy-1.7.3-2.el7.x86_64 : HAProxy reverse proxy for high availability environments Repo : cheese haproxy-1.8.12-4.el7.x86_64 : HAProxy reverse proxy for high availability environments Repo : cheese haproxy-1.8.13-1.el7.x86_64 : HAProxy reverse proxy for high availability environments Repo : cheese haproxy-1.8.14-1.el7.x86_64 : HAProxy reverse proxy for high availability environments Repo : cheese haproxy-1.8.14-1.el7.x86_64 : HAProxy reverse proxy for high availability environments Repo : @cheese #Install haproxy rpm package: yum install -y haproxy-1.8.14-1.el7.x86_64 #查看安装的版本 [root@node4 ~]# haproxy -v HA-Proxy version 1.8.14-52e4d43 2018/09/20 Copyright 2000-2018 Willy Tarreau <willy@haproxy.org>
编译安装HAProxy 2.0 LTS版本,更多源码包下载地址:http://www.haproxy.org/download/
HAProxy 支持基于lua实现功能扩展,lua是一种小巧的脚本语言,于1993年由巴西里约热内卢天主教大学 (Pontifical Catholic University of Rio de Janeiro)里的一个研究小组开发,其设计目的是为了嵌入应用程序中, 从而为应用程序提供灵活的扩展和定制功能。 Lua 应用场景 1)游戏开发 2)独立应用脚本 3)Web 应用脚本 4)扩展和数据库插件,如MySQL Proxy 5)安全系统,如入侵检测系统
由于centos自带的lua版本比较低并不符合HAProxy要求的lua最低版本(5.3)的要求,因此需要编译安装较新版本的 lua环境,然后才能编译安装HAProxy
#lua的当前版本 [root@node4 app]# lua -v Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio #源码部署5.3.5lua mkdir /app cd /app yum install -y libtermcap-devel ncurses-devel libevent-devel readline-devel gcc gcc-c++ wget http://www.lua.org/ftp/lua-5.3.5.tar.gz tar xvf lua-5.3.5.tar.gz cd lua-5.3.5 make linux test #拷贝新版本的lua命令 mv /usr/bin/lua /usr/bin/lua.bak ln -s /app/lua-5.3.5/src/lua /usr/bin/lua [root@node4 lua-5.3.5]# ll /usr/bin/lua lrwxrwxrwx 1 root root 22 Jan 6 18:58 /usr/bin/lua -> /app/lua-5.3.5/src/lua [root@node4 ~]# lua -v Lua 5.3.5 Copyright (C) 1994-2018 Lua.org, PUC-Rio
#下载haproxy2.0.4,下载地址:http://www.haproxy.org/download mkdir /app cd /app wget http://www.haproxy.org/download/2.0/src/haproxy-2.0.4.tar.gz tar xvf haproxy-2.0.4.tar.gz #安装依赖包 yum install -y gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel net-tools vim iotop bc zip unzip zlib-devel lrzsz tree screen lsof tcpdump wget ntpdate #安装编译环境 #HAProxy 1.8及1.9版本编译参数: cd haproxy-1.8.4 make ARCH=x86_64 TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 PREFIX=/usr/local/haproxy #HAProxy 2.0编译参数: cd haproxy-2.0.4 make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 \ USE_SYSTEMD=1 USE_CPU_AFFINITY=1 USE_LUA=1 LUA_INC=/app/lua-5.3.5/src/ \ LUA_LIB=/app/lua-5.3.5/src/ PREFIX=/usr/local/haproxy make install PREFIX=/usr/local/haproxy cp haproxy /usr/sbin/ echo 'export PATH=/usr/local/haproxy/sbin:$PATH' > /etc/profile.d/haproxy.sh source /etc/profile
查看haproxy安装版本
[root@node4 haproxy-2.0.4]# haproxy -v HA-Proxy version 2.0.4 2019/08/06 - https://haproxy.org/
#启动用户 useradd -M -s /sbin/nologin haproxy [root@node4 ~]# id haproxy uid=1000(haproxy) gid=1000(haproxy) groups=1000(haproxy) #配置文件 mkdir /etc/haproxy cd /etc/haproxy cat >> harproxy.cfg <<EOF global maxconn 100000 chroot /usr/local/haproxy stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin #启动用户的uid和gid号,有2中配置方法 uid 99 gid 99 #user haproxy #group haproxy daemon #nbproc 4 #cpu-map 1 0 #cpu-map 2 1 #cpu-map 3 2 #cpu-map 4 3 pidfile /var/lib/haproxy/haproxy.pid log 127.0.0.1 local3 info defaults option http-keep-alive option forwardfor maxconn 100000 mode http timeout connect 300000ms timeout client 300000ms timeout server 300000ms listen stats mode http bind 0.0.0.0:9999 stats enable log global stats uri /haproxy-status stats auth haadmin:123456 listen web_port bind 192.168.7.101:80 mode http log global server web1 127.0.0.1:8080 check inter 3000 fall 2 rise 5 EOF
cat >> /usr/lib/systemd/system/haproxy.service <<EOF [Unit] Description=HAProxy Load Balancer After=syslog.target network.target [Service] ExecStartPre=/usr/sbin//haproxy -f /etc/haproxy/haproxy.cfg -c -q ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid ExecReload=/bin/kill -USR2 $MAINPID [Install] WantedBy=multi-user.target
mkdir /var/lib/haproxy chown haproy.haproxy /var/lib/haproxy/ -R systemctl start haproxy systemctl enable haproxy systemctl status haproxy
[root@node4 ~]# id haproxy uid=1000(haproxy) gid=1000(haproxy) groups=1000(haproxy) [root@node4 ~]# systemctl status haproxy ● haproxy.service - HAProxy Load Balancer Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; vendor preset: disabled) Active: active (running) since Wed 2021-01-06 19:58:33 CST; 1h 31min ago Process: 19093 ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q (code=exited, status=0/SUCCESS) Main PID: 19095 (haproxy) CGroup: /system.slice/haproxy.service ├─19095 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid └─19098 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid Jan 06 19:58:33 node4 systemd[1]: Starting HAProxy Load Balancer... Jan 06 19:58:33 node4 systemd[1]: Started HAProxy Load Balancer. Jan 06 19:58:33 node4 haproxy[19095]: [NOTICE] 005/195833 (19095) : New worker #1 (19098) forked Jan 06 19:58:33 node4 haproxy[19095]: [WARNING] 005/195833 (19098) : Server web_port/web1 is DOWN, reason: Layer4 connection problem, info: "Conn...in queue. Jan 06 19:58:33 node4 haproxy[19095]: [ALERT] 005/195833 (19098) : proxy 'web_port' has no server available! Hint: Some lines were ellipsized, use -l to show in full. [root@node4 ~]# ps -ef |grep haproxy root 19095 1 0 19:58 ? 00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid haproxy 19098 19095 0 19:58 ? 00:00:01 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid root 23640 1811 0 21:32 pts/0 00:00:00 grep --color=auto haproxy
HAPrpxy的配置文件haproxy.cfg由两大部分组成,分别是global和proxies部分。
global:全局配置段
进程及安全配置相关的参数
性能调整相关参数
Debug参数
proxies:代理配置段
defaults:为frontend, backend, listen提供默认配置
frontend:前端,相当于nginx中的server {}
backend:后端,相当于nginx中的upstream {}
listen:同时拥有前端和后端配置
官方文档
global #全局参数的设置 chroot /usr/local/haproxy #锁定运行目录 deamon #以守护进程运行 stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin #socket文件 #运行haproxy的用户身份 user haproxy group haproxy #uid 1000 #gid 1000 nbproc 2 #开启的haproxy进程数,与CPU保持一致 nbthread 1 #指定每个haproxy进程开启的线程数,默认为每个进程一个线程 #绑定haproxy 进程至指定CPU cpu-map 1 0 cpu-map 2 1 maxconn 4000 #每个haproxy进程的最大并发连接数 maxsslconn #每个haproxy进程ssl最大连接数,用于haproxy配置了证书的场景下 maxconnrate #每个进程每秒创建的最大连接数量 spread-checks 2 #后端server状态check随机提前或延迟百分比时间,建议2-5(20%-50%)之间 pidfile /var/lib/haproxy/haproxy.pid #指定pid文件路径 log 127.0.0.1 local3 info #定义全局的syslog服务器;最多可以定义两个 # log语法:log <address_1>[max_level_1] # 全局的日志配置,使用log关键字,指定使用127.0.0.1上的syslog服务中的local0日志设备,记录日志等级为info的日志
官方文档 https://cbonte.github.io/haproxy-dconv/2.0/configuration.html
defaults [<name>] #默认配置项,针对以下的frontend、backend和lsiten生效,可以多个name也可以没有 name frontend <name> #前端servername,类似于Nginx的一个虚拟主机 server。 backend <name> #后端服务器组,等于nginx的upstream listen <name> #将frontend和backend合并在一起配置 注意:name字段只能使用”-”、”_”、”.”、和”:”,并且严格区分大小写,例如:Web和web是完全不同的两组服务器。
defaults 配置参数:
option redispatch #当server Id对应的服务器挂掉后,强制定向到其他健康的服务器,重新派发 option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接,关闭 option http-keep-alive #开启与客户端的会话保持 option forwardfor #透传客户端真实IP至后端web服务器 mode http #设置默认工作类型 timeout http-keep-alive 120s #session 会话保持超时时间,范围内会转发到相同的后端服务器 timeout connect 120s #客户端请求从haproxy到后端server的最长连接等待时间(TCP之前) timeout server 600s #客户端请求从haproxy到后端服务端的请求处理超时时长(TCP之后) timeout client 600s #设置haproxy与客户端的最长非活动时间 timeout check 5s #对后端服务器的默认检测超时时间
frontend配置参数
bind:指定HAProxy的监听地址,可以是IPV4或IPV6,可以同时监听多个IP或端口,可同时用于listen字段中 bind [<address>]:<port_range> [, ...] [param*] listen http_proxy #监听http的多个IP的多个端口和sock文件 bind :80,:443,:8801-8810 bind 10.0.0.1:10080,10.0.0.1:10443 bind /var/run/ssl-frontend.sock user root mode 600 accept-proxy listen http_https_proxy #https监听 bind :80 bind :443 ssl crt /etc/haproxy/site.pem listen http_https_proxy_explicit #监听ipv6、ipv4和unix sock文件 bind ipv6@:80 bind ipv4@public_ssl:443 ssl crt /etc/haproxy/site.pem bind unix@ssl-frontend.sock user root mode 600 accept-proxy listen external_bind_app1 #监听file descriptor bind "fd@${FD_APP1}" 生产示例: frontend WEB_PORT bind :80,:8080 bind 192.168.7.102:10080,:8801-8810,192.168.7.101:9001-9010 mode http/tcp #指定负载协议类型 use_backend backend_name #调用的后端服务器组名称
定义一组后端服务器,backend服务器将被frontend进行调用
mode http/tcp #指定负载协议类型 option #配置选项 server #定义后端real server #注意:option后面加httpchk,smtpchk,mysql-check,pgsql-check,ssl-hello-chk方法,可用于实现更多应用层检测功能 check #对指定real进行健康状态检查,默认不开启 addr IP #可指定的健康状态监测IP port num #指定的健康状态监测端口 inter num #健康状态检查间隔时间,默认2000 ms fall num #后端服务器失效检查次数,默认为3 rise num #后端服务器从下线恢复检查次数,默认为2 weight #默认为1,最大值为256,0表示不参与负载均衡 backup #将后端服务器标记为备份状态 disabled #将后端服务器标记为不可用状态 redirect prefix http://www.magedu.net/ #将请求临时重定向至其它URL,只适用于http模式 maxconn <maxconn>:当前后端server的最大并发连接数 backlog <backlog>:当server的连接数达到上限后的后援队列长度
#官网业务访问入口 frontend WEB_PORT_80 bind 192.168.7.248:80 mode http use_backend web_prot_http_nodes #后端真实服务器 backend web_prot_http_nodes mode http option forwardfor server 192.168.7.101 192.168.7.101:8080 check inter 3000 fall 3 rise 5 server 192.168.7.102 192.168.7.102:8080 check inter 3000 fall 3 rise 5
使用listen替换frontend和backend的配置方式: #官网业务访问入口===================================== listen WEB_PORT_80 bind 192.168.7.102:80 mode http option forwardfor server web1 192.168.32.201:80 check inter 3000 fall 3 rise 5 server web2 192.168.32.202:80 check inter 3000 fall 3 rise 5
1、实验环境
System OS: CentOS Linux release 7.8.2003 (Core) 内核:3.10.0-1127.el7.x86_64 web01: node1 10.0.0.201 nginx web02: node2 10.0.0.202 nginx haproxy: node4 192.168.32.204 外网 node4 10.0.0.204 内网 客户机: node3 192.168.32.203
yum install -y nginx systemctl start nginx systemctl enable nginx web01 echo 'web01 10.0.0.201' > /usr/share/nginx/html/index.html web02 echo 'web02 10.0.0.202' > /usr/share/nginx/html/index.html [root@node4 ~]# curl 10.0.0.201 web01 10.0.0.201 [root@node4 ~]# curl 10.0.0.202 web02 10.0.0.202
3、haproxy部署
haproxy的安装部署见前文
haproxy.cfg文件配置
global maxconn 100000 chroot /usr/local/haproxy stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin #uid 1000 #gid 1000 user haproxy group haproxy daemon nbproc 2 cpu-map 1 0 cpu-map 2 1 pidfile /var/lib/haproxy/haproxy.pid log 127.0.0.1 local3 info defaults option http-keep-alive option forwardfor maxconn 100000 mode http timeout connect 300000ms timeout client 300000ms timeout server 300000ms listen stats mode http bind 192.168.32.204:9999 stats enable log global stats uri /haproxy-status stats auth haadmin:123456 listen web_port bind 192.168.32.204:80 mode http log global balance roundrobin server web01 10.0.0.201:80 check inter 3000 fall 2 rise 5 server web02 10.0.0.202:80 check inter 3000 fall 2 rise 5
在客户机上测试
[root@node3 ~]# curl 192.168.32.204 web01 10.0.0.201 [root@node3 ~]# curl 192.168.32.204 web01 10.0.0.201 [root@node3 ~]# curl 192.168.32.204 web02 10.0.0.202 [root@node3 ~]# curl 192.168.32.204 web02 10.0.0.202 #客户端访问
I have a dream so I study hard!!!