标签:haproxy 配置文件
HAProxy的配置文件分为两个部份,第一部份为全局配置段(Global setting),第二部份为代理配置段(Proxies)。 全局配置段设置haproxy运行工作的一些特性,这一部份主要有与进程管理和安全相关的指令,与性能调整的指令和与调试相关的指令。而代理配置段又可以分为四个部份,一是"defaults <name>",这一部份设置的指令代表公共配置,即如果在后边的配置中没有显式的指定某个参数及值时,默认时就采用defaults中设置的值;二是"frontend <name>",这是定义一个面向客户端的配置,定义一系列监听的套接字,这些套接字可接受客户端请求并与之建立连接;三是"backednd <name>",这是定义上游服务器组,定义一系列“后端”服务器,代理将会将对应客户端的请求转发至这些服务器;四是"listen <name>",通过关联“前端”和“后端”定义了一个完整的代理,通常只对TCP流量有用,这是一个可以替代frontend和backend的指令,即可以把前端与后端都定义在一个listen中。所有代理的名称只能使用大写字母、小写字母、数字、-(中线)、_(下划线)、.(点号)和:(冒号),此外,ACL名称会区分字母大小写。
下面对全局配置段中的部份指令作一个简单介绍:
与进程管理和安全相关的指令:
chroot <jail dir>
修改haproxy的工作目录至指定的目录并在放弃权限之前执行chroot()操作,可以提升haproxy的安全级别,不过需要注意的是要确保指定的目录为空目录且任何用户均不能有写权限;
daemon
让haproxy以守护进程的方式工作于后台,其等同于“-D”选项的功能,当然,也可以在命令行中以“-db”选项将其禁用;
gid <number>
以指定的GID运行haproxy,建议使用专用于运行haproxy的GID,以免因权限问题带来风险;
group <group name>
同gid,不过指定的组名;
log <address> <facility> [max level [min level]]
定义全局的syslog服务器,最多可以定义两个;
log-send-hostname [<string>]
在syslog信息的首部添加当前主机名,可以为“string”指定的名称,也可以缺省使用当前主机名;
nbproc <number>
指定启动的haproxy进程个数,只能用于守护进程模式的haproxy;默认只启动一个进程,鉴于调试困难等多方面的原因,一般只在单进程仅能打开少数文件描述符的场景中才使用多进程模式;
pidfile <pidfile>
pid文件路径;
uid <number>
以指定的UID身份运行haproxy进程;
user <user name>
同uid <number>,只是这里指定的是用户名称;
ulimit-n <number>
设定每进程所能够打开的最大文件描述符数目,默认情况下其会自动进行计算,因此不推荐修改此选项;
stats socket <path>
定义统计信息保存位置
node <name>
定义当前节点的名称,用于HA场景中多haproxy进程共享同一个IP地址时;
description <text>
当前实例的描述信息。
这些与进程管理与安全相关的指令大多都不用指定,只作了解即可。
与性能调整相关的指令:
maxconn <number>
设定每个haproxy进程所接受的最大并发连接数,其等同于命令行选项“-n”,在“进程管理与安全相关的指令”中的"“ulimit-n”的值会根据maxconn自动调整;
maxpipes <number>
haproxy使用pipe完成基于内核的tcp报文重组,此选项则用于设定每进程所允许使用的最大pipe个数;每个pipe会打开两个文件描述符,因此,“ulimit -n”自动计算时会根据需要调大此值;默认为maxconn/4,其通常会显得过大;
noepoll
在Linux系统上禁用epoll机制;
nokqueue
在BSE系统上禁用kqueue机制;
nopoll
禁用poll机制;
nosepoll
在Linux禁用启发式epoll机制;
nosplice
禁止在Linux套接字上使用内核tcp重组,这会导致更多的recv/send系统调用;不过,在Linux 2.6.25-28系列的内核上,tcp重组功能有bug存在;
spread-checks <0..50, in percent>
在haproxy后端有着众多服务器的场景中,在精确的时间间隔后统一对众服务器进行健康状况检查可能会带来意外问题;此选项用于将其检查的时间间隔长度上增加或减小一定的随机时长,这是对健康检测的一种优化;
tune.bufsize <number>
设定buffer的大小,同样的内存条件小,较小的值可以让haproxy有能力接受更多的并发连接,较大的值可以让某些应用程序使用较大的cookie信息;默认为16384,其可以在编译时修改,不过强烈建议使用默认值;
tune.chksize <number>
设定检查缓冲区的大小,单位为字节;更大的值有助于在较大的页面中完成基于字符串或模式的文本查找,但也会占用更多的系统资源;不建议修改;
tune.maxaccept <number>
设定haproxy进程内核调度运行时一次性可以接受的连接的个数,较大的值可以带来较大的吞吐率,默认在单进程模式下为100,多进程模式下为8,设定为-1可以禁止此限制,一般不建议修改;
tune.maxpollevents <number>
设定一次系统调用可以处理的事件最大数,默认值取决于OS;其值小于200时可节约带宽,但会略微增大网络延迟,而大于200时会降低延迟,但会稍稍增加网络带宽的占用量;
tune.maxrewrite <number>
设定为首部重写或追加而预留的缓冲空间,建议使用1024左右的大小;在需要使用更大的空间时,haproxy会自动增加其值;
tune.rcvbuf.client <number>
定义在客户端内核套接字接收缓冲区的大小,单位为字节,建议不要调整此值;
tune.rcvbuf.server <number>
设定内核套接字中服务端接收缓冲的大小,单位为字节;强烈推荐使用默认值;
tune.sndbuf.client
定义在客户端内核套接字发送缓冲区的大小,单位为字节,建议不要调整此值;
tune.sndbuf.server:
定义在服务端内核套接字发送缓冲区的大小,单位为字节,建议不要调整此值;
上边的这些指令大多也是作为了解即可,在实际中并不常会调整这些参数。
与调试相关的指令:
debug
在调度haproxy时可以启用此参数,但在生产环境不应该启用;
quiet
haproxy启动后不会显示任何相关信息,这与在命令行启动haproxy时加上参数“-q”相同
与代理相关的配置涉及太多,官方文档中用了一个章节来介绍,在各代理配置段的各个部份都有相应的可用指令,请参考http://cbonte.github.io/haproxy-dconv/configuration-1.4.html#4,这里我以一个配置文件实例来简单介绍。
[root@nod0 haproxy]# cat haproxy.cfg #--------------------------------------------------------------------- # Example configuration for a possible web application. See the # full configuration options online. # # http://haproxy.1wt.eu/download/1.4/doc/configuration.txt # #--------------------------------------------------------------------- #--------------------------------------------------------------------- # Global settings #--------------------------------------------------------------------- global # to have these messages end up in /var/log/haproxy.log you will # need to: # # 1) configure syslog to accept network log events. This is done # by adding the ‘-r‘ option to the SYSLOGD_OPTIONS in # /etc/sysconfig/syslog # # 2) configure local2 events to go to the /var/log/haproxy.log # file. A line like the following can be added to # /etc/sysconfig/syslog # # local2.* /var/log/haproxy.log # #设置把haproxy的日志发往本地的rsyslog服务 log 127.0.0.1 local2 #把haproxy进程限定在chroot指定的目录运行,此目录权限需要设定为除了haproxy用户有写权限限外其他的用户没有,并且是一个空目录 chroot /var/lib/haproxy #pid文件的路径 pidfile /var/run/haproxy.pid #设置proxy允许的最大并发连接数,如果在backend中没有指定server的maxconn的值,则可继承此值 maxconn 4000 #运行haproxy的用户 user haproxy #运行haproxy的组 group haproxy #让haproxy以守护进程运行在后台 daemon # turn on stats unix socket #定义统计信息保存的位置 stats socket /var/lib/haproxy/stats #--------------------------------------------------------------------- # common defaults that all the ‘listen‘ and ‘backend‘ sections will # use if not designated in their block #--------------------------------------------------------------------- #默认设置 defaults #设置haproxy的运行模式,有三种{http|tcp|health} mode http #设置日志继承全局配置段的设置 log global #表示开始打开记录http请求的日志功能,详细的应查看官方文档的的关键字矩阵部分 option httplog #如果产生了一个空连接,那这个空连接的日志将不会记录 option dontlognull #打开http协议中服务器端关闭功能,使得支持长连接,使得会话可以被重用,使得每一个日志记录都会被记录 option http-server-close #如果上游服务器上的应用程序想记录发起请求的客户端的IP地址,HAProxy会把客户端的IP信息发送给上游服务器,在HTTP请求中添加"X-Forwarded-For"字段,但当是haproxy自身的健康检测机制去访问上游服务器时是不应该把这样的访问日志记录到日志中的,所以用except来排除127.0.0.0,即haproxy身。 option forwardfor except 127.0.0.0/8 #当与上游服务器的会话失败(服务器故障或其他原因)时,把会话重新分发到其他健康的服务器上,当原来故障的服务器恢复时,会话又被定向到已恢复的服务器上。还可以用"retries"关键字来设定在判定会话失败时的尝试连接的次数, option redispatch #当haproxy负载很高时,自动结束掉当前队列处理比较久的链接 option abortonclose #向上游服务器尝试连接的最大次数,超过此值就认为后端服务器不可用 retries 3 #客户端发送http请求的超时时间 timeout http-request 10s #当上游服务器在高负载响应haproxy时,会把haproxy发送来的请求放进一个队列中,timeout queue定义放入这个队列的超时时间。 timeout queue 1m #haproxy与后端服务器连接超时时间,如果在同一个局域网可设置较小的时间 timeout connect 5s #定义客户端与haproxy连接后,数据传输完毕,不再有数据传输,即非活动连接的超时时间 timeout client 1m #定义haproxy与上游服务器非活动连接的超时时间 timeout server 1m #设置新的http请求连接建立的最大超时时间,时间较短时可以尽快释放出资源,节约资源 timeout http-keep-alive 10s #健康检测的时间的最大超时时间 timeout check 10s #最大并发连接数 maxconn 3000 #--------------------------------------------------------------------- # main frontend which proxys to the backends #--------------------------------------------------------------------- #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 #######监控统计页面设置############ listen stats #监听端口 bind 0.0.0.0:1088 #日志设置,级别有[emerg alert crit err warning notice info debug] log 127.0.0.1 local3 err #启用统计报告,是一个默认的参数 stats enable #隐藏统计页面上haproxy的版本信息 stats hide-version #统计页面刷新时间 stats refresh 10s #进入统计页面密码框上的提示文字 stats realm Haproxy\ Stats #进入统计页面输入的用户名及密码 stats auth admin:admin #统计页面的登陆uri地址 stats uri /admin?admin #当统计页面打开后再打开对后端服务器的管理功能 stats admin if TRUE ####frontend配置###### frontend server1_80_in #绑定任何地址的80端口 bind *:80 #haproxy以http的方式运行 mode http #定义两个能实现匹配静态文件的acl acl is_static path_beg -i /static /image /javascript acl is_static path_end -i .html .png .jpg .gif .jpeg .css .js #定义当匹配到is_static的acl后转发到static_servers这个后端服务器组 use_backend static_servers if is_static #默认的转发规则 default_backend app_servers ####backend配置####### backend static_servers #静态服务器组采用roundrobin算法 balance roundrobin #定义上游服务器及各个属性,对服务器每隔1500毫秒进行一次健康检测,如果连续3次无法联系服务器那就认为此服务器故障,如果连接连续检测到2次务都在线,那就认为此服务可用 server nod2_static_192.168.0.202 192.168.0.202:80 minconn 10 maxconn 2000 check inter 1500 fastinter 1000 downinter 1000 rise 2 fall 3 weight 1 backend app_servers #定义动态服务器的调度算法为source,并提供了hash-type参数,使source成为一个动态算法 balance source hash-type consistent server nod1_appserver_192.168.0.201 192.168.0.201:80 minconn 10 maxconn 200 check inter 1500 rise 3 fall 3 weight 1
这个配置文件实现了简单的动静分离的效果,各个配置行的意义都在配置文件中给出了注释。
参考资料:
马哥课堂笔记
http://cbonte.github.io/haproxy-dconv/configuration-1.4.html
本文出自 “专注运维,与Linux共舞” 博客,请务必保留此出处http://zhaochj.blog.51cto.com/368705/1659610
标签:haproxy 配置文件
原文地址:http://zhaochj.blog.51cto.com/368705/1659610