https://hub.docker.com/_/haproxy
https://github.com/haproxy/haproxy/releases
#run
docker run -d --net=host --name cdn --restart=always --privileged=true --user=root -e TZ='Asia/Shanghai' --ulimit nofile=262144:262144 -v /data/site/docker/env/nginx/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro -v /data/file:/data/file haproxy:latest haproxy -f /usr/local/etc/haproxy/haproxy.cfg
--net=host
--sysctl net.ipv4.ip_unprivileged_port_start=0
docker logs -f --tail="30" cdn
docker exec -it cdn /bin/bash
apt-get update -y;
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
apt-get install -y wget vim net-tools curl git cron zip unzip
apt-get dist-upgrade -y
apt-get upgrade -y
apt autoremove
apt clean
docker commit -m="update" -a="htmltoo.com" cdn hub.htmltoo.com:5000/http:cdn
docker push hub.htmltoo.com:5000/http:cdn
# nuster - CDN
https://abc.htmltoo.com/thread-44996.htm
#web管理
global log /data/file/logs/haproxy local0 log /data/file/logs/haproxy local1 notice maxconn 20480 #user haproxy #运行haproxy的用户 #group haproxy #运行haproxy的用户组 daemon # 设置为后台进程 ulimit-n 82000 # ulimit的数量限制 defaults log global #引入global定义的日志格式 mode tcp #所处理的类别(7层代理http,4层代理tcp) retries 3 #3次连接失败就认为服务器不可用,也可以通过后面设置 timeout connect 10s #连接超时 timeout client 1m #客户端超时 timeout server 1m #服务器超时 listen WEB-STATUS bind 0.0.0.0:8888 mode http #stats uri /haproxy?stats # 访问的uri:ip:8888/haproxy?stats stats uri / stats refresh 30s stats realm welcome login\ Haproxy #haproxy web管理用户名密码,自行设置 stats auth ihunter:wdq54321 stats hide-version stats admin if TRUE frontend mariadb:13306 bind *:13306 mode tcp timeout client 30000 # 客户端超时 default_backend mariadb backend mariadb mode tcp option redispatch # 当serverId对应的服务器挂掉后,强制定向到其他健康的服务器 option abortonclose # 当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接 balance roundrobin # 负载均衡算法, leastconn: 最小连接算法 server db1 b.htmltoo.com:3306 check weight 1 maxconn 2000 check inter 2000 rise 2 fall 3
---访问控制
-不允许172.25.66.250访问
acl blacklist src 172.25.14.250 ##重定向 redirect location http://172.25.14.1:8080/index.html if blacklist
-动静分离
frontend public
bind *:80 name clear
use_backend dynamic if { path_end -i *.php }
default_backend dynamic
# the application servers go here
backend dynamic
balance roundrobin
server dynsrv1 172.25.66.3:80 check inter 1000
backend static
balance roundrobin
server dynsrv2 172.25.66.4:80 check inter 1000-读写分离
frontend public bind *:80 name clear acl write method POST acl write method put use_backend dynamic if write default_backend static
-Haproxy配置Http转发,透传真实IP
mode http #模式改为http option forwardfor #开启forwardfor选项
#编译安装
cd /opt yum install gcc pcre-static pcre-devel -y wget https://github.com/haproxy/haproxy/archive/v2.2.0.tar.gz -O /opt/haproxy.tar.gz tar xzvf haproxy.tar.gz -C /opt/haproxy cd haproxy make TARGET=linux2628 make install mkdir -p /etc/haproxy mkdir -p /var/lib/haproxy touch /var/lib/haproxy/stats ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy cp /opt/haproxy/examples/haproxy.init /etc/init.d/haproxy chmod 777 /etc/init.d/haproxy systemctl daemon-reload useradd -r haproxy haproxy -v chkconfig haproxy on
#4层配置 haproxy.cfg
global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats timeout 30s user haproxy group haproxy daemon # turn on stats unix socket #stats socket /var/lib/haproxy/stats mode 600 level admin defaults log global mode http option httplog option dontlognull maxconn 256000 timeout connect 5000 timeout client 50000 timeout server 50000 listen admin_stat #haproxy的web管理端口 8888,自行设置 bind 0.0.0.0:8888 mode http stats refresh 30s #haproxy web管理url,自行设置 stats uri /haproxy_stats stats realm Haproxy\\ Statistics #haproxy web管理用户名密码,自行设置 stats auth admin:admin stats hide-version frontend http_front bind *:8098 # stats uri /haproxy?stats default_backend http_back backend http_back balance roundrobin option httpchk GET /ping server riakkv1 10.200.124.111:8098 check server riakkv2 10.200.124.112:8098 check server riakkv3 10.200.124.113:8098 check server riakkv4 10.200.124.114:8098 check server riakkv5 10.200.124.115:8098 check server riakkv6 10.200.124.116:8098 check server riakkv7 10.200.124.117:8098 check server riakkv8 10.200.124.118:8098 check server riakkv9 10.200.124.119:8098 check server riakkv10 10.200.124.120:8098 check frontend tcp_front bind *:8087 mode tcp option tcplog option contstats option tcpka default_backend tcp_back backend tcp_back balance leastconn mode tcp option tcpka option srvtcpka server riakkv1 10.200.124.111:8087 check server riakkv2 10.200.124.112:8087 check server riakkv3 10.200.124.113:8087 check server riakkv4 10.200.124.114:8087 check server riakkv5 10.200.124.115:8087 check server riakkv6 10.200.124.116:8087 check server riakkv7 10.200.124.117:8087 check server riakkv8 10.200.124.118:8087 check server riakkv9 10.200.124.119:8087 check server riakkv10 10.200.124.120:8087 check
#web管理加密(http://:8181)
listen stats bind *:8181 stats enable stats uri / stats realm Haproxy\\ Statistics stats auth username:password
#配置例子
frontend http_front bind *:80 stats uri /haproxy?stats acl url_blog path_beg /blog use_backend blog_back if url_blog default_backend http_back backend http_back balance roundrobin server <server name> <private IP>:80 check server <server name> <private IP>:80 check backend blog_back server <server name> <private IP>:80 check
#生产环境事例
global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy maxconn 600000 user haproxy group haproxy daemon # turn on stats unix socket #stats socket /var/lib/haproxy/stats mode 600 level admin defaults log global mode http option httplog option dontlognull maxconn 500000 timeout connect 5000 # timeout client 50000 # timeout server 50000 listen WEB-STATUS bind 0.0.0.0:18080 mode http # stats refresh 30s stats uri /haproxy?stats frontend rabbitmq5672-192.168.200.28:15672 bind *:5672 mode tcp option tcplog option contstats option tcpka default_backend rabbitmq-nodes backend rabbitmq-nodes balance leastconn mode tcp option tcpka option srvtcpka server mq1 192.168.200.29:5672 check server mq2 192.168.200.36:5672 check server mq3 192.168.200.43:5672 check frontend riak-kv-http8098 bind *:8098 default_backend riak-kv-http-nodes backend riak-kv-http-nodes balance static-rr option httpchk GET /ping server riakkvh1 192.168.200.18:8098 check server riakkvh2 192.168.200.19:8098 check server riakkvh3 192.168.200.16:8098 check server riakkvh4 192.168.200.12:8098 check server riakkvh5 192.168.200.21:8098 check frontend riak-kv-tcp8087 bind *:8087 mode tcp option tcplog option contstats option tcpka default_backend riak-kv-tcp-nodes backend riak-kv-tcp-nodes balance leastconn mode tcp option tcpka option srvtcpka server riakkvt1 192.168.200.18:8087 check server riakkvt2 192.168.200.19:8087 check server riakkvt3 192.168.200.16:8087 check server riakkvt4 192.168.200.12:8087 check server riakkvt5 192.168.200.21:8087 check #TCP 192.168.200.200:8080 wrr # -> 192.168.200.25:8080 Route 1 0 0 # -> 192.168.200.30:8080 Route 1 0 0 # -> 192.168.200.33:8080 Route 1 0 0 # -> 192.168.200.37:8080 Route 1 0 0 # -> 192.168.200.39:8080 Route 1 0 0
vi /etc/haproxy/haproxy.cfg
global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy maxconn 600000 user haproxy group haproxy daemon defaults log global mode http option httplog option dontlognull maxconn 500000 timeout connect 5000 listen WEB-STATUS bind 0.0.0.0:18080 mode http stats uri /haproxy?stats frontend riak-kv-http8098 bind *:8098 default_backend riak-kv-http-nodes backend riak-kv-http-nodes balance static-rr option httpchk GET /ping server riakkvh1 192.168.200.18:8098 check server riakkvh2 192.168.200.19:8098 check frontend riak-kv-tcp8087 bind *:8087 mode tcp option tcplog option contstats option tcpka default_backend riak-kv-tcp-nodes backend riak-kv-tcp-nodes balance leastconn mode tcp option tcpka option srvtcpka server riakkvt1 192.168.200.18:8087 check server riakkvt2 192.168.200.19:8087 check
#外网配置实例
global log 127.0.0.1 local0 chroot /var/lib/haproxy user nobody group nobody daemon defaults mode http log global option httplog option http-server-close option dontlognull option redispatch option contstats retries 3 backlog 10000 timeout client 25s timeout connect 5s timeout server 60s timeout tunnel 3600s timeout http-keep-alive 1s timeout http-request 15s timeout queue 30s timeout tarpit 60s default-server inter 3s rise 2 fall 3 listen bk_1883 bind *:1883 mode tcp balance roundrobin option tcplog server server1 10.200.77.41:1883 maxconn 10000 check inter 10s weight 1
#配置文件说明
vim /usr/local/haproxy/etc/haproxy.cfg
global log 127.0.0.1 local0 #log 127.0.0.1 local1 notice #log loghost local0 info maxconn 4096 chroot /usr/local/haproxy uid 99 #所属运行的用户uid gid 99 #所属运行的用户组 daemon #以后台形式运行haproxy nbproc 1 #启动1个haproxy实例。# #工作进程数量(CPU数量) ,实际工作中,应该设置成和CPU核心数一样。 这样可以发挥出最大的性能。 pidfile /usr/local/haproxy/run/haproxy.pid #将所有进程写入pid文件 #debug #调试错误时用 #quiet #安静 defaults log global log 127.0.0.1 local3 #日志文件的输出定向。产生的日志级别为local3. 系统中local1-7,用户自己定义 mode http #工作模式,所处理的类别,默认采用http模式,可配置成tcp作4层消息转发 option httplog #日志类别,记载http日志 option httpclose #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现 option dontlognull #不记录空连接,产生的日志 option forwardfor #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip option redispatch #当serverid对应的服务器挂掉后,强制定向到其他健康服务器 retries 2 #2次连接失败就认为服务器不可用,主要通过后面的check检查 maxconn 2000 #最大连接数 balance roundrobin #负载均衡算法 stats uri /haproxy-stats #haproxy 监控页面的访问地址 # 可通过 http://localhost:80/haproxy-stats 访问 timeout connect 5000 #连接超时时间。 单位:ms 毫秒 timeout client 50000 #客户端连接超时时间 timeout server 50000 #服务器端连接超时时间 mode http option httpchk GET /index.html #健康检测#注意实际工作中测试时,应该下载某一个页面来进行测试,因此这个页面应该是个小页面,而不要用首页面。这里是每隔一秒检查一次页面。 frontend http #前端配置,http名称可自定义 bind 0.0.0.0:80 #发起http请求80端口,会被转发到设置的ip及端口 default_backend http_back #转发到后端 写上后端名称 backend http_back #后端配置,名称上下关联 server s1 192.168.1.62:80 weight 3 check #后端的主机 IP &权衡 server s2 192.168.1.64:80 weight 3 check #后端的主机 IP &权衡 #server node1 192.168.179.131:8081 check inter 2000 rise 3 fall 3 weight 30 # inter 2000 健康检查时间间隔2秒 # rise 3 检测多少次才认为是正常的 # fall 3 失败多少次才认为是不可用的 # weight 30 权重
#关于负载均衡算法
#source 根据请求源IP #static-rr 根据权重 #leastconn 最少连接者先处理 #uri 根据请求的uri #url_param 根据请求的url参数 #rdp-cookie 据据cookie(name)来锁定并哈希每一次请求 #hdr(name) 根据HTTP请求头来锁定每一次HTTP请求 #roundrobin 轮询方式
#haproxy.cfg
global log 127.0.0.1 local0 info maxconn 4096 daemon nbproc 1 defaults mode http retries 3 timeout connect 5000 timeout client 50000 timeout server 50000 timeout check 5s frontend kubesphere30880-10.187.20.182:30880 bind *:30880 mode tcp log global default_backend kubesphere backend kubesphere balance leastconn mode tcp server k8s1 10.187.20.182:30880 check listen WEB-STATUS bind 0.0.0.0:18080 mode http stats refresh 30s stats uri /haproxy-status stats realm welcome login\ Haproxy #haproxy web管理用户名密码,自行设置 stats auth admin:admin stats hide-version stats admin if TRUE
---global配置段
global maxconn 20000 #设定每个haproxy进程可以接受的最大并发连接数 ulimit-n 16384 #设置最大打开的文件描述符数,在1.4的官方文档中提示,该值会自动计算,所以不建议进行设置 log 127.0.0.1 local0 #全局日志文件配置条目,local2表示日志设备,最多可定义两个 uid 200 gid 200 user haproxy #指定运行haproxy的用户和组 chroot /var/lib/haproxy #chroot 切换根目录,将haproxy都运行在/var/lib/haproxy 这样做是为了增加haproxy的安全 pidfile /var/run/haproxy.pid #指定haproxy的进程pid文件,启动进程的用户必须要有访问该文件的权限。 nbproc 2 #要启动的haproxy的进程数量 daemon #设置haproxy以后台运行的方式运行。
-Cannot chroot(/usr/local/sbin/haproxy) 异常, 要注释: chroot /var/lib/haproxy
#常用配置项
log: 全局日志文件配置条目,local2表示日志设备,最多可定义两个
nbproc:要启动的haproxy的进程数量
chroot: chroot 切换根目录,将haproxy都运行在/var/lib/haproxy 这样做是为了增加haproxy的安全。
pidfile:指定haproxy的进程pid文件,启动进程的用户必须要有访问该文件的权限。
maxconn:设定每个haproxy进程可以接受的最大并发连接数。
user和group:指定运行haproxy的用户和组
daemon: 设置haproxy以后台运行的方式运行。
maxconnrate:每个进程每秒最大处理的连接数量。
maxse***ate:每个进程每秒可以创建的最大会话速率。
maxsslconn:设定每个haproxy进程所能接受的ssl最大并发连接数。
---default配置段
defaults mode http #设置haproxy实例默认的运行模式,默认是http,支持tcp,http可选值 log global #继承全局日志 maxconn 20000 #最大连接数 option httplog # 启用日志记录HTTP请求,默认haproxy日志记录是不记录HTTP请求的,只记录“时间[Jan 5 13:23:46] 日志服务器[127.0.0.1] #实例名已经pid[haproxy[25218]] 信息[Proxy http_80_in stopped.]”,日志格式很简单。 option http-server-close #客户端与服务器端在完成一次连接请求之后,HAProxy会主动关闭该TCP连接,有助于提高性能。 option forwardfor except 127.0.0.0/8 #由于haprxoy工作在反向代理方向,因此后端的真实服务器可能无法获取真实的请求端ip,使用xforwardfor可以在报文中封装新的字段记录请求端ip,httpd的话要在默认日志格式中进行修改才可以记录。 option redispatch # 当使用了cookie时,haproxy将会将其请求的后端服务器的serverID插入到cookie中,以保证会话的SESSION持久性;而此时,如果后端的服务器宕掉了,但是客户端的cookie是不会刷新的, #如果设置此参数,将会将客户的请求强制定向到另外一个后端server上,以保证服务的正常。# option abortonclose # 当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接 option dontlognull # 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器或者监控系统为了探测该服务是否存活可用时,需要定期的连接或者获取某一固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接; #官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来# stats refresh 30 #统计页面刷新间隔 retries 3 #定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端服务器标记为不可用 balance roundrobin #默认的负载均衡的方式,这里为轮询方式,也可以是balance source timeout http-request 10s #http请求超时时间 timeout queue 1m #排队超时 timeout connect 10s # 设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,老版本haproxy使用contimeout替代 timeout client 1m #设置连接客户端发送数据时的成功连接最长等待时间,默认单位是毫秒,老版本haproxy使用clitimeout替代 timeout server 1m # 设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒,老版本haproxy使用srvtimeout替代 timeout http-keep-alive 10s timeout check 10s #心跳检测超时
#常用配置项
mode:设置haproxy实例默认的运行模式,默认是http,支持tcp,http可选值
tcp模式:在该模式之下,客户端会与服务器端建立一个全双工连接,不对七层报文做检查,常用语ssl,ssh,smtp等服务。
http模式:客户端在请求转发到后端服务器之前会被分析。
log global:继承全局日志
option dontlognull:保证HAProxy不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包。
option http-server-close:客户端与服务器端在完成一次连接请求之后,HAProxy会主动关闭该TCP连接,有助于提高性能。
xforwardfor:由于haprxoy工作在反向代理方向,因此后端的真实服务器可能无法获取真实的请求端ip,使用xforwardfor可以在报文中封装新的字段记录请求端ip,httpd的话要在默认日志格式中进行修改才可以记录。
redispatch:是否允许在session 失败后重新分配。
retries:设置连接后端服务器的失败重试次数,连接失败的次数如果超过这里设置的值,haproxy将会将对应的后端服务器设置为不可用状态。
timeout connect: 成功连接到一台服务器的最长等待时间,默认为毫秒,可以换用其他单位。
timeout client:连接客户端发送数据的最长等待时间,默认毫秒,可修改。
timeout server:服务器端回应客户端数据发送的最长等待时间,默认毫秒,可以修改。
timeout check:设置对后端服务器的检测超时时间,默认毫秒,可以修改
---配置文件
-前端
frontend web_server #定义前端名称,可自定义。
bind 0.0.0.0:80 #监听IP地址与端口
-后端
backend server_web #后端名称
mode http #http七层模式
balance roundrobin #负载均衡的方式
option ignore-persist {if | unless} <condition> #在某些条件下拒绝持续连接,适用于静态文件的负载均衡。
option independant-streams #启用双向超时处理,如socket的read和write
option log-health-checks #记录健康检查日志
option log—separate—errors #对非完全成功的连接改变日志记录等级
option logasap #传输大文件时可以提前记录日志
option mysql-check #mysql健康检查
option persist #强制将http请求发往已经down掉的server
option redispatch #是否允许重新分配在session失败后
option smtpchk #smtp检查
option httpchk #通过http协议进行健康检查
option socket-stats #允许对单个socket进行统计
option srvtcpka #是否允许向server发送 keepalive
option tcpka #是否允许向 server和 client发送 keepalive
option tcplog #允许记录tcp连接的状态和时间
option transparent #允许客户端透明代理
option httpchk GET /1b.html HTTP/1·0 #心跳检测的文件
tick-table type ip size 1024 #为当前后端配置粘性表;表存储条目类型为IP地址,允许存储1k大小的IP地址
stick on dst #定义一个请求模式dst,以将一个客户端同某个后端服务器关联起来
timeout server 90m #后端服务器最大等待时间,超过此时间则认为服务器不可用。
-进行多后端服务器定义
check inter 1500是检测心跳频率,
rise 3表示3次检查结果正确则认为服务器可用,
fall 3表示检测结果失败3次则认为服务器不可用,
weight代表服务器权重。
port 9200表示通过端口9200来进行基于 http的健康检查,
backup表示该服务器是备份服务器,只有在其他非 backup服务器均不可用的情况下负载均衡器才会使用该后端服务器,默认情况下使用第一个标记为 backup的后端服务器,
on-marked-down shutdown-sessions表示当该服务器被认为是 shutdown的时候,关闭全部与该服务器的请求连接。
server 192.168.51.78 192.168.151.78:80 check inter 1500 rise 3 fall 3 weight 1 port 9200 backup on-marked-down shutdown-sessions
server 192.168.51.79 192.168.151.79:80 check inter 1500 rise 3 fall 3 weight 1 port 9200 backup on-marked-down shutdown-sessions
server 192.168.51.80 192.168.151.80:80 check inter 1500 rise 3 fall 3 weight 1 port 9200 backup on-marked-down shutdown-sessions
https://www.cnblogs.com/zyd112/p/8888945.html
https://www.jianshu.com/p/641d4ea45a57