haproxy 配置文件说明

全局配置信息

#######参数是进程级的,通常和操作系统(OS)相关#########

global

       maxconn 20480 #默认最大连接数

       log 127.0.0.1 local3 #[err warning info debug]

       chroot /var/haproxy #chroot运行的路径

       uid 99 #所属运行的用户uid

       gid 99 #所属运行的用户组

       daemon #以后台形式运行haproxy

       nbproc 1 #进程数量(可以设置多个进程提高性能)

       pidfile /var/run/haproxy.pid #haproxy的pid存放路径,启动进程的用户必须有权限访问此文件

       ulimit-n 65535 #ulimit的数量限制

#####################默认的全局设置######################

##这些参数可以被利用配置到frontend,backend,listen组件##

defaults

       log global

       mode http #所处理的类别 (#7层 http;4层tcp )

       maxconn 20480 #最大连接数

       option httplog #日志类别http日志格式

       option httpclose #每次请求完毕后主动关闭http通道

       option dontlognull #不记录健康检查的日志信息

       option forwardfor #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip

       option redispatch #serverId对应的服务器挂掉后,强制定向到其他健康的服务器

       option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接

       stats refresh 30 #统计页面刷新间隔

       retries 3 #3次连接失败就认为服务不可用,也可以通过后面设置

       balance roundrobin #默认的负载均衡的方式,轮询方式

      #balance source #默认的负载均衡的方式,类似nginx的ip_hash

      #balance leastconn #默认的负载均衡的方式,最小连接

       contimeout 5000 #连接超时

       clitimeout 50000 #客户端超时

       srvtimeout 50000 #服务器超时

       timeout check 2000 #心跳检测超时

####################监控页面的设置#######################

listen admin_status #Frontend和Backend的组合体,监控组的名称,按需自定义名称

        bind 0.0.0.0:65532 #监听端口

        mode http #http的7层模式

        log 127.0.0.1 local3 err #错误日志记录

        stats refresh 5s #每隔5秒自动刷新监控页面

        stats uri /admin?stats #监控页面的url

        stats realm itnihao\ itnihao #监控页面的提示信息

        stats auth admin:admin #监控页面的用户和密码admin,可以设置多个用户名

        stats auth admin1:admin1 #监控页面的用户和密码admin1

        stats hide-version #隐藏统计页面上的HAproxy版本信息

        stats admin if TRUE #手工启用/禁用,后端服务器(haproxy-1.4.9以后版本)

       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

#################HAProxy的日志记录内容设置###################

       capture request header Host len 40

       capture request header Content-Length len 10

       capture request header Referer len 200

       capture response header Server len 40

       capture response header Content-Length len 10

       capture response header Cache-Control len 8

#######################网站监测listen配置#####################

###########此用法主要是监控haproxy后端服务器的监控状态############

listen site_status

       bind 0.0.0.0:1081 #监听端口

       mode http #http的7层模式

       log 127.0.0.1 local3 err #[err warning info debug]

       monitor-uri /site_status #网站健康检测URL,用来检测HAProxy管理的网站是否可以用,正常返回200,不正常返回503

       acl site_dead nbsrv(server_web) lt 2 #定义网站down时的策略当挂在负载均衡上的指定backend的中有效机器数小于1台时返回true

       acl site_dead nbsrv(server_blog) lt 2

       acl site_dead nbsrv(server_bbs) lt 2

       monitor fail if site_dead #当满足策略的时候返回503,网上文档说的是500,实际测试为503

       monitor-net 192.168.16.2/32 #来自192.168.16.2的日志信息不会被记录和转发

       monitor-net 192.168.16.3/32

########frontend配置############

#####注意,frontend配置里面可以定义多个acl进行匹配操作########

frontend http_80_in

       bind 0.0.0.0:80 #监听端口,即haproxy提供web服务的端口,和lvs的vip端口类似

       mode http #http的7层模式

       log global #应用全局的日志配置

       option httplog #启用http的log

       option httpclose #每次请求完毕后主动关闭http通道,HA-Proxy不支持keep-alive模式

       option forwardfor #如果后端服务器需要获得客户端的真实IP需要配置次参数,将可以从Http Header中获得客户端IP

       ########acl策略配置#############

       acl itnihao_web hdr_reg(host) -i ^(www.itnihao.cn|ww1.itnihao.cn)$

       #如果请求的域名满足正则表达式中的2个域名返回true -i是忽略大小写

       acl itnihao_blog hdr_dom(host) -i blog.itnihao.cn

       #如果请求的域名满足www.itnihao.cn返回true -i是忽略大小写

       #acl itnihao hdr(host) -i itnihao.cn

       #如果请求的域名满足itnihao.cn返回true -i是忽略大小写

       #acl file_req url_sub -i killall=

       #在请求url中包含killall=,则此控制策略返回true,否则为false

       #acl dir_req url_dir -i allow

       #在请求url中存在allow作为部分地址路径,则此控制策略返回true,否则返回false

       #acl missing_cl hdr_cnt(Content-length) eq 0

       #当请求的header中Content-length等于0时返回true

