haproxy 配置中分成五部分内容,分别如下:
global:参数是进程级的,通常是和操作系统相关。这些参数一般只设置一次,如果配置无误,就不需要再次进行修改;
defaults:配置默认参数,这些参数可以被用到frontend,backend,Listen组件;
frontend:接收请求的前端虚拟节点,Frontend可以更加规则直接指定具体使用后端的backend;
backend:后端服务集群的配置,是真实服务器,一个Backend对应一个或者多个实体服务器;
Listen Fronted和backend的组合体。
global # 全局参数的设置
# log语法:log <address_1>[max_level_1] # 全局的日志配置,使用log关键字,指定使用127.0.0.1上的syslog服务中的local0日志设备,记录日志等级为info的日志
log 127.0.0.1 local0 info
# 设置运行haproxy的用户和组,也可使用uid,gid关键字替代之
user haproxy
group haproxy
# 以守护进程的方式运行
daemon
#改变当前工作目录,可以提升 haproxy 的安全级别
chroot /usr/share/haproxy
# 设置haproxy启动时的进程数,用于守护进程模式的 haproxy;默认为止启动 1 个进程。该值的设置应该和服务器的CPU核心数一致,即常见的2颗8核心CPU的服务器,即共有16核心,则可以将其值设置为:<=16 ,创建多个进程数,可以减少每个进程的任务队列,但是过多的进程数也可能会导致进程的崩溃。
nbproc 1
# 定义每个haproxy进程的最大连接数 ,由于每个连接包括一个客户端和一个服务器端,所以单个进程的TCP会话最大数目将是该值的两倍。
maxconn 4096
# 设置最大打开的文件描述符数,该值会自动计算,所以不建议进行设置
#ulimit -n 65536
# 定义haproxy的pid
#pidfile /var/run/haproxy.pid
# 定义当前节点的名称,用于 HA 场景中多 haproxy 进程共享同一个 IP 地址时
node haproxy1
# 当前实例的描述信息
description haproxy1
defaults # 默认部分的定义
# mode语法:mode {http|tcp|health} 。http是七层模式,tcp是四层模式,health是健康检测,返回OK
# tcp: 实例运行于纯 tcp 模式,在客户端和服务器端之间将建立一个全双工的连接,且不会对 7 层报文做任何类型的检查,此为默认模式
# http:实例运行于 http 模式,客户端请求在转发至后端服务器之前将被深度分析,所有不与 RFC 模式兼容的请求都会被拒绝
# health:实例运行于 health 模式,其对入站请求仅响应"OK"信息并关闭连接,且不会记录任何日志信息 ,此模式将用于相应外部组件的监控状态检测请求
mode http
# 使用127.0.0.1上的syslog服务的local3设备记录错误信息
log 127.0.0.1 local3 err
# 定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端服务器标记为不可用
retries 3
# 启用日志记录HTTP请求,默认haproxy日志记录是不记录HTTP请求的,只记录"时间[Jan 5 13:23:46] 日志服务器[127.0.0.1] 实例名已经pid[haproxy[25218]] 信息[Proxy http_80_in stopped.]",日志格式很简单。
option httplog
# 当使用了cookie时,haproxy将会将其请求的后端服务器的serverID插入到cookie中,以保证会话的SESSION持久性;而此时,如果后端的服务器宕掉了,但是客户端的cookie是不会刷新的,如果设置此参数,将会将客户的请求强制定向到另外一个后端server上,以保证服务的正常。
option redispatch
# 当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
option abortonclose
# 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器或者监控系统为了探测该服务是否存活可用时,需要定期的连接或者获取某一固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来
option dontlognull
# 每处理完一个request时,haproxy都会去检查http头中的Connection的值,如果该值不是close,haproxy将会将其删除,如果该值为空将会添加为:Connection: close。使每个客户端和服务器端在完成一次传输后都会主动关闭TCP连接。与该参数类似的另外一个参数是"option forceclose",该参数的作用是强制关闭对外的服务通道,因为有的服务器端收到Connection: close时,也不会自动关闭TCP连接,如果客户端也不关闭,连接就会一直处于打开,直到超时。
#每次请求完毕后主动关闭http通道
#option http-server-close
option httpclose
# 前端的最大并发连接数(默认为 2000)
maxconn 2000
# 连接超时,设置成功连接到一台服务器的最长等待时间,默认单位是毫秒
timeout connect 5000ms
# 客户端超时 设置连接客户端发送数据时的成功连接最长等待时间,默认单位是毫秒
timeout client 50000ms
# 服务器超时 设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒
timeout server 50000ms
listen admin_status # 定义一个名为admin_status的部分,状态信息统计页面
# 定义监听的套接字
bind 0.0.0.0:1080
# 定义为HTTP模式
mode http
# 继承global中log的定义
log global
# stats是haproxy的一个统计页面的套接字,该参数设置统计页面的刷新间隔为30s
stats refresh 30s
# 设置统计页面的uri为/admin?stats
stats uri /admin?stats
# 设置统计页面认证时的提示内容
stats realm Private lands
# 设置统计页面认证的用户和密码,如果要设置多个,另起一行写入即可
stats auth admin:password
# 隐藏统计页面上的haproxy版本信息
stats hide-version
# 启用日志记录 HTTP 请求
option httplog
frontend http_80_in # 定义一个名为http_80_in的前端部分
# http_80_in定义前端部分监听的套接字
bind 0.0.0.0:80
# 定义为HTTP模式
mode http
# 继承global中log的定义
log global
# 启用X-Forwarded-For,在requests头部插入客户端IP发送给后端的server,使后端server获取到客户端的真实IP
option forwardfor
# 当请求是以这些结尾的交给url_static处理策略
acl url_static url_reg /*.(css|jpg|png|jpeg|js|gif)$
#或者path_end /*.(css|jpg|png|jpeg|js|gif)$
# 当请求的url末尾是以.jsp结尾的,交给jsp_web策略
acl jsp_web path_end .jsp
#如果url_static策略满足,交给static_server
use_backend static_server if url_static
use_backend jsp_server if jsp_web
#其他请求交给my_webserver
default_backend my_webserver
#jsp_server的后端部分
backend jsp_server
# 设置为http模式
mode http
# 负载均衡调度算法可用于"defaults"、"listen"和"backend"中,默认为轮询方式,有hash,roundrobin 轮询, source 保存session值,支持static-rr,leastconn,first,uri等参数
balance source
# 允许向cookie插入SERVERID,每台服务器的SERVERID可在下面使用cookie关键字定义
cookie SERVERID
# 开启对后端服务器的健康检测,通过GET /test/index.php来判断后端服务器的健康情况
option httpchk GET /test/index.php
#抵不过一后端server
server jsp_server_1 192.169.1.111:80 cookie 1 check inter 2000 rise 3 fall 3 weight 1
server jsp_server_2 192.169.1.112:80 cookie 2 check inter 2000 rise 3 fall 3 weight 1
# server语法:server <name> <address>[:[port]] [param*] 只能用于 listen 和 backend 区段。
# <name>为此服务器指定的内部名称,其将会出现在日志及警告信息中;后端服务器的IP地址,支持端口映射:[port];
# [param*]为此 server 设定的一系列参数,均为可选项,参数比较多,下面仅说明几个常用的参数:
# weight:权重,默认为 1,最大值为 256,0 表示不参与负载均衡
# backup:设定为备用服务器,仅在负载均衡场景中的其他 server 均不可以启用此server
# check:启动对此 server 执行监控状态检查
# inter:设定监控状态检查的时间间隔,单位为毫秒,默认为 2000,也可以使用 fastinter 和 downinter 来根据服务器端专题优化此事件延迟
# rise:设置 server 从离线状态转换至正常状态需要检查的次数(不设置的情况下,默认值为 2)
# fall:设置 server 从正常状态转换至离线状态需要检查的次数(不设置的情况下,默认值为 3)
# cookie:为指定 server 设定 cookie 值,此处指定的值将会在请求入站时被检查,第一次为此值挑选的 server 将会被后续的请求所选中,其目的在于实现持久连接的功能
# maxconn:指定此服务器接受的最大并发连接数,如果发往此服务器的连接数目高于此处指定的值,其将被放置于请求队列,以等待其他连接被释放
#定义static_server
backend static_server
mode http
server static_server_1 127.0.0.1:80 cookie 3 check inter 2000 rise 3 fall 3
#定义my_webserver,名字需要与frontend里面配置项default_backend 值相一致
backend my_webserver
# 负载均衡算法
balance roundrobin
server web01 192.169.1.33:80 check inter 2000 fall 3 weight 30 #定义的多个后端
server web02 192.169.1.34:80 check inter 2000 fall 3 weight 30 #定义的多个后端
server web03 192.169.1.35:80 check inter 2000 fall 3 weight 30 #定义的多个后端
注意:多节点部署时 node 、 description 的值要做相应调整