HAProxy源码编译安装以及配置文件详解
下载haproxy版本
wget https://mirrors.huaweicloud.com/haproxy/2.3/src/haproxy-2.3.2.tar.gz
安装环境
yum -y install 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
lua环境安装
yum -y install libevent-devel.x86_64 ncurses-devel.x86_64 readline-devel.x86_64 libtermcap-devel
http://www.lua.org/ftp/ tar -xvf lua-5.3.5.tar.gz cd lua-5.3.5/ make linux lua -v
安装haproxy
mkdir /usr/local/haproxy cd haproxy-2.3.2/ 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=/root/lua-5.3.5/src/ LUA_LIB=/root/lua-5.3.5/src/ PREFIX=/usr/local/haproxy make install PREFIX=/usr/local/haproxy ln -sv /usr/local/haproxy/sbin/haproxy /usr/sbin/ 创建工作目录 mkdir -p /var/lib/haproxy 创建配置文件 cat /etc/haproxy/haproxy.cfg global maxconn 100000 //最大连接数,注意系统文件描述符限制 chroot /usr/local/haproxy //锁定工作目录(安全) stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin //sock文件 uid 188 //指定用户uid gid 188 //指定用户gid daemon //以守护进程方式运行 nbproc 2 //开启多进程工作模式 pidfile /var/lib/haproxy/haproxy.pid log 127.0.0.1 local3 info //日志收集,最多设置2个 spread-checks 5 //后端server状态检测提前或延迟(百分比) defaults option http-keep-alive //开启与客户端会话保持 option forwardfor //透传客户端真实IP到后端服务器 option redispatch //当server id对应的服务器挂掉,强制定向到其他健康的服务器,重新派发 maxconn 100000 //单进程最大连接数 mode http //工作类型 timeout http-keep-alive 120s //session 会话保持时间,范围内会转发到相同的后端服务器 timeout connect 1000ms //客户请求从haproxy到后端server的最长连接等待时间 (TCP握手前) timeout client 600ms //客户请求从haproxy到后端server的请求处理超时时长(TCP握手后) timeout server 600ms //haproxy与客户端的最长非活动时间 timeout check 5s //对后端服务器的默认检测超时时间 listen stats mode http bind 0.0.0.0:9999 stats enable log global stats uri /haproxy-status stats auth haadmin:q1w2e3r4ys listen web_port bind 192.168.64.100:1006 mode http log global server web1 192.168.64.101:80 check inter 3000 fall 2 rise 5 //间隔3s,失败次数2次确认失败,探测连续成功次数为5次确认为成功,共耗时15s
单进程多线程模式
global maxconn 100000 chroot /usr/local/haproxy stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin uid 188 gid 188 daemon #nbproc 2 nbthread 4 cpu-map 1/1 0 cpu-map 1/2 1 cpu-map 1/3 2 cpu-map 1/4 3
编写启动脚本
[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/lib/haproxy/haproxy.pid ExecReload=/bin/kill -USR2 $MAINPID [Install] WantedBy=multi-user.target
测试启动脚本
systemctl daemon-reload
systemctl restart haproxy
systemctl enable haproxy
systemctl status haproxy
keepalived 服务器监听端口,服务器内核参数调优
]# sysctl -a |grep nonlocal net.ipv4.ip_nonlocal_bind = 1 //此参数表示是否允许服务绑定一个本机不存在的IP地址; 使用场景:有些服务需要依赖一个vip才能启动,但是此vip不在本机上,当vip飘移到本机上时才存在;但是服务又需要提前启动,例如haproxy,nginx等代理需要绑定vip时; 0:默认值,表示不允许服务绑定一个本机不存的地址 1:表示允许服务绑定一个本机不存在的地址
开启路由转发
修改/etc/sysctl.conf 配置文件 net.ipv4.ip_forward = 1 net.ipv4.ip_nonlocal_bind = 1
出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。这通常是路由器所要实现的功能
要让Linux系统具有路由转发功能,需要配置一个Linux的内核参数net.ipv4.ip_forward。这个参数指定了Linux系统当前对路由转发功能的支持情况;其值为0时表示禁止进行IP转发;如果是1,则说明IP转发功能已经打开。
控制系统是否开启对数据包源地址的校验
https://www.cnblogs.com/lipengxiang2009/p/7446388.html
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_timestamps = 0
在使用 iptables 做 nat 时,发现内网机器 ping 某个域名 ping 的通,而使用 curl 测试不通
原来是 net.ipv4.tcp_timestamps 设置了为 1 ,即启用时间戳
经过nat之后,如果前面相同的端口被使用过,且时间戳大于这个链接发出的syn中的时间戳,服务器上就会忽略掉这个syn,不返会syn-ack消息,表现为用户无法正常完成tcp3次握手,从而不能打开web页面。在业务闲时,如果用户nat的端口没有被使用过时,就可以正常打开;业务忙时,nat端口重复使用的频率高,很难分到没有被使用的端口,从而产生这种问题。
net.ipv4.tcp_tw_recycle导致的请求超时
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 1
当开启了tcp_tw_recycle选项后,当连接进入TIME_WAIT状态后,会记录对应远端主机最后到达分节的时间戳。如果同样的主机有新的分节到达,且时间戳小于之前记录的时间戳,即视为无效,相应的数据包会被丢弃; 一个公网IP(经过NAT)大量地去反问服务器,不同客户端的时间可能不一致,所以就会出现时间戳错乱的现象,于是后面的数据包就被丢弃了,具体的表现通常是是客户端明明发送的SYN,但服务端就是不响应ACK,还可以通过下面命令来确认数据包不断被丢弃的现象;
查看主机TCP连接数 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
修改sysctl.conf文件后需要执行指令sysctl -p后新的配置才会生效
[root@gitlab ~]# sysctl -p net.ipv4.ip_forward = 1 net.ipv4.ip_nonlocal_bind = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.tcp_timestamps = 0 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 0
越学越感到自己的无知