本节讲解全局参数配置。
---------------------------------------------------------------
3. 全局参数
全局区域里的参数是进程级别的,经常跟操作系统相关。他们一次性设置且不需要再变动。
其中一些具有命令行等价。
下面的关键词可以在global区域中存在。
* Process管理和安全
- chroot-à设置global.chroot->然后执行chroot(global.chroot),用来切换进程的根目录。
- daemon-àglobal.mode |= MODE_DAEMON->以后台方式启动
- gid---à设置global.gid->然后执行setgid(global.gid),修改进程的组ID
- group-à通过参数获取组的信息,ha_group = getgrnam(args[1])->进而影响global.gid = (int)ha_group->gr_gid
- log----à设置日志服务器->发送日志就发送到这些服务器
- log-send-hostname-à设置global.log_send_hostname->用于发送日志消息logmsg嵌入在里面
- nbprocà设置global.nbproc->在daemon下执行多个进程,但是貌似文档说不鼓励用多个进程。
如果确实使用了多个进程,则parent退出,剩下nbproc个子进程,多个proxy会分散到这nbproc个child进程。
- pidfile-à设置global.pidfile-》用于记录pid的文件。
- uid-----》设置global.uid-----》通过setuid(global.uid)来修改进程的uid
- ulimit-n->设置global.rlimit_nofile—》setrlimit(RLIMIT_NOFILE, &limit来设置进程的最大文件描述符数量。
- user---》设置getpwnam(args[1])进而设置global.uid-----》通过setuid(global.uid)来修改进程的uid
- statsà较复杂,略。
- node->设置global.node-》全局的一个字符串标志。
- description-》global.desc-》一段文字,无其它意义。
* Performance tuning
- maxconn---》设置global.maxconn---》规定了一个proxy最多可建立的maxconn个连接,也就是accept的次数。
- maxpipes—》设置global.maxpipes—》不详,略。
- noepoll—》global.tune.options &= ~GTUNE_USE_EPOLL—》通过disablepoller函数禁止某个IO复用。
- nokqueue-》global.tune.options &= ~GTUNE_USE_KQUEUE—》通过disablepoller函数禁止某个IO复用。
- nopoll—》global.tune.options &= ~GTUNE_USE_POLL—》通过disablepoller函数禁止某个IO复用。
- nosepoll-》global.tune.options &= ~GTUNE_USE_SEPOLL-》通过disablepoller函数禁止某个IO复用。
- nosplice-》global.tune.options &= ~GTUNE_USE_SPLICE—》通过disablepoller禁止某个模块。
- spread-checks-》设置global.spread_checks-》用在process_chk,服务器check函数中,具体不详。
- tune.bufsize—》设置global.tune.bufsize-》session里的请求体和响应体缓冲区都占用这么大的长度。
- tune.chksize->设置global.tune.chksize—》为srv->check_data分配这么大的缓冲区-》用于存储check results
- tune.maxaccept-》设置global.tune.maxaccept-》event_accept中一次性最多接受maxaccept个连接。
- tune.maxpollevents-》设置global.tune.maxpollevents---》貌似是事件处理的次数限制。
- tune.maxrewrite-》设置global.tune.maxrewrite-》略
- tune.rcvbuf.client-》设置global.tune.client_rcvbuf-》event_accept时设置client端socket的接收缓冲区大小setsockopt(cfd, SOL_SOCKET, SO_RCVBUF
- tune.rcvbuf.server-》设置global.tune.server_rcvbuf-》连接服务器时设置socket的接收缓冲区大小setsockopt(fd, SOL_SOCKET, SO_RCVBUF
- tune.sndbuf.client-》设置global.tune. client_sndbuf-> event_accept时设置client端socket的发送缓冲区大小setsockopt(cfd, SOL_SOCKET, SO_SNDBUF
- tune.sndbuf.server-》不解释,很容易理解!
* Debugging
- debugàglobal.mode |= MODE_DEBUGàdebug模式
- quiet-》global.mode |= MODE_QUIET-》略。
3.1. 进程管理和安全
chroot <jail dir>
切换当前目录到参数,在丢弃权利前执行一个chroot()。
这个操作提升安全级别,仅仅当进程以超级用户特权启动才生效。
必须保证目录是空的且任何用户都不可写。
使得进程已后台模式启动,建议的模式,也可以用-D参数,可以被-db禁用。
gid <number>
改变进程的组ID,建议:组ID分配给了HAPROXY或者一些类似的后台用户们。
HAProxy必须被属于这个组的一个用户启动,或者以超级用户启动。
需要注意的是:略
group <group name>
与gid类似,但是使用名字从/etc/group获取GID.
log <address> <facility> [max level [min level]]
添加一组全局syslog服务器,最多2个全局服务器可以设置。
它们将接收启动和退出的日志,以及代理的所有日志(与log_global设置有关)。
地址可以是:
- 一个IPV4地址,UDP端口可选,如果没有设置端口,514为默认端口(标准syslog端口)。
- 一个文件系统路径到一个UNIX域的socket,需要注意的是:chroot,要确保路径可访问,
并且uid/gid可对路径进行写操作.
<facility> 必须是下列的24个标准syslog设备之一 :
kern user mail daemon auth syslog lpr news
uucp cron auth2 ftp ntp audit alert cron2
local0 local1 local2 local3 local4 local5 local6 local7
Level可选,来过滤发出的消息,默认,所有的消息会被发送。
如果最大level被设置,仅仅当前级别的消息可以被发送。
可选的最小级别也可以设定,如果被设置,更多级别的消息???
这是为了避免发送emerg消息。
8个级别的消息:
emerg alert crit err warning notice info debug
log-send-hostname [<string>]
设置hostname字段,用于syslog头部,如果string参数设置了,
头部就会使用string的值,否则使用系统的hostname.
总的来说,当不是通过一个中间的syslog服务器传递日志时使用,或者
就是为了定制hostname.
log-tag <string>
设置global.log_tag,设置syslog里的tag字段为此string.
默认为progname。通常就是”haproxy”,
有时,用于区分同一个主机上运行的多个进程。
nbproc <number>
创建多个进程,前提是后台模式。
默认情况下,仅仅一个进程被创建,这也是推荐的模式。
因为系统会限制每个进程的打开文件描述符的个数,
需要创建多个后台进程,使用多个后台进程难以调试,
并且确实不被鼓励!!!
pidfile <pidfile>
写入所有后台进程的pids到此文件,与命令行里的”-p”等价。
文件必须可访问。
stats socket <path> [{uid | user} <uid>] [{gid | group} <gid>] [mode <mode>]
[level <level>]
创建一个UNIX套接字,流模式,在地址path.
任何先前存在的socket将备份然后替换掉。
连接到此socket的连接会返回各种统计输出,设置可以接收一些命令。
请咨询9.2节。
一个可选的level参数可以用来设定可以接收的命令。
- "user" 是最低权限级别,仅仅不敏感的统计结果可以读,不容许修改。
当不容易限制对此socket的访问时有作用。
- "operator"是默认级别,满足大多数使用场景,所有的数据可以被读,仅仅非敏感的修改被
容许,比如clear max counters.
- "admin" 需要小心使用,任何操作都可以,比如clear all counters.
在支持它的平台上,可以限制对此socket的访问,通过在uid和gid后指定数字。
或者user和group后面的参数。
也可以限制访问(通过传递八进制的数值,在mode之后,类似于chmod),
对这个socket的访问权将从上级目录获取,或者从user.
stats timeout <timeout, in milliseconds>
此socket上,默认的超时时间是10秒,可以通过此选项修改。
这个值必须以毫秒单位传递,或者以后缀{ us, ms, s, m, h, d }.
stats maxconn <connections>
默认,统计socket被限制在10个并发,可以修改。
uid <number>
修改进程的UID。建议:UID给予了haproxy,或者给一些类似的后台用户。
HAPROXY必须以超级用户启动来切换到其他UID.
ulimit-n <number>
设置每个进程的最大文件句柄数,默认,会自动计算,所以建议不要使用此选项。
user <user name>
与UID类似,只是通过查找/etc/passwd获取UID
node <name>
当两个或者更多进程或者server共享同一个IP地址,
通过设置不同的node名字,可以区分server.
description <text>
添加一段描述,注意,一些字符会被转移,比如#
这段文本会被插入到HTML页面,所以你必须避免使用
"<" and ">" 字符。
3.2. 性能相关
maxconn <number>
设置每个进程最大并发连接数为参数number.与-n等价。
Proxy将会停止接受连接当限制达到。Ulimit-n参数会根据此参数
自动调整。
maxpipes <number>
设置每个进程最大的管道数为number,管道只用于内核基础上的tcp splice.
也就是内核级别的direct IO.
管道包含两个文件描述符,ulimit-n值会自动增加.
默认的值是max/4,这个值看起来可以满足大部分场景。
代码会动态分配及释放管道,也可以退回到标准拷贝。
所以设置此值太低的话会影响性能。
禁止epoll,等价于-de,那么剩下的可用事件处理系统通常是poll.
禁止kqueue,等价于-dk,下一个可用事件处理系统通常是poll.
禁止poll,等价于-dp,下一个可用的是select.
应该永远不要进制poll,因为poll总是可用的。
禁止sepoll,等价于-ds,下一个可用的是epoll
禁止使用内核级的socket tcp 拷贝,等价于"-dS".
则数据将使用传统方式和更轻便的recv/send 函数来拷贝。
内核级别的TCP拷贝在内核2.6+可用,大多数介于2.6.25 和2.6.28
有问题,并且将转发破坏了的数据,所以,它们不应该被使用,
这个选项可以在不确定时轻松的禁止内核拷贝。
"option splice-auto", "option splice-request" 和
spread-checks <0..50, in percent>
有时,要避免以精确的同样的间隔发送健康checks给服务器
比如,当一些服务器在同一个物理机器上,
通过这个参数,可以增加一些随机性到check间隔里(between 0 and +/- 50%)
值在【2,5】看起来不错,默认值是0.
tune.bufsize <number>
设置缓冲区大小为这个值,单位字节。
较小的值可以容纳更多的会话并存(同样容量的内存)。
较大的值容许更大的cookie存在。
默认值是16384字节,并且可以build时修改。
强烈建议,不要修改此值,因为非常低的值将破坏一些服务比如统计。
较大的值将提高内存使用,可能引起系统内存不够用。
所以如果这个值被提高,global maxconn应该降低。
tune.chksize <number>
设置check缓冲区大小为这个值,较高的值可以帮助找到字符串
或者正则表达式,通过这个可能imply更多的内存是CPU利用率。
默认值是16384,可以build时修改,不建议修改此值
tune.maxaccept <number>
进程一次最多可同时accept的最大请求数。
高的值可以提高较高的连接率,低值会偏向于已经建立的连接。
在单进程模式下,最大值为100.
尽管如此,多进程模式下,默认为8,目的是:
当一个进程被唤醒时,不会接收所有的进来的连接,而是留一部分给其它进程。
设置为-1则完全消除此限制,正常情形下,没有必要修改此值。
tune.maxpollevents <number>
设置事件系统最多一次可处理的事件数,
默认值依赖于操作系统,200以下的话,
会轻微降低延迟(消耗网络带宽),200以上会提高网络带宽(以延迟为代价)。
tune.maxrewrite <number>
设置保留的缓冲区空间大小,单位字节,这个空间用于header重写或者追加。
第一次读操作永远不会填充超过bufsize-maxrewrite大小的空间,
默认是bufsize的一半,尽管没有太大意义,因为很少有大的header需要添加。
设置为太大的值,可以避免处理很大的报文,太小避免额外的新header到
已经很大的请求体或者POST请求体???,
一般来说,设置为1024比较明智,会自动调整到bufsize的一半如果比一半大。
所以不用担心。
tune.rcvbuf.client <number>
tune.rcvbuf.server <number>
强制修改内核的socket接收缓冲区大小(client)/(server).
这个值适用于所有的TCP/HTTP frontends和 backends.
正常不应该被设置,默认值0可以让内核自动调整这个值(依赖于可用的内存)
尽管如此,有时会帮助设置为很小的值比如4096,这是为了保留内核的内存(阻止缓存大量的接收的数据)
较低的值可以显著提高CPU使用率。
tune.sndbuf.client <number>
tune.sndbuf.server <number>
强制内核socket发送缓冲区大小(client)|(server).
对所有的TCP/HTTP frontends和backends都适用. 正常情况下永远不要设置,
默认值0可以让内核自动调整这个值(依赖于可用的内存)
尽管如此,有时会帮助设置为很小的值比如4096,这是为了保留内核的内存(阻止缓存大量的接收的数据)
较低的值可以显著提高CPU使用率。
另外一个可用的场景是:防止写超时???
3.3. 调试
启用debug模式,会输出所有的改变。并且禁止进入后台模式。
等价于-d,在生产环境中不应该使用,因为可以防止系统重启。
启动时不显示任何消息,等价于-q.
3.4. Userlists
可以控制对frontend/backend/listen的访问权,或者对http统计信息
这是通过容许仅仅认证过的用户,为了实现这个,需要创建至少一个userlist并且定义users.
userlist <listname>
创建一份新的userlist,名字为listname.
一些独立的用户列表可以使用来存储认证数据。
group <groupname> [users <user>,<user>,(...)]
添加 group <groupname> 到当前的 userlist.
可以添加users到这个group,通过逗号隔开。之前加上users关键词。
user <username> [password|insecure-password <password>]
[groups <group>,<group>,(...)]
添加user <username> 到当前的userlist.
加密数据和非加密密码都可以。加密的密码使用crypt(3)(依赖于系统的能力)
不同的算法也支持,比如现在的libc支持MD5, SHA-256, SHA-512 以及经典的DES-based
方法。
userlist L1
group G1 users tiger,scott
group G2 users xdb,scott
user tiger password $6$k6y3o.eP$JlKBx9za9667qe4(...)xHSwRv6J.C0/D7cV91
user scott insecure-password elgato
user xdb insecure-password hello
userlist L2
group G1
group G2
user tiger password $6$k6y3o.eP$JlKBx(...)xHSwRv6J.C0/D7cV91 groups G1
user scott insecure-password elgato groups G1,G2
user xdb insecure-password hello groups G2
| 翻译 | 理解 |
1 | ok | ok |
2 | ok | ok |