HAProxy简介

HAProxy是法国开发者Willy Tarreau在2000年使用C语言开发的一个开源软件,是一款具备高并发(一万以上)、高性能的TCP和HTTP负载均衡器,支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计。从2013年HAProxy分为社区版和企业版,企业版将提供更多的特性和功能以及全天24小时的技术支持等服务。

企业版

https://www.haproxy.com

社区版

http://www.haproxy.org

https://github.com/haproxy

HAProxy功能

支持功能

  • TCP 和 HTTP反向代理
  • SSL/TSL服务器
  • 可以针对HTTP请求添加cookie,进行路由后端服务器
  • 可平衡负载至后端服务器,并支持持久性连接
  • 支持所有主服务器故障切换至备用服务器
  • 支持专用端口实现监控服务
  • 支持停止接收新连接请求,而不影响现有连接
  • 可以双向添加,修改或删除HTTP报文首部
  • 响应报文压缩
  • 支持基于pattern实现连接请求的访问控制
  • 通过特定的URI为授权用户提供详细的状态信息
  • 支持HTTP反向代理
  • 支持动态程序的反向代理
  • 支持基于数据库的反向代理

不具备的功能

  • 正向代理 squid,nginx
  • 缓存代理 varnish
  • web服务 nginx,tengine,apache,PHP,Tomcat
  • UDP 目前不支持UDP协议
  • 单机性能 相比LVS性能较差

HAProxy编译安装

编译安装haproxy-2.4.3LTS版本,更多源码包下载地址 http://www.haproxy.org/#down

准备lua环境

HAProxy支持基于lua实现功能扩展,lua是一种小巧的脚本语言,与1993年由巴西里约热内卢天主教大学里的一个研究小组开发,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

Lua官网:www.lua.org

Lua应用场景

  • 游戏开发
  • 独立应用脚本
  • web应用脚本
  • 扩展和数据库插件,如mysql proxy
  • 安全系统,如入侵检测系统

centos基础环境

参考:http://www.lua.org/start.html

由于centos7之前版本自带的lua版本比较低,不符合HAProxy要求的lua最低版本(5.3)的要求,因此需要编译安装较新版本的lua环境,然后才能编译安装HAProxy,过程如下

# 查看当前版本
lua -v

# 安装基础命令及编译依赖环境
yum install -y gcc redline-devel
curl -R -O http://www.lua.org/ftp/lua-5.4.3.tar.gz
tar zxf lua-5.4.3.tar.gz
cd lua-5.4.3
make all

# 删除原有的链接
rm -rf /usr/bin/lua /usr/bin/luac

# 新建链接
ln -s /software/lua-5.4.3/src/lua /usr/bin/
ln -s /software/lua-5.4.3/src/luac /usr/bin/

开始编译安装HAProxy

# 安装依赖
yum install -y gcc openssl-devel pcre-devel systemd-devel

# 上传并解压 haproxy-2.4.3
tar -zxvf haproxy-2.4.3.tar.gz
cd haproxy-2.4.3

# 查看安装方法
cat README
cat INSTALL

# 参考INSTALL文件进行编译安装
make clean
make -j $(nproc) TARGET=linux-glibc USE_OPENSSL=1 USE_LUA=1 USE_PCRE=1 USE_SYSTEMD=1 USE_ZLIB=1 LUA_INC=/mitr/software/lua-5.4.3/src LUA_LIB=/mitr/software/lua-5.4.3/src PREFIX=/usr/haproxy
make install PREFIX=/usr/haproxy

!!!!!ln -s /usr/haproxy/sbin/haproxy /usr/bin/
!!!!!cp /usr/haproxy/sbin/haproxy /usr/bin/

# 查看生成的文件
yum install -y tree
tree /usr/haproxy/

/usr/haproxy/
├── doc
│   └── haproxy
│   ├── 51Degrees-device-detection.txt
│   ├── architecture.txt
│   ├── close-options.txt
│   ├── configuration.txt
│   ├── cookie-options.txt
│   ├── DeviceAtlas-device-detection.txt
│   ├── intro.txt
│   ├── linux-syn-cookies.txt
│   ├── lua.txt
│   ├── management.txt
│   ├── netscaler-client-ip-insertion-protocol.txt
│   ├── network-namespaces.txt
│   ├── peers.txt
│   ├── peers-v2.0.txt
│   ├── proxy-protocol.txt
│   ├── regression-testing.txt
│   ├── seamless_reload.txt
│   ├── SOCKS4.protocol.txt
│   ├── SPOE.txt
│   └── WURFL-device-detection.txt
├── sbin
│   └── haproxy
└── share
└── man
└── man1
└── haproxy.1
6 directories, 22 files

# 验证HAProxy并查看版本及用法
haproxy -V
haproxy -vv

HAProxy配置文件

# 查看配置文件范例
tree haproxy-2.4.3/examples/