########acl策略匹配相应#############

       #block if missing_cl

       #当请求中header中Content-length等于0阻止请求返回403

       #block if !file_req || dir_req

       #block表示阻止请求,返回403错误,当前表示如果不满足策略file_req,或者满足策略dir_req,则阻止请求

       use_backend server_web if itnihao_web

       #当满足itnihao_web的策略时使用server_web的backend

       use_backend server_blog if itnihao_blog

       #当满足itnihao_blog的策略时使用server_blog的backend

       #redirect prefix http://blog.itniaho.cn code 301 if itnihao

       #当访问itnihao.cn的时候,用http的301挑转到http://192.168.16.3

       default_backend server_bbs

       #以上都不满足的时候使用默认server_bbs的backend

##########backend的设置##############

#下面我将设置三组服务器 server_web,server_blog,server_bbs

##################backend server_web####################

backend server_web

       mode http #http的7层模式

       balance roundrobin #负载均衡的方式,roundrobin平均方式

       cookie SERVERID #允许插入serverid到cookie中,serverid后面可以定义

       option httpchk GET /index.html #心跳检测的文件

       server web1 192.168.16.2:80 cookie web1 check inter 1500 rise 3 fall 3 weight 1

       #服务器定义,cookie 1表示serverid为web1,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用,

       #fall 3是3次失败认为服务器不可用,weight代表权重

       server web2 192.168.16.3:80 cookie web2 check inter 1500 rise 3 fall 3 weight 2

       #服务器定义,cookie 1表示serverid为web2,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用,

       #fall 3是3次失败认为服务器不可用,weight代表权重

###################backend server_blog######################

backend server_blog

       mode http #http的7层模式

       balance roundrobin #负载均衡的方式,roundrobin平均方式

       cookie SERVERID #允许插入serverid到cookie中,serverid后面可以定义

       option httpchk GET /index.html #心跳检测的文件

       server blog1 192.168.16.2:80 cookie blog1 check inter 1500 rise 3 fall 3 weight 1

       #服务器定义,cookie 1表示serverid为blog1,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重

       server blog2 192.168.16.3:80 cookie blog2 check inter 1500 rise 3 fall 3 weight 2

       #服务器定义,cookie 1表示serverid为blog2,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重

##################backend server_bbs########################

backend server_bbs

       mode http #http的7层模式

       balance roundrobin #负载均衡的方式,roundrobin平均方式

       cookie SERVERID #允许插入serverid到cookie中,serverid后面可以定义

       option httpchk GET /index.html #心跳检测的文件

       server bbs1 192.168.16.2:80 cookie bbs1 check inter 1500 rise 3 fall 3 weight 1

       #服务器定义,cookie 1表示serverid为bbs1,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重

       server bbs2 192.168.16.3:80 cookie bbs2 check inter 1500 rise 3 fall 3 weight 2

       #服务器定义,cookie 1表示serverid为bbs2,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重

其他高级玩法:

TLS/SSL 配置
访问控制列表 ACL

流量过滤,如禁止 TRACE 方法
ACL 的常见写法
根据访问路径使用指定后端服务器
SESSION 绑定
修改 HTTP 请求头
修改 HTTP 响应头
URL 重定向
URL 重写
HTTP 服务器后端状态检查
黑/白名单
错误页面
权重
统计页面
需要注意的是,这些高级用法大多数都是 HTTP 模式才有的玩法。

TLS/SSL 配置
总所周知,TLS/SSL 是非常昂贵的,建立 SSL 会话需要非常繁琐的步骤,而通信过程中还需要对数据进行加解密操作,非常的消耗 CPU 资源。因此最佳实践是通过 HAProxy 卸载 SSL,即 HAProxy 承载用户侧发过来的 SSL 流量,HAProxy 与后端服务器走 HTTP 明文协议,这样不单止可以减轻后端服务器的压力,更能减轻 HAProxy 的压力。

全局 SSL 配置

tune.ssl.default-dh-param:设置密钥交换算法的加密强度

ssl-default-bind-ciphers:设置加密套件

