运行环境:centos7.4 +haproxy
1.安装:
#yum -y install haproxy
2.文件列表:
/etc/haproxy
/etc/haproxy/haproxy.cfg --haproxy的配置文件
/etc/logrotate.d/haproxy
/etc/sysconfig/haproxy
/usr/bin/halog
/usr/bin/iprange
/usr/lib/systemd/system/haproxy.service --haproxy的服务启动脚本
/usr/sbin/haproxy
/usr/sbin/haproxy-systemd-wrapper
...
/usr/share/haproxy
/usr/share/haproxy/400.http --以下为HTTP访问的错误状态码页面
/usr/share/haproxy/403.http
/usr/share/haproxy/408.http
/usr/share/haproxy/500.http
/usr/share/haproxy/502.http
/usr/share/haproxy/503.http
/usr/share/haproxy/504.http
/usr/share/haproxy/README
/usr/share/man/man1/halog.1.gz --可以直接使用man halog查看命令的使用语法
/usr/share/man/man1/haproxy.1.gz --使用man haproxy查看命令的使用语法
3.haproxy的启动和关闭:
# systemctl start haproxy
# systemctl status haproxy
● haproxy.service - HAProxy Load Balancer
Loaded: loaded (/usr/lib/systemd/system/haproxy.service; disabled; vendor preset: disabled)
Active: active (running) since Tue 2018-09-04 15:06:11 CST; 6s ago
Main PID: 508502 (haproxy-systemd)
Memory: 2.0M
CGroup: /system.slice/haproxy.service
├─508502 /usr/sbin/haproxy-systemd-wrapper -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
├─508503 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
└─508504 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
Sep 04 15:06:11 k8s-ceph-node-189-221 systemd[1]: Started HAProxy Load Balancer.
Sep 04 15:06:11 k8s-ceph-node-189-221 systemd[1]: Starting HAProxy Load Balancer...
Sep 04 15:06:11 k8s-ceph-node-189-221 haproxy-systemd-wrapper[508502]: haproxy-systemd-wrapper: executing /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/ha....pid -DsHint: Some lines were ellipsized, use -l to show in full.
--启动的脚本:
# cat /usr/lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
EnvironmentFile=/etc/sysconfig/haproxy
ExecStart=/usr/sbin/haproxy-systemd-wrapper -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid $OPTIONS
ExecReload=/bin/kill -USR2 $MAINPID
KillMode=mixed
[Install]
WantedBy=multi-user.target
4.版本查询:
# haproxy -v
HA-Proxy version 1.5.18 2016/05/10
Copyright 2000-2016 Willy Tarreau
5.常用的参数配置:
有关haproxy配置文件我们先简单介绍,如下:
global配置段,用于设定全局配置参数。
代理配置段中,主要是使用defaults、frontend、backend、listen关键词。
defaults配置段用于为所有其它配置段提供默认参数,这配置默认配置参数可由下一个“defaults”所重新设定。
frontend配置段用于定义一系列监听的套接字,这些套接字可接受客户端请求并与之建立连接。
backend配置段用于定义一系列“后端”服务器,代理将会将对应客户端的请求转发至这些服务器。
listen配置段通过关联“前端”和“后端”定义了一个完整的代理,通常只对TCP流量有用。
所有代理的名称只能使用大写字母、小写字母、数字、-(中线)、_(下划线)、.(点号)和:(冒号)。此外,ACL名称会区分字母大小写。
默认的配置模板:
# grep -vE "^#|^$" /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
frontend main *:5000
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 app
backend static
balance roundrobin
server static 127.0.0.1:4331 check
backend app
balance roundrobin
server app1 127.0.0.1:5001 check
server app2 127.0.0.1:5002 check
server app3 127.0.0.1:5003 check
server app4 127.0.0.1:5004 check
最重要的参数:
nbproc 和 maxconn 参数。 maxconn 设置 HAProxy 允许提供的最大 TCP 连接数(单向)。
nbproc :指定启动的haproxy进程的个数,只能用于守护进程模式的haproxy;默认只启动一个进程,鉴于调试困难等多方面的原因,一般只在单进程仅能打开少数文件描述符的场景中才使用多进程模式;
4. 配置详解:
global
log 127.0.0.1 local2
chroot /var/haproxy #chroot运行的路径,增加安全性
uid 99 #程序运行的用户id
gid 99 #程序运行的用户组id
daemon #以后台形式运行haproxy
nbproc 1 #number of process进程数量,不建议修改
pidfile /var/run/haproxy.pid #haproxy的pid存放路径
maxconn 4000 #默认最大连接数
defaults
mode http #工作模式
option dontlognull
log global #记录日志
option http-server-close #启用服务器端关闭
option forwardfor except 127.0.0.0/8 #传递客户端ip
option redispatch #当服务器组中的某台设备故障后,自动将请求重定向到组内其他主机。
retries 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 #同时处理的最大连接数
#errorfile 403 /etc/haproxy/errorfiles/403.http
#errorfile 500 /etc/haproxy/errorfiles/500.http
#errorfile 502 /etc/haproxy/errorfiles/502.http
#errorfile 503 /etc/haproxy/errorfiles/503.http
#errorfile 504 /etc/haproxy/errorfiles/504.http
#启用stats查看,认证等功能:
#默认在/haproxy?stats
listen stas #自定义监听名,任意取
bind 192.168.1.97:1080 #监听的地址和端口,默认端口1080
mode http #模式
stats enable #启用状态监控
stats hide-version #隐藏软件版本号
stats auth admin:admin #登陆用户名和密码
stats realm HAproxy\ stats #提示信息,空格之前加\
stats admin if TRUE #当通过认证才可管理
stats uri /stats #访问路径,在域名后面添加/stats可以查看haproxy监控状态,默认为/haproxy?stats
stats refresh 5 #页面自动刷新间隔,每隔5s刷新
#Haproxy 负载均衡实例:
frontend webserver
bind 192.168.1.97:80
default_backend webservers
backend webservers
balance roundrobin
server web1 192.168.1.100:80 check
server web2 192.168.1.101:80 check
#或者
#listen webservers
# bind 192.168.1.97:80
# server web1 192.168.1.100:80 check
# server web2 192.168.1.101:80 check
6.haproxy常用功能介绍:
haproxy支持的功能:
1.域名跳转 如将a.example.com 跳转到x.example.com
2.IP地址跳转
客户端访问http://192.168.1.171时,要把请求分发到192.168.1.174:80、192.168.1.178:80这两台服务器上。同时还要求客户端每一次访问,都跳转到不同的服务器上。
3.端口跳转
客户端访问http://a.test.com:8090和http://b.test.com:8090这两个地址时,要把请求分发到192.168.1.174:8090、192.168.1.178:8090,这两台服务器上。
4.默认跳转
如果客户端访问的不是dg.test.com与192.168.1.171,这两个地址的话,要把请求全部分发到192.168.1.178:8080上。
5.多ACL匹配
如果客户端的IP是192.168.1.140,同时访问的是http://192.168.1.171时,要把请求分发到www.example.com上。
--ACL用法示例:
dst
dst_port
src
src_port
e.g.
#用法一、允许10.0.0.0/24的用户访问,其他用户将禁止
acl goodguys src 10.0.0.0/24
tcp-request content accept if goodguys
tcp-request content reject
tcp-request content accept [{if | unless} ]
Accept a connection if/unless a content inspection condition is matched
#用法二、将源IP为172.16.254.52的用户禁止、将403的错误重定向到其他服务器;
acl badguy src 172.16.254.52
block if badguy
errorloc 403 http://www.afwing.com/
#用法三、当用户访问172.16.1.100时,重定向到http://www.afwing.com
acl dstipaddr hdr(Host) 172.16.1.100
redirect location http://www.afwing.com if dstipaddr
#用法四、读写分离:
acl read method GET
acl read method HEAD
acl write method PUT
acl write method POST
use_backend imgservers if read
use_backend uploadservers if write
#用法五、限制某个IP访问的路径(文件)
acl badguy src 172.16.254.52
acl denyfile path /index.html
http-request deny if denyfile badguy
#用法六、动静分离
acl url_static path_beg -i /static /images /Javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js
#或者
acl url_static path_end -i .jpg$ .gif$ .png$ .css$ .js$
#或者
acl url_static hdr_beg(host) -i www
acl url_static hdr_beg(host) -i news. video. download. ftp.
use_backend static if url_static
default_backend app
backend static
balance roundrobin
server static 192.168.10.1:80 check maxconn 6000
server static 192.168.10.2:80 check maxconn 6000
backend app
balance roundrobin
server app1 192.168.10.3:80 check maxconn 1000
server app2 192.168.10.4:80 check maxconn 1000
#Additional examples
acl invalid_src src 0.0.0.0/7 224.0.0.0/3
acl invalid_src src_port 0:1023
acl local_dst hdr(host) -i localhost
Move the login URL>server和default-server options:
6.动静分离
#Haproxy 负载均衡实例:
frontend webserver
bind 192.168.1.97:80
default_backend webservers
log global
log 127.0.0.1:514 local2 info
option httplog
##################将源IP为192.168.1.13的用户禁止、将403的错误重定向到其他服务器;
#acl badguy src 192.168.1.13
#http-request deny if badguy
#errorloc 403 http://www.baidu.com
#################
# 限制某个IP访问的路径(文件)
# acl badguy src 192.168.1.13
# acl denyfile path /1.html
# http-request deny if badguy denyfile
###############
#当用户访问192.168.1.97时,重定向到http://www.baidu.com
#acl dstipaddr hdr(Host) 192.168.1.97
#redirect location http://www.baidu.com if dstipaddr
########################
#动静分离
#acl static path_end -i .html .jpg .png.jpeg .gif .swf .css .xml .txt .pdf
# use_backend jingtai if static
#default_backend dongtai
#backend jingtai
# server web1 192.168.1.100:80 check
#backend dongtai
# server web2 192.168.1.101:80 check
backend webservers
balance roundrobin
server web1 192.168.1.100:80 check
server web2 192.168.1.101:80 check
#或者
#listen webservers
# bind 192.168.1.97:80
# server web1 192.168.1.100:80 check
# server web2 192.168.1.101:80 check
7.负载均衡:
frontend mysql
bind *:3306
mode tcp
log global
default_backend mysqlservers
backend mysqlservers
balance leastconn
server dbsrv1 192.168.1.111:3306 check port 3306 inter 2 rise 1 fall 2 maxconn 300
server dbsrv2 192.168.1.112:3306 check port 3306 inter 2 rise 1 fall 2 maxconn 300
参考文档:
http://cbonte.github.io/haproxy-dconv
社区网站:
www.haproxy.org
商业化网站:
https://www.haproxy.com