haproxy-2.4.3/examples/
├── acl-content-sw.cfg
├── basic-config-edge.cfg
├── content-sw-sample.cfg
├── errorfiles
│   ├── 400.http
│   ├── 403.http
│   ├── 408.http
│   ├── 500.http
│   ├── 502.http
│   ├── 503.http
│   ├── 504.http
│   └── README
├── haproxy.init
├── option-http_proxy.cfg
├── quick-test.cfg
├── socks4.cfg
├── transparent_proxy.cfg
└── wurfl-example.cfg

1 directory, 17 files

# 创建自定义文件夹
mkdir /etc/haproxy

# 编辑配置文件
vim /etc/haproxy/haproxy.cfg

# 添加内容如下
global
chroot /usr/haproxy
daemon
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
user root
group root
maxconn 100000
pidfile /var/lib/haproxy/haproxy.pid
log 127.0.0.1 local3 info

defaults
option http-keep-alive
option forwardfor
maxconn 100000
mode http
timeout client 300000ms
timeout server 300000ms
timeout connect 300000ms

listen stats
mode http
bind 0.0.0.0:9999
stats enable
log global
stats uri /haproxy-status
stats auth admin:123456

HAProxy启动文件

# 新建启动文件
vim /etc/systemd/system/haproxy.service

# 内容如下
[Unit]
Description=HAProxy Load Balancer
After=network-online.target
[Service]
ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target

# 新建存放haproxy.pid的目录
mkdir /var/lib/haproxy/

# 设置开机自启并启动
systemctl enable --now haproxy

HAProxy基础配置详解

HAProxy的配置文件haproxy.cfg由两大部分组成,分别是global和proxies

  • global 全局配置段:
    • 进程及安全配置相关的参数
    • 性能调整相关参数
    • Debug参数
  • proxies 代理配置段
    • defaults:为frontend,backend,listen提供默认配置
    • frontend:前端,相当于nginx中的server {}
    • backend:后端,相当于nginx中的upstream {}
    • listen:同时拥有前端和后端配置,配置简单,生产推荐使用
global配置参数说明

官方文档:http://cbonte.github.io/haproxy-dconv/2.1/configuration.html#3

# 锁定运行目录
chroot

# 以守护进程运行
deamon

# socket文件
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin process 1

# 运行HAProxy的用户身份
user,group,uid,gid

# 开启的haproxy work进程数,默认进程数是1
nbproc n

# 指定每个haproxy进程开启的线程数,默认为每个进程一个线程
nbthread 1

# 绑定haproxy worker进程至指定CPU,将第2个work进程绑定至0号CPU
cpu-map 1 0
# 绑定haproxy worker进程至指定CPU,将第2个work进程绑定至1号CPU
cpu-map 2 1

# 每个haproxy进程的最大并发连接数
maxconn n

# 每个haproxy进程ssl最大连接数,用于haproxy配置了证书的场景下
maxsslconn n

# 每个进程每秒创建的最大连接数
maxconnrate n

# 后端server状态check随机提前或延迟百分比时间,建议2-5(20%-50%)之间,默认0
spread-checks n

# 指定pid文件路径
pidfile

# 定义全局的syslog服务器:日志服务器需要开启UDP协议,最多可以定义两个
log 127.0.0.1 local2 info

多进程和线程

范例:多进程和socket文件

vim /etc/haproxy/haproxy.cfg

# 配置如下
global
maxconn 100000
chroot /usr/haproxy
stats socket /var/lib/haproxy/haproxy.sock1 mode 600 level admin process 1
stats socket /var/lib/haproxy/haproxy.sock2 mode 600 level admin process 2
uid 99
gid 99
daemon
nbproc 2

# 重启haproxy
systemctl restart haproxy

HAProxy日志配置

HAProxy本身不记录客户端的访问日志,此外为减少服务器负载,一般生产中HAProxy不记录日志,也可以配置HAProxy利用rsyslog服务记录日志到指定文件中

# 在global配置项定义 
# 基于syslog记录日志到指定设备,级别(err、warning、info、debug)
# log 127.0.0.1 local{1-7} info
log 127.0.0.1 local3 info

listen web_port
bind 127.0.0.1:80
mode http
# 开启当前web_port的日志功能,默认不记录日志
log global
server web1 127.0.0.1:8080 check inter 3000 fall 2 rise 5

# 重启haproxy
systemctl restart haproxy
Rsyslog配置
# 修改rsyslog.conf
vim /etc/rsyslog.conf

# 编辑内容如下
$ModLoad imudp
$UDPServerRun 514
local3.* /var/log/haproxy.log

# 重启rsyslog
systemctl restart rsyslog

# rsyslog日志级别说明:
emerg 0 系统不可用
alert 1 必须马上采取行动的事件
crit 2 关键的事件
err 3 错误事件
warning 4 警告事件
notice 5 普通但重要的事件
info 6 有用的信息
debug 7 调试信息