lua官网: https://www.lua.org/download.html
安装lua
[root@LB src]# wget http://www.lua.org/ftp/lua-5.4.3.tar.gz [root@LB src]# tar zxf lua-5.4.3.tar.gz [root@LB src]# cd lua-5.4.3 [root@LB lua-5.4.3]# make linux test
安装haproxy
[root@LB ~]# yum -y install make gcc pcre-devel bzip2-devel openssl-devel systemd-devel [root@LB ~]# useradd -r -M -s /sbin/nologin haproxy [root@LB ~]# wget https://www.haproxy.org/download/2.3/src/haproxy-2.3.10.tar.gz [root@LB ~]# tar -zxvf haproxy-2.3.10.tar.gz [root@LB ~]# cd haproxy-2.3.10 [root@LB haproxy-2.3.10]# make -j `nproc` TARGET=linux-glibc USE_OPENSSL=1 USE_ZLIB=1 USE_PCRE=1 USE_SYSTEMD=1 USE_LUA=1 LUA_INC=/usr/local/src/lua-5.4.3/src LUA_LIB=/usr/local/src/lua-5.4.3/src PREFIX=/usr/local/haproxy -------------------- TARGET=linux-glibc #通用linux内核 USE_PCRE=1 #PCRE支持正则表达式,用于用户请求的uri USE_OPENSSL=1 #https,证书 USE_ZLIB=1 #开启压缩 USE_SYSTEMD=1 #使用systemd启动haproxy主进程 USE_LUA=1 LUA_INC=/usr/local/src/lua-5.4.3/src LUA_LIB=/usr/local/src/lua-5.4.3/src #开启lua,及lua和lua库所在路径 PREFIX=/apps/haproxy #指定安装路径 -------------------- [root@LB haproxy-2.3.10]# make install PREFIX=/usr/local/haproxy [root@LB haproxy-2.3.10]# cd /usr/local/haproxy/ [root@LB haproxy]# cp sbin/haproxy /usr/sbin/
配置各个负载的内核参数
[root@LB haproxy]# echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf [root@LB haproxy]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf [root@LB haproxy]# sysctl -p net.ipv4.ip_nonlocal_bind = 1 net.ipv4.ip_forward = 1
基础配置文件
HAProxy的配置文件haproxy由global和proxies组成
global:全局配置段
进程及安全相关参数 性能调整相关参数 Debug参数
proxies: 代理配置段
defaults: 默认参数为frontend、backend、listen通过默认配置 frontend:前端 backend:后端 listen:同时拥有前端和后端的配置
global参数配置 官方文档: http://cbonte.github.io/haproxy-dconv/2.3/intro.html
chroot #锁定运行目录 deamon #守护进程运行 stats socket /var/lib/haproxy.sock mode 600 level admin #socket文件 user、group、uid、pid #以什么用户运行 nbproc #指定每个haproxy进程数,与cpu保持一致 nbthread #指定每个haproxy进程开启的线程数,默认每个进程一个线程 cpu-map 1 0 #绑定haproxy ,进程至指定cpu maxconn #最大连接数 maxsslconn #gaproxy进程ssl最大连接数,用于haproxy配置证书的场景 maxconnrate #每秒创建的最大连接数 spread-checks #后端server状态check随机提前或延迟百分比时间,建议2-5(20%-50%)之间 pidfile #指定pid文件路径 log 127.0.0.1 local2 info #定义全局的syslog服务器,最多两个 defaults参数配置 option redispatch #当sever ID对应的服务器挂掉后,强制定向到其他健康的服务器,重新排发 option abortonclose #当服务器负载很高的时候,自动结束掉当前列队处理比较久的连接,关闭 option http-keep-alive #透传客户端真实的IP至后端的web服务器 option forwardfor #设置默认的工作类型 timeout http-keep-alive 120s #session 会话保持超时时间,范围内会转发到后端相同的服务器 timeout connect 120s #客户端请求从haproxy到后端的最长连接等待时间(TCP之前) timeout server 600s #客户端请求从haproxy到后端服务端的请求处理超时时长(tcp之后) timeout client 600s #设置haproxy与客户端的最长非活动时间 timeout check 5s #对后端服务器的默认检测超时时间
defaults参数配置
option redispatch #当sever ID对应的服务器挂掉后,强制定向到其他健康的服务器,重新排发 option abortonclose #当服务器负载很高的时候,自动结束掉当前列队处理比较久的连接,关闭 option http-keep-alive #透传客户端真实的IP至后端的web服务器 option forwardfor #设置默认的工作类型 timeout http-keep-alive 120s #session 会话保持超时时间,范围内会转发到后端相同的服务器 timeout connect 120s #客户端请求从haproxy到后端的最长连接等待时间(TCP之前) timeout server 600s #客户端请求从haproxy到后端服务端的请求处理超时时长(tcp之后) timeout client 600s #设置haproxy与客户端的最长非活动时间 timeout check 5s #对后端服务器的默认检测超时时间
frontend参数
bind: 指定HAProxy的监听地址,可以是ipv或ipv6,可以同时监听多个IP或端口,可以同时用于listen字段中 bind [address]:<port_range> [,...] [param*] listen http_proxy #监听http的多个IP的多个端口和sock文件 bind :80,:443:8810-8819 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 linten external_bind_app1 #监听file descriptor bind "fd@${FD_API}" 示例: frontend web_port bind :80,:8080 bind 192.168.248.100:10080.8801-8810,192.168.248.102:9001-9005 mode http/tcp #指定负载协议类型 use_backend backend_name #调用后端服务器组名称
backend配置
定义一组后端服务器,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 #检测间隔时间,默认2s fall num #后端服务器失效检查次数,默认3 rise num #后端服务器从下线户恢复查次数,默认2 weight #默认1,最大值256,0表示不参与负载均衡 backup #将后端服务器标记为备份状态 disabled #将后端服务器标记为不能用状态 redirect prefix http://www.magedy.net/ #将请求临时重定向到其他URL,值适用于http模式 maxconn <maxconn>:当前后端server的最大并发连接数,一般不设置 backlog <backlog>:当server的连接数到上线后的后援列队长度
测试环境,防火墙、selinux关闭
环境 | IP | 服务 |
centos8 LB | 192.168.248.200 | haproxy |
centos8 RS1 | 192.168.248.201 | httpd |
centos8 RS2 | 192.168.248.202 | httpd |
RS安装httpd
[root@RS1 ~]# yum -y install httpd [root@RS1 ~]# echo apacheRS1 > /var/www/html/index.html [root@RS2 ~]# yum -y install httpd [root@RS2 ~]# echo apacheRS2 > /var/www/html/index.html
haproxy生成配置文,frontend+backend
[root@LB ~]# mkdir /etc/haproxy [root@LB ~]# vim /etc/haproxy/haproxy.cfg #--------------全局配置---------------- global log 127.0.0.1 local2 info #log loghost local2 info maxconn 20480 chroot /usr/local/haproxy pidfile /var/run/haproxy.pid stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin #maxconn 4000 user haproxy group haproxy daemon nbproc 1 nbthread 4 #cpu-map 1 0 #cpu-map 2 1 spread-checks 5 #--------------------------------------------------------------------- #common defaults that all the 'listen' and 'backend' sections will #use if not designated in their block #--------------------------------------------------------------------- defaults mode http log global option dontlognull option httpclose option httplog option http-keep-alive #option forwardfor option redispatch balance roundrobin timeout connect 60s timeout client 30s timeout server 30s timeout check 10s maxconn 60000 retries 3 #-------------------状态页面---------------- listen stats mode http bind 0.0.0.0:9999 stats enable log global stats uri /haproxy-status stats auth admin:admin #----------------前端入口----------------- frontend web_prot bind 192.168.248.200:80 mode http use_backend test #redirect prefix http://www.itwangqing.net.cn #---------------后端服务------------------ backend test mode http option forwardfor server apacheRS1 192.168.248.201:80 maxconn 5 check addr 192.168.248.201 port 80 inter 2s fall 3 rise 5 server apacheRS2 192.168.248.202:80 maxconn 5 check addr 192.168.248.202 port 80 inter 2s fall 3 rise 5
检测配置文件并启动服务
[root@LB ~]# haproxy -f /etc/haproxy/haproxy.cf -c Configuration file is valid [root@LB ~]# haproxy -f /etc/haproxy/haproxy.cf #测试访问 [root@LB ~]# for i in `seq 6`;do curl 192.168.248.200;done apacheRS1 apacheRS2 apacheRS1 apacheRS2 apacheRS1 apacheRS2
网页上查看haproxy状态,用户密码admin:admin
使用listen替代fronted+backend
--------------全局配置---------------- global log 127.0.0.1 local2 info #log loghost local2 info maxconn 20480 chroot /usr/local/haproxy pidfile /var/run/haproxy.pid stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin #maxconn 4000 user haproxy group haproxy daemon nbproc 1 nbthread 4 #cpu-map 1 0 #cpu-map 2 1 spread-checks 5 #-------------------默认配置------------------- defaults mode http log global option dontlognull option httpclose option httplog option http-keep-alive #option forwardfor option redispatch balance roundrobin timeout connect 60s timeout client 30s timeout server 30s timeout check 10s maxconn 60000 retries 3 #---------------状态页面--------------------- listen stats mode http bind 0.0.0.0:9999 stats enable log global stats uri /haproxy-status stats auth admin:admin #--------------web设置-------------------------- listen test bind 192.168.248.200:80 server apacheRS1 192.168.248.201:80 check inter 2s fall 3 rise 5 server apacheRS2 192.168.248.202:80 check inter 2s fall 3 rise 5
重启服务
[root@LB ~]# pkill -9 haproxy [root@LB ~]# haproxy -f /etc/haproxy/haproxy.cfg
网页上查看haproxy状态
haproxy.service文件编写
[root@LB haproxy]# cat > /usr/lib/systemd/system/haproxy.service <<EOF > [Unit] > Description=HAProxy Load Balancer > After=syslog.target network.target > > [Service] > ExecStartPre=/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q > ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid > ExecReload=/bin/kill -USR2 $MAINPID > > [Install] > WantedBy=multi-user.target > EOF [root@LB ~]# systemctl daemon-reload
基于https访问
[root@RS1 ~]# yum -y install mod_ssl [root@RS1 ~]# systemctl start httpd [root@RS2 ~]# yum -y install mod_ssl [root@RS2 ~]# systemctl start httpd
修改haproxy配置文件
# option httplog 需要注释 listen https bind 192.168.248.200:443 log global mode tcp server httpsRS1 192.168.248.201:443 check inter 2s fall 3 rise 5 server httpsRS2 192.168.248.202:443 check inter 2s fall 3 rise 5
测试访问
[root@LB ~]# for i in `seq 6` ;do curl -k https://192.168.248.200;done apacheRS1 apacheRS2 apacheRS1 apacheRS2 apacheRS1 apacheRS2