在 Ubuntu 14.04 上使用 HAProxy 进行 Web 服务器负载平衡
在此页
- 什么是 HAProxy?
- 安装 HAProxy
- 配置 HAProxy
- 测试负载平衡和故障转移
什么是 HAProxy?

安装 HAProxy
我正在使用 Ubuntu 14.04 并通过以下方式安装它:
apt-get install haproxy
您可以通过以下方式检查版本:
haproxy -v
我们需要通过初始化脚本 /etc/default/haproxy 来启用 HAProxy。将 ENABLED 选项设置为 1 为:
ENABLED=1
要验证此更改是否正确完成,请在不带任何参数的情况下执行 HAProxy 的初始化脚本。您应该看到以下内容:
$ service haproxy <press_tab_key>
reload restart start status stop

配置 HAProxy
通过重命名备份原始文件:
mv /etc/haproxy/haproxy.cfg{,.original}
那么创建我们自己的 haproxy.cfg 文件。使用您最喜欢的文本编辑器创建 /etc/haproxy/haproxy.cfg 文件,如下所示:
global
log /dev/log local0
log 127.0.0.1 local1 notice
maxconn 4096
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
retries 3
option redispatch
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000
listen webfarm 0.0.0.0:80
mode http
stats enable
stats uri /haproxy?stats
balance roundrobin
option httpclose
option forwardfor
server webserver01 192.168.205.16:80 check
server webserver02 192.168.205.17:80 check
解释:
global
log /dev/log local0
log 127.0.0.1 local1 notice
maxconn 4096
user haproxy
group haproxy
daemon
log 指令提到一个系统日志服务器,日志消息将被发送到该服务器。
maxconn 指令指定前端的并发连接数。默认值为 2000,应根据您的系统配置进行调整。
user 和 group 指令将 HAProxy 进程更改为指定的用户/组。这些不应该改变。
defaults
log global
mode http
option httplog
option dontlognull
retries 3
option redispatch
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000
上面的部分有默认值。选项 redispatch 在连接失败的情况下启用会话重新分配。因此,如果 Web 服务器实例出现故障,会话粘性将被覆盖。
retries 指令设置连接失败后在 Web 服务器实例上执行的重试次数。
要修改的值是各种超时指令。 contimeout 选项指定等待与 Web 服务器实例的连接尝试成功的最长时间。
clitimeout 和 srvtimeout 适用于客户端或服务器需要在 TCP 过程中确认或发送数据的情况。 HAProxy 建议将客户端和服务器超时设置为相同的值。
listen webfarm 0.0.0.0:80
mode http
stats enable
stats uri /haproxy?stats
balance roundrobin
option httpclose
option forwardfor
server webserver01 192.168.205.16:80 check
server webserver02 192.168.205.17:80 check
上面的块包含前端和后端的配置。我们正在配置 HAProxy 以侦听 webfarm 的端口 80,这只是一个用于识别应用程序的名称。
stats 指令启用连接统计页面。可以使用 stats uri 中提到的 URL 查看此页面,因此在本例中为 http://192.168.205.15/haproxy?stats 可以在此处查看此页面的演示。
balance 指令指定负载平衡算法使用。可用的算法选项有:
- 循环法(roundrobin),
- 静态循环法(static-rr),
- 最少连接数 (leastconn),
- 来源(来源),
- URI (uri) 和
- URL 参数 (url_param)。
关于每个算法的信息可以从官方文档中获得。
服务器指令声明一个后端服务器,语法是:
server <server_name> <server_address>[:port] [param*]
我们在这里提到的名称将出现在日志和警报中。该指令支持更多参数,我们将在本文中使用检查参数。 check 选项在 web 服务器实例上启用健康检查,否则,web 服务器实例“始终被认为是可用的”。
完成配置后启动 HAProxy 服务:
sudo service haproxy start
测试负载平衡和故障转移
我们将在默认位于 /var/www/index.html 的默认 index.html 文件中附加服务器名称
在实例 2 - Web 服务器 1(具有 IP-192.168.205.16 的 webserver01)上,将以下行附加为:
sudo sh -c "echo \<h1\>Hostname: webserver01 \(192.168.205.16\)\<\/h1\> >> /var/www/index.html"
在实例 3 - Web 服务器 2(具有 IP-192.168.205.17 的 webserver02)上,将以下行附加为:
sudo sh -c "echo \<h1\>Hostname: webserver02 \(192.168.205.17\)\<\/h1\> >> /var/www/index.html"
现在在本地机器上打开网络浏览器并浏览 haproxy IP 即 http://192.168.205.15
每次刷新选项卡时,您都会看到负载正在分配给每个 Web 服务器。下面是我的浏览器截图:
当我第一次访问 http://192.168.205.15 时,我得到:

第二次,即当我刷新页面时,我得到:

您还可以通过访问 http://192.168.205.15/haproxy?stats 查看 haproxy 统计信息
您可以对此设置执行更多操作。一些想法包括:
- 让一个或两个网络服务器离线,以测试当您访问 HAProxy 时会发生什么
- 配置 HAProxy 以提供自定义维护页面
- 配置网络界面,以便您可以直观地监控 HAProxy 统计信息
- 将调度程序更改为循环法以外的其他程序
- 为特定服务器配置优先级/权重
就这样!