Haproxy是一款支持4层和7层应用的高性能负载均衡器。 使用Haproxy可以实现基于TCP和Http应用代理的解决方案。

编译安装

1wget http://www.haproxy.org/download/1.7/src/haproxy-<version>.tar.gz
2tar -zxvf haproxy-<version>.tar.gz
3cd haproxy-<version>
4make TARGET=linux2628 ARCH=x86_64
5make install PREFIX=/usr/local/haproxy

查看make install的输出如果没有安装haproxy-systemd-wrapper的话,从源码路径下将其手动拷贝到/usr/local/haproxy/sbin下。

  • PREFIX 为指定的安装路径
  • TARGET则根据当前操作系统内核版本指定
    • linux26 for Linux 2.6 and above
    • linux2628 for Linux 2.6.28, 3.x, and above (enables splice and tproxy)

配置文件

创建/usr/local/haproxy/etc/haproxy.cfg配置文件

 1global
 2    log         127.0.0.1 local2 #使用系统的syslog记录日志
 3    pidfile     /var/run/haproxy.pid
 4    maxconn     4000 #限制单个进程的最大连接数
 5    user        haproxy #用户和用户组,需手动添加
 6    group       haproxy
 7    daemon #进程在后台作为守护进程运行
 8
 9defaults
10    mode                    http
11    log                     global
12    option                  httplog
13    option                  dontlognull
14    option http-server-close
15    option forwardfor       except 127.0.0.0/8  #在http请求头中添加X-Forwarded-For,把客户端IP发送给服务器
16    option                  redispatch  #当客户端连接到出现故障的服务器时,将请求转发给其他机器
17    retries                 3
18    timeout http-request    10s
19    timeout queue           1m
20    timeout connect         10s #连接server超时时间
21    timeout client          1m  #客户端相应超时时间
22    timeout server          1m  #server端响应超时时间
23    timeout http-keep-alive 10s
24    timeout check           10s
25    maxconn                 3000
26
27frontend  main #接收请求的前端虚拟节点
28    bind 0.0.0.0:5000
29    acl url_static       path_beg       -i /static /images /javascript /stylesheets
30    acl url_static       path_end       -i .jpg .gif .png .css .js
31    use_backend static          if url_static
32    default_backend             app
33
34backend static
35    balance     roundrobin
36    server      static 127.0.0.1:4331 check
37
38backend app #后端服务集群配置,一个backend对应一个或者多个实体服务器
39    balance     roundrobin
40    server  app1 127.0.0.1:5001 check
41    server  app2 127.0.0.1:5002 check
42    server  app3 127.0.0.1:5003 check
43    server  app4 127.0.0.1:5004 check

启动

命令行启动:

1./haproxy -D -f /usr/local/haproxy/etc/haproxy.cfg

/usr/lib/systemd/system/haproxy.service

 1[Unit]
 2Description=HAProxy Load Balancer
 3After=syslog.target network.target
 4
 5[Service]
 6EnvironmentFile=-/etc/sysconfig/haproxy
 7ExecStart=/usr/local/haproxy/sbin/haproxy-systemd-wrapper -f /usr/local/haproxy/etc/haproxy.cfg -p /run/haproxy.pid $OPTIONS
 8ExecReload=/bin/kill -USR2 $MAINPID
 9
10[Install]
11WantedBy=multi-user.target

日志

Haproxy默认不会直接输出文件日志,需要借助Linux的rsyslog输出日志。

在haproxy.cfg配置文件中global和defaults域中添加如下字段:

 1global
 2    ......
 3    log 127.0.0.1 local0 info
 4    log 127.0.0.1 local1 warning
 5    ......
 6
 7defaults
 8    ......
 9    log global
10    ......

global中的配置,是将info级别及以上的日志输出到rsyslog的local0接口,将warn级别及以上的日志输出到rsyslog。 info会打印每个请求的日志,生产环境中建议将日志级别设置为notice

为ryslog添加haproxy日志的配置/etc/rsyslog.d/haproxy.cfg

1$ModLoad imudp
2$UDPServerRun 514
3$FileCreateMode 0644  #日志文件的权限
4$FileOwner root  #日志文件的owner
5local0.*     /var/log/haproxy.log  #local0接口对应的日志输出文件
6local1.*     /var/log/haproxy_warn.log  #local1接口对应的日志输出文件

修改ryslog的启动参数/etc/sysconfig/rsyslog:

1SYSLOGD_OPTIONS="-c 2 -r -m 0"

重启rsyslog:

1systemctl restart rsyslog

重启haproxy后日志生效。

关键参数

  • maxconn 设置每个进程并发连接的最大数量,当连接到达此数量时,代理服务器将停止接受请求。建议ulimit -n大于maxconn*2,设置较大的maxconn时,需要修改ulimit -n参数。
  • noepoll 在linux上禁止epoll

参考