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
tar -zxvf haproxy-2.4.3.tar.gz cd haproxy-2.4.3
cat README cat 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 -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
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
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin process 1
user,group,uid,gid
nbproc n
nbthread 1
cpu-map 1 0
cpu-map 2 1
maxconn n
maxsslconn n
maxconnrate n
spread-checks n
pidfile
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
systemctl restart haproxy
|
HAProxy日志配置
HAProxy本身不记录客户端的访问日志,此外为减少服务器负载,一般生产中HAProxy不记录日志,也可以配置HAProxy利用rsyslog服务记录日志到指定文件中
log 127.0.0.1 local3 info
listen web_port bind 127.0.0.1:80 mode http log global server web1 127.0.0.1:8080 check inter 3000 fall 2 rise 5
systemctl restart haproxy
|
Rsyslog配置
vim /etc/rsyslog.conf
$ModLoad imudp $UDPServerRun 514 local3.* /var/log/haproxy.log
systemctl restart rsyslog
emerg 0 系统不可用 alert 1 必须马上采取行动的事件 crit 2 关键的事件 err 3 错误事件 warning 4 警告事件 notice 5 普通但重要的事件 info 6 有用的信息 debug 7 调试信息
|