HAProxy配置文件指导HAProxy负载均衡器的行为。在这篇文章中,我们展示了它最重要的四个部分。
HAProxy配置文件有四个基本部分。他们是global
,defaults
和frontend
,和backend
。这四个部分定义了整个服务器的执行方式,默认设置以及客户端请求的接收方式和路由到后端服务器的方式。
如果反向代理的世界比作一个奥运接力赛,那么global
,defaults
,frontend
并且backend
是明星选手。每个部分都起着至关重要的作用,将接力棒交给下一个。像奥林匹克接力队一样,HAProxy负载均衡器的功能和性能是通过结合每个部分的独特条件来实现的。让我们看看他们是如何合作的
格式
如果你正在使用HAProxy Enterprise来获取其高级功能,可以在/etc/haproxy/haproxy.cfg找到配置文件。如果你使用的是Community Edition,请访问/etc/haproxy/haproxy.cfg。你可以通过使用参数调用haproxy可执行文件来测试配置更改-c
,例如:
haproxy -c -f /etc/haproxy/haproxy.cfg
该文件的结构如下:
global
# global settings here
defaults
# defaults here
frontend
# a frontend that accepts requests from clients
backend
# servers that fulfill the requests
当某个关键字global
或defaults
遇到某个关键字时,该部分就会开始,并且包含所有关注的行,直到你到达另一个关键字。空行和缩进将被忽略。因此,该global
部分将继续,直到你defaults
在自己的行上找到一个关键字。让我们假设你有一个网站可供客户使用,例如www.linuxea.com。在你的专用网络中,你将拥有两个托管此站点文件的Web服务器。当然,你可以拥有比这更多的服务器,但出于演示目的,我们将其保留为两个。这样两个服务器都可以被利用,它们被负载平衡以处理请求,这意味着它们轮流接收和响应请求。HAProxy是一个反向代理,位于两个Web服务器的前面,并将请求路由到它们。
随着我们的进展,你可以通过阅读官方文档了解有关配置设置的更多信息。让我们看看每个部分的一些重要指令。
global
在HAProxy配置文件的顶部是该global
部分,由单独的单词标识global
。global
定义过程范围内的安全性和性能调整下的设置会影响低级别的HAProxy。
global
maxconn 50000
log /dev/log local0
user haproxy
group haproxy
stats socket /run/haproxy/admin.sock user haproxy group haproxy mode 660 level admin
nbproc 2
nbthread 4
cpu-map auto:1/1-4 0-3
ssl-default-bind-ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
我们看看每个设置的工作原理
MAXCONN
该maxconn
)设置限制了HAProxy将接受的最大连接数。其目的是保护你的负载均衡器免于内存不足。你可以参考内存要求的大小调整指南,确定适合你环境的最佳价值。
大小调整指南机器翻译篇:
典型的CPU使用率数据显示在HAProxy中花费的处理时间的15%在TCP或HTTP关闭模式下内核中的比例为85%,而HAProxy约为30%在HTTP保持活动模式下,内核占70%。 这意味着操作系统及其调整对全球业绩有很大影响。用户之间的用途差别很大,一些用户需要注意带宽,另一些用户需要速率,其他关于连接并发性,其他关于SSL性能。 这个部分旨在提供一些元素来帮助完成这项任务。重要的是要记住每个操作都带有成本,因此每个操作都是如此个人操作会增加其他人的开销,这可能是在某些情况下可忽略不计,但在其他情况下可能占主导地位。
- 处理来自连接的请求时:
- 转发数据的成本低于解析请求或响应头;
- 解析请求或响应头的成本低于建立然后关闭与服务器的连接;
- 建立关闭连接成本低于TLS恢复操作;
- 计算TLS恢复操作的成本低于使用密钥的完整TLS握手;
- 空闲连接比缓冲区保存数据的连接花费更少的CPU;
- 与数据连接相比,TLS上下文的内存成本更高;
因此在实践中,处理有效负载字节比使用头字节代价更少,从而使用大型对象(请求很少)更容易实现高网络带宽 每个volume 单位)而不是小对象(每个volume 单位的许多请求)。 这个解释了为什么总是用大对象测量最大带宽,而请求率或连接率是用小物体测量的。一些操作分布在多个CPU上的多个进程上可以很好地扩展。 网络带宽不会扩展到很远,因为CPU很少是大型对象的瓶颈,它主要是网络带宽和数据总线到达网络接口。 连接率由于系统中存在少量锁定,因此无法在多个处理器上进行良好扩展在处理本地端口表时。 请求率超过持久性连接非常好,因为它不涉及太多内存和网络带宽,不需要访问锁定的结构。 TLS密钥计算由于它完全受CPU限制,因此可以很好地扩展。 TLS恢复规模适度,但是在4个进程中达到了极限,其中访问的开销很大共享表抵消了更多功率所带来的微小收益。人们可以从一个经过精心调整的系统中获得的性能数字在以下范围。 重要的是将它们视为数量级和数量级预计基于处理器IRQ的任何方向都会有显着变化设置,内存类型,网络接口类型,操作系统调整等。翻译的比较操蛋:简单来讲就是,多核心对于Haproxy很少有帮助的,除非是使用TLS,一般来说,高频率才是最好的。
?除了处理连接所消耗的内存之外,你定义的配置,映射文件和ACL文件还使用了额外的内存。
log
该log
)设置可确保启动期间发出的警告和运行时出现的问题都记录到syslog中。它还会记录请求。你可以将传统UNIX套接字定位到Syslog或journald,listen,/ dev / log或指定远程rsyslog服务器,以便将日志数据保留在负载平衡服务器的外部。设置Syslog工具,通常是local0,这是一个分类为自定义使用的工具。请注意,为了读取日志,你需要配置任何syslog守护程序或journald,以将它们写入文件。
用户/组
该user
)和group
)行告诉HAProxy的初始化后,放弃超级权限。Linux要求进程是root用户才能侦听1024以下的端口。你通常也希望你的TLS私钥只能由root读取。如果没有定义用户和组来继续进程,HAProxy将保留root权限,这是一种不好的做法。请注意,HAProxy本身不会创建用户和组,因此应事先创建它们
stats socket
该stats socket
行启用了运行时API,你可以使用该API动态禁用服务器和运行状况检查,更改服务器的负载平衡权重,以及提取其他有用的杠杆。
nbproc / nbthread
在nbproc
和nbthread
设置分别指定的进程和线程的数量,即HAProxy应在启动时。这可以提高负载均衡器的效率。但是,创建的每个进程nbproc
都有自己的统计信息,操作表,运行状况检查等。nbthread
另一方面,创建的线程共享它们。你可以使用一个或另一个或两个设置。只有一个进程和线程,HAProxy才能很好地执行,除非你正在进行大量的TLS终止,这可以从使用多个CPU内核中获益。
设置其中任何一个时,你还需要设置cpu-map以确保将进程固定到特定核心以获得最佳性能
SSL的默认绑定,密码
该ssl-default-bind-ciphers
设置枚举bind
默认情况下每个指令将使用的SSL和TLS密码。可以通过添加bind
指令的ciphers参数来覆盖更具体的设置。它cipher
按照优先顺序列出套房。除非prefer-client-ciphers
启用该选项,否则HAProxy将选择客户端也支持列出的第一个。尝试使用Qualys SSL服务器测试来查看你选择的密码的强大程度以及你能够支持的浏览器。
SSL的默认绑定选项
该ssl-default-bind-options
设置配置SSL / TLS选项,例如ssl-min-ver
)禁用对旧协议的支持。例如,你可以选择仅接受使用TLS版本1.2或更高版本的连接
defaults
随着配置的增长,使用一个defaults
部分将有助于减少重复。它的设置适用于它之后的所有frontend
和backend
部分。你仍然可以在后续部分中覆盖这些设置。
你也不仅限于一个defaults。后续
defaults`部分将覆盖之前的部分,并将所有选项重置为其默认值。
因此,你可能决定配置defaults
包含所有TCP设置的部分,然后将仅TCP frontend
和backend
部分放在其后面。然后,将所有HTTP设置放在另一个defaults
部分中,并按照HTTP frontend
和backend
部分进行操作。
例子:
defaults
timeout connect 10s
timeout client 30s
timeout server 30s
log global
mode http
option httplog
maxconn 3000
每个设置的含义
timeout connect timeout
timeout connect timeout 客户端/超时服务器,该timeout connect
设置配置HAProxy等待与后端服务器建立TCP连接的时间。“s”后缀表示秒。没有任何后缀,假定时间以毫秒为单位。该timeout client
设置在我们期望客户端应答的期间或者换句话说发送TCP段时测量不活动。timeout server
当我们期望后端服务器应答时,该设置会测量不活动状态。超时到期时,连接将关闭。具有合理的超时可以降低死锁进程占用连接的风险,否则这些连接可能会被重用。
在TCP模式下操作HAProxy时,设置为mode tcp
,timeout server
应该与timeout client
。那是因为HAProxy不知道哪一方应该应答,并且由于两者都一直适用,因此具有不同的值会使混淆更容易发生。
log global
该log global
设置是一种告诉每个后续frontend
使用log
你在该global
部分中定义的设置的方法。这不是记录所必需的,因为log
可以在此处或每个中添加新行frontend
。但是,在大多数情况下,只使用一个系统日志服务器,这很常见。
mode
该mode
设置定义HAProxy是作为简单的TCP代理运行,还是能够检查传入流量的更高级别的HTTP消息。指定的替代方法mode http
是使用mode tcp
,它以更快但不太清楚的级别运行。如果你frontend
和你的大多数backend
部分都使用相同的模式,则在该defaults
部分中指定它以避免重复是有意义的。
MAXCONN
该maxconn
设置限制了每个frontend
接受的连接数,默认情况下设置为2000.如果要允许更多连接,可以在此处将其增加到全局maxconn
。另一方面,你可能希望使用一个数字,使每个frontend在global连接中占有相当的份额
option httplog
该option httplog
设置(或更少option tcplog
)告诉HAProxy在向Syslog发送消息时使用更详细的日志格式。你通常会喜欢option httplog
上option tcplog
你的defaults
部分,因为当HAProxy的遇到frontend
使用mode tcp
,它会发出警告并降级它option tcplog
反正。
如果两者都未指定,则使用连接日志格式,除了客户端和后端IP地址和端口之外,其他细节很少。另一种选择是定义一个自定义日志格式的log-format
设置,在这种情况下option httplog
,并option tcplog
没有必要
frontend
将HAProxy作为反向代理放置在后端服务器前面时,一frontend
节定义客户端可以连接的IP地址和端口。你可以frontend
根据需要添加任意数量的 部分,以便将各种网站暴露给Internet。每个frontend
关键字后面都有 一个标签,例如www.linuxea.com,以区别于其他关键字。
示例:
frontend www.linuxea.com
bind 10.0.0.3:80
bind 10.0.0.3:443 ssl crt /etc/ssl/certs/linuxea.pem
http-request redirect scheme https unless { ssl_fc }
use_backend api_servers if { path_beg /api/ }
default_backend web_servers
含义:
bind
一个bind
设置分配监听到指定的IP地址和端口。可以省略IP以绑定到服务器上的所有IP地址,并且端口可以是单个端口,范围或逗号分隔的列表。你经常使用ssl
和crt
参数来指示HAProxy管理SSL / TLS终止,而不是让你的Web服务器执行此操作。
?如果你已启用HAProxy以通过使用多个进程nbproc
,则可以告诉每个绑定指令将哪个进程与process
参数一起使用。例如,设置process 1
会将侦听器绑定到第一个进程。
http请求重定向
一个http-request redirect
)设置响应客户端,他们应该尝试不同的URL。在我们的示例中,通过非加密HTTP请求你的网站的客户端将重定向到该站点的HTTPS版本。
use_backend
use_backend
如果给定条件为真,则该设置选择后端服务器池以响应传入请求。接下来是一个ACL语句,例如if path_beg /api/
,它允许HAProxy根据某些条件选择特定的后端,例如检查路径是否以/ api /开头。要了解有关ACL的更多信息,请阅读我们的博客文章HAProxy ACL简介。这些行不是必需的,许多前端部分只有default_backend
一行,没有特殊的选择规则。
default_backend
default_backend
几乎每个设置都可以找到该设置,frontend
并且backend
如果use_backend
规则不首先将其发送到其他地方,则会给出要发送流量的名称。如果请求未被use_backend
或default_backend
指令路由,则HAProxy将返回503 Service Unavailable错误
backend
一backend
节定义了一组服务器,这些服务器将进行负载平衡并分配用于处理请求。你将为每个标签添加所选标签backend
,例如web_servers。一般来说,非常简单,你不会经常需要很多设置。
例子:
backend web_servers
balance roundrobin
cookie SERVERUSED insert indirect nocache
option httpchk HEAD /
default-server check maxconn 20
server server1 www.linuxea.com:80 cookie server1
server server2 www.linuxea.com:80 cookie server2
设置:
balance
balance
如果没有持久性方法覆盖该选择,则该设置控制HAProxy如何选择服务器以响应请求。持久性方法可能始终基于cookie将特定客户端发送到同一服务器。常见的负载平衡值包括roundrobin
,它只选择下一个服务器并再次从列表顶部开始,并且leastconn
,其中HAProxy选择具有最少活动会话的服务器。
cookie
该cookie
)设置启用基于cookie的持久性。它告诉HAProxy将一个名为SERVERUSED的cookie发送到客户端,并将其与提供初始响应的服务器的名称相关联。这会导致客户端在其会话期间继续与该服务器通话。请注意,服务器的名称在行cookie
上设置了参数server
option httpchk
该option httpchk
设置使HAProxy将第7层(HTTP)运行状况检查而不是第4层(TCP)检查发送到后端服务器。没有响应的服务器不再提供请求。如果TCP检查能够与后端服务器的IP和端口建立连接,那么TCP检查会成功,而HTTP运行状况检查可以获得成功的HTTP响应。更智能的运行状况检查有助于删除无响应的服务器,即使没有响应意味着只会收到错误的HTTP响应(如500 Server Error)。
默认情况下,HTTP运行状况检查使用OPTIONS谓词向根路径/提出请求。但是,此处指定的参数可以自定义。HAProxy将对任何获得2xx或3xx响应代码的检查进行处理,尽管这也可以使用线路进行自定义。使用不限于使用的后端,因此无论代理模式如何,都可以检查使用HTTP进行通信的服务器。http-check
`option httpchk`mode http
default-server
该default-server
设置为server
随后的任何行配置默认值,例如启用运行状况检查,最大连接等。这可以使你的配置更易于阅读和修改。或者,你可以在每个参数上指定这些参数server
。
server
该server
设置的中心backend
。它的第一个参数是一个名称,后跟后端服务器的IP地址和端口。你可以指定域名而不是IP地址。在这种情况下,它将在启动时解析,或者,如果添加resolvers
参数,它将在运行时更新。如果DNS条目包含SRV记录,则端口和权重也将从中填入。如果未指定端口,则HAProxy将使用客户端连接的相同端口,这对于随机使用的端口(例如活动模式FTP)非常有用。
虽然我们添加了option httpchk
为服务器设置基于HTTP的运行状况检查,但每个服务器必须通过添加check
参数来选择进行运行状况检查。这可以在线上设置,server
或者像我们在本例中所做的那样设置default-server
线。
每一server
行都应该有一个maxconn
)设置,以限制服务器将被给予的最大并发请求数。即使这只是一个猜测,在这里有一个值可以帮助你避免使用请求使服务器饱和,并提供可以在以后调整的基线。在这个例子中,我们已经设置了这个default-server
。
?我们引入了一个名为server-template的新设置,可用于创建占位符服务器,然后服务发现工具可以使用正确的地址和端口填充这些服务器。在我们的博客文章中了解它HAProxy 1.8中的新功能。
list
正如你所看到的,frontend
以及backend
部分接收流量并将其发送到服务器池。你也可以使用listen
部分来执行相同的操作。它们本质上将a frontend
和a的功能结合在一起backend
。你可能更喜欢通过单独frontend
和backend
部分获得的可读性,尤其是在使用带有许多选项的HTTP模式时,或者你可能更喜欢更简洁的配置,从而listen
成为首选方法。在任何一种情况下,你都可以轻松获得HAProxy的全部功能!
以下是listen
用于提供HAProxy Stats页面的简单示例:
listen stats
bind *:8404
stats enable
stats uri /monitor
stats refresh 5s
延伸阅读
https://www.haproxy.com/documentation/hapee/1-8r1/onepage/intro/#3.5https://www.haproxy.com/blog/multithreading-in-haproxy/https://www.haproxy.com/blog/multithreading-in-haproxy/https://www.haproxy.com/blog/the-four-essential-sections-of-an-haproxy-configuration/