global
   tune.ssl.default-dh-param 2048
   ssl-default-bind-ciphers TLSv1+HIGH:!aNULL:!eNULL:!3DES:!RC4:!CAMELLIA:!DH:!kECDHE:@STRENGTH no-sslv3 no-tlsv10
绑定 SSL 端口

frontend xxx
    bind :443 ssl crt /etc/haproxy/haproxy.pem
    ...
bind 参数还可以指定一些附加参数,诸如 ciphers,no-sslv3,no-tlsv10 等。

访问控制列表 ACL
HAProxy 的 acl 有非常强大的功能,能实现诸如“流量过滤”、“根据访问路径使用指定后端服务器”、“黑/白名单”等功能。

使用格式

acl <aclname> <criterion> [flags] [operator] <value> ...
示例1:禁止 TRACE 方法
frontend xxx
    ...
    acl deny_trace method TRACE
    http-request deny if deny_trace
    ...
示例2:根据访问路径使用指定后端服务器
frontend xxx
    ...
    acl www path_beg /www
    acl blog path_reg /blog
    use_backend www if www
    use_backend blog if blog
    default_backend default
backend www
    server www1 192.168.0.100:8080
    server www1 192.168.0.101:8080
backend blog
    server blog1 192.168.0.102:8080
    server blog2 192.168.0.103:8080
backend default
    server default1 192.168.0.104:8080
    server default1 192.168.0.105:8080
示例3:基于主机名的虚拟主机
frontend xxx
    ...
    acl www hdr(host) -i www.test.com
    acl blog hdr(host) -i blog.test.com
    use_backend www if www
    use_backend blog if blog
    default_backend default
...
示例4:动静分离
frontend xxx
    ...
    acl url_static  path_beg         /static /images /img /css
    acl url_static  path_end         .gif .png .jpg .css .js
    acl host_www    hdr_beg(host) -i www
    acl host_static hdr_beg(host) -i img. video. download. ftp.
    use_backend static if host_static or host_www url_static
    use_backend www    if host_www
...
这个例子中使用 if host_static or host_www url_static 表达式,意思是如果匹配 host_static 或 host_www url_static 规则,则使用 backend static 。

SESSION 绑定
基本用法

appsession <cookie> len <length> timeout <holdtime>
           [request-learn] [prefix] [mode <path-parameters|query-string>]
示例:

appsession PHPSESSIONID len 52 timeout 3h
修改 HTTP 请求头
示例1:添加 X-Forward-For
frontend xxx
    ...
    option forwardfor
    ...
示例2:添加请求头
frontend xxx
    ...
    http-request set-header Host www.test.com
    http-request set-header X-Forwarded-Port %[dst_port]
    http-request add-header X-Forwarded-Proto https if { ssl_fc }
    ...
修改 HTTP 响应头
示例1:删除响应头中的 Server: xxxxx
frontend xxx
    ...
    rspidel ^Server.*
    ...
示例2::修改响应头中的 Server: xxxxx
frontend xxx
    ...
    rspirep ^Server.* Server:\ Google\ Web\ Server
    ...
示例3:添加响应头
frontend xxx
    ...
    reqadd      X-Proto:\ SSL  if is-ssl
    ...
URL 重定向
示例1:跳转至 https
frontend xxx
    ...
    redirect scheme https if !{ ssl_fc }
    ...
示例2:访问特定页面重定向到首页
frontend xxx
    ...
    acl missing_slash path_reg ^/article/[^/]*$
    redirect code 301 prefix / drop-query append-slash if missing_slash
    ...
URL 重写
示例1:

frontend xxx
    ...
    acl p_ext_jpg path_end -i .jpg
    acl p_folder_images path_beg -i /images/
    http-request set-path /images/%[path] if !p_folder_images p_ext_jpg
HTTP 服务器后端状态检查
示例:

backend xxx
    option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
黑/白名单
示例1:白名单

backend zabbix
    mode http
    tcp-request content accept if { src 125.89.67.178 }
    tcp-request content reject
示例2:黑名单

frontend xxxx
    ...
    acl     denylist src 125.89.67.178
    http-request deny if denylist
    ...
错误页面
示例:

defaults
    ...
    errorfile 400 /etc/haproxy/errorfiles/400badreq.http
    errorfile 408 /dev/null  # workaround Chrome pre-connect bug
    errorfile 403 /etc/haproxy/errorfiles/403forbid.http
    errorfile 503 /etc/haproxy/errorfiles/503sorry.http
权重
示例:

backend xxxx
    ...
    server www1 192.168.0.100:8080 weight 3
    server www1 192.168.0.100:8080 weight 1
统计页面
示例:

backend stats_auth
    stats enable
    stats auth  admin:AdMiN123
    stats admin if TRUE