## haproxy.conf
# 全局参数的设置
global
# log 语法:log <address> [max_level]
# 全局的日志配置,使用 log 关键字,指定使用 127.0.0.1 上的 syslog 服务中的 local0 日志设备,记录日志等级为 info
log 127.0.0.1 local0 info
# 设置运行 haproxy 的用户和组,也可使用 uid,gid 关键字替代之
user haproxy
group haproxy
# 以守护进程的方式运行
daemon
# 设置 haproxy 启动时的进程数
# 将其理解为:该值的设置应该和服务器的 CPU 核心数一致,即常见的 2 颗 8 核心 CPU 的服务器,即共有 16 核心,则可以将其值设置为:<=16
# 创建多个进程数,可以减少每个进程的任务队列,但是过多的进程数也可能会导致进程的崩溃
nbproc 16
# 定义每个 haproxy 进程的最大连接数 ,由于每个连接包括一个客户端和一个服务器端,所以单个进程的 TCP 会话最大数目将是该值的两倍。
maxconn 4096
# 设置最大打开的文件描述符数,在 1.4 的官方文档中提示,该值会自动计算,所以不建议进行设置
#ulimit -n 65536
# 定义 haproxy 的 pid 存放位置
pidfile /var/run/haproxy.pid
# 默认部分的定义
defaults
# mode 语法:mode {http|tcp|health} 。
# http 是七层模式,tcp 是四层模式,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 连接,如果客户端也不关闭,连接就会一直处于打开,直到超时。
option httpclose
# 设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,新版本的 haproxy 使用 timeout connect 替代,该参数向后兼容
contimeout 5000
# 设置连接客户端发送数据时的成功连接最长等待时间,默认单位是毫秒,新版 本haproxy 使用 timeout client 替代。该参数向后兼容
clitimeout 3000
# 设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒,新版本 haproxy 使用 timeout server 替代。该参数向后兼容
srvtimeout 3000
# 定义一个名为 status 的部分
listen status
bind 0.0.0.0:1080
# 定义监听的套接字
mode http
# 定义为 HTTP 模式
log global
# 继承 global 中 log 的定义
stats refresh 30s
# stats 是 haproxy 的一个统计页面的套接字,该参数设置统计页面的刷新间隔为 30s
stats uri /admin?stats
# 设置统计页面的 uri 为 /admin?stats
stats realm Private lands
# 设置统计页面认证时的提示内容
stats auth admin:password
# 设置统计页面认证的用户和密码,如果要设置多个,另起一行写入即可
stats hide-version
# 隐藏统计页面上的 haproxy 版本信息
# 定义一个名为 http_80_in 的前端部分
frontend http_80_in
bind 0.0.0.0:80
# http_80_in 定义前端部分监听的套接字
mode http
# 定义为 HTTP 模式
log global
# 继承 global 中 log 的定义
option forwardfor
# 启用 X-Forwarded-For,在 requests 头部插入客户端 IP 发送给后端的 server,使后端 server 获取到客户端的真实 IP
acl static_down nbsrv(static_server) lt 1
# 定义一个名叫 static_down 的 acl,当 backend static_sever 中存活机器数小于1时会被匹配到
acl php_web url_reg /*.php$
#acl php_web path_end .php
# 定义一个名叫php_web的 acl,当请求的 url 末尾是以 .php 结尾的,将会被匹配到,上面两种写法任选其一
acl static_web url_reg /*.(css|jpg|png|jpeg|js|gif)$
#acl static_web path_end .gif .png .jpg .css .js .jpeg
# 定义一个名叫 static_web 的 acl,当请求的url 末尾是以 .css、.jpg、.png、.jpeg、.js、.gif 结尾的,将会被匹配到,上面两种写法任选其一
use_backend php_server if static_down
# 如果满足策略 static_down 时,就将请求交予 backend php_server
use_backend php_server if php_web
# 如果满足策略 php_web 时,就将请求交予 backend php_server
use_backend static_server if static_web
# 如果满足策略 static_web 时,就将请求交予 backend static_server
# 定义一个名为 php_server 的后端部分
backend php_server
mode http
# 设置为http 模式
balance source
# 设置 haproxy 的调度算法为源地址 hash
cookie SERVERID
# 允许向 cookie 插入 SERVERID,每台服务器的 SERVERID 可在下面使用 cookie 关键字定义
option httpchk GET /test/index.php
# 开启对后端服务器的健康检测,通过 GET /test/index.php 来判断后端服务器的健康情况
server php_server_1 10.12.25.68:80 cookie 1 check inter 2000 rise 3 fall 3 weight 2
server php_server_2 10.12.25.72:80 cookie 2 check inter 2000 rise 3 fall 3 weight 1
server php_server_bak 10.12.25.79:80 cookie 3 check inter 1500 rise 3 fall 3 backup
# server 语法:server [:port] [param*]
# 使用server关键字来设置后端服务器;为后端服务器所设置的内部名称[php_server_1],该名称将会呈现在日志或警报中、后端服务器的IP地址,支持端口映射[10.12.25.68:80]、指定该服务器的SERVERID为1[cookie 1]、接受健康监测[check]、监测的间隔时长,单位毫秒[inter 2000]、监测正常多少次后被认为后端服务器是可用的[rise 3]、监测失败多少次后被认为后端服务器是不可用的[fall 3]、分发的权重[weight 2]、最后为备份用的后端服务器,当正常的服务器全部都宕机后,才会启用备份服务器[backup]
backend static_server
mode http
option httpchk GET /test/index.html
server static_server_1 10.12.25.83:80 cookie 3 check inter 2000 rise 3 fall 3