Haproxy是一款支持4层和7层应用的高性能负载均衡器。 使用Haproxy可以实现基于TCP和Http应用代理的解决方案。
编译安装
wget http://www.haproxy.org/download/1.7/src/haproxy-<version>.tar.gz
tar -zxvf haproxy-<version>.tar.gz
cd haproxy-<version>
make TARGET=linux2628 ARCH=x86_64
make 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配置文件
global
log 127.0.0.1 local2 #使用系统的syslog记录日志
pidfile /var/run/haproxy.pid
maxconn 4000 #限制单个进程的最大连接数
user haproxy #用户和用户组,需手动添加
group haproxy
daemon #进程在后台作为守护进程运行
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8 #在http请求头中添加X-Forwarded-For,把客户端IP发送给服务器
option redispatch #当客户端连接到出现故障的服务器时,将请求转发给其他机器
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s #连接server超时时间
timeout client 1m #客户端相应超时时间
timeout server 1m #server端响应超时时间
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
frontend main #接收请求的前端虚拟节点
bind 0.0.0.0: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
backend static
balance roundrobin
server static 127.0.0.1:4331 check
backend app #后端服务集群配置,一个backend对应一个或者多个实体服务器
balance roundrobin
server app1 127.0.0.1:5001 check
server app2 127.0.0.1:5002 check
server app3 127.0.0.1:5003 check
server app4 127.0.0.1:5004 check启动
命令行启动:
./haproxy -D -f /usr/local/haproxy/etc/haproxy.cfg/usr/lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
EnvironmentFile=-/etc/sysconfig/haproxy
ExecStart=/usr/local/haproxy/sbin/haproxy-systemd-wrapper -f /usr/local/haproxy/etc/haproxy.cfg -p /run/haproxy.pid $OPTIONS
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target日志
Haproxy默认不会直接输出文件日志,需要借助Linux的rsyslog输出日志。
在haproxy.cfg配置文件中global和defaults域中添加如下字段:
global
......
log 127.0.0.1 local0 info
log 127.0.0.1 local1 warning
......
defaults
......
log global
......global中的配置,是将info级别及以上的日志输出到rsyslog的local0接口,将warn级别及以上的日志输出到rsyslog。 info会打印每个请求的日志,生产环境中建议将日志级别设置为notice
为ryslog添加haproxy日志的配置/etc/rsyslog.d/haproxy.cfg
$ModLoad imudp
$UDPServerRun 514
$FileCreateMode 0644 #日志文件的权限
$FileOwner root #日志文件的owner
local0.* /var/log/haproxy.log #local0接口对应的日志输出文件
local1.* /var/log/haproxy_warn.log #local1接口对应的日志输出文件修改ryslog的启动参数/etc/sysconfig/rsyslog:
SYSLOGD_OPTIONS="-c 2 -r -m 0"重启rsyslog:
systemctl restart rsyslog重启haproxy后日志生效。
关键参数
- maxconn 设置每个进程并发连接的最大数量,当连接到达此数量时,代理服务器将停止接受请求。建议
ulimit -n大于maxconn*2,设置较大的maxconn时,需要修改ulimit -n参数。 - noepoll 在linux上禁止epoll