HAProxy是一种免费,非常快速且可靠的解决方案,可为基于TCP和HTTP的应用程序提供 高可用性, 负载平衡和代理。它特别适合于流量非常高的网站,并为世界上许多访问量最大的网站提供支持。
为了较好的支持 TLS1.3,HAProxy 版本应大于 1.8.15,OpenSSl 版本应大于 1.1.1,如果您使用的发行版仓库自带的版本较低,由于软件仓库的版本太低, 所以使用编译安装.
HAProxy 2.0.14
OpenSSL 1.1.1g
Lua 5.3.5
zlib 系统软件仓
pcre 系统软件仓
一 首先安装基础环境, 和编译依赖文件
yum groupinstall "Development Tools"
yum install -y pcre-devel zlib-devel bzip2-devel systemd-devel readline-devel gcc gcc-c++ make
# 创建专属用户
useradd -s /sbin/nologin -M haproxy
二 下载安装 HAProxy | OpenSSL | Lua
OpenSSL 1.1.1g
wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz
tar -xf openssl-1.1.1g.tar.gz
cd openssl-1.1.1g
less INSTALL
./config --prefix=/usr/local/openssl --openssldir=/usr/local/ssl
make
make test
make install
echo /usr/local/openssl/lib >> /etc/ld.so.conf.d/openssl.conf
ldconfig
/usr/local/openssl/bin/openssl version -a
Lua 5.3.5
wget http://www.lua.org/ftp/lua-5.3.5.tar.gz
tar -xf lua-5.3.5.tar.gz
cd lua-5.3.5
make linux
make install INSTALL_TOP=/usr/local/lua
HAProxy 2.0.14
HAProxy 快速安装说明
wget http://www.haproxy.org/download/2.0/src/haproxy-2.0.14.tar.gz
tar -xf haproxy-2.0.14.tar.gz
cd haproxy-2.0.14
make TARGET=linux-glibc PREFIX=/usr/local/haproxy USE_OPENSSL=1 USE_ZLIB=1 USE_PCRE=1 USE_SYSTEMD=1 SSL_INC=/usr/local/openssl/include SSL_LIB=/usr/local/openssl/lib USE_LUA=1 LUA_LIB=/usr/local/lua/lib/ LUA_INC=/usr/local/lua/include/
make install PREFIX=/usr/local/haproxy
/usr/local/haproxy/sbin/haproxy -vv
创建 HAProxy 配置文件
mkdir /etc/haproxy
vim /etc/haproxy/haproxy.cfg
一些配置文件例子
配置文件1
#全局配置
global
#设置日志
log 127.0.0.1 local3 info
chroot /usr/local/haproxy
#用户与用户组
user haproxy
group haproxy
#守护进程启动
daemon
#最大连接数
maxconn 4000
#默认配置
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
listen stats
bind 0.0.0.0:1080 #监听端口
stats refresh 30s #统计页面自动刷新时间
stats uri /stats #统计页面url
stats realm Haproxy Manager #统计页面密码框上提示文本
stats auth admin:admin #统计页面用户名和密码设置
#stats hide-version #隐藏统计页面上HAProxy的版本信息
#前端配置,http_front名称可自定义
frontend http_front
# 发起http请求道80端口,会被转发到设置的ip及端口
bind *:80
#haproxy的状态管理页面,通过/haproxy?stats来访问
stats uri /haproxy?stats
default_backend http_back
#后端配置,http_back名称可自定义
backend http_back
#负载均衡方式
#source 根据请求源IP
#static-rr 根据权重
#leastconn 最少连接者先处理
#uri 根据请求的uri
#url_param 根据请求的url参数
#rdp-cookie 据据cookie(name)来锁定并哈希每一次请求
#hdr(name) 根据HTTP请求头来锁定每一次HTTP请求
#roundrobin 轮询方式
balance roundrobin
#设置健康检查页面
option httpchk GET /index.html
#传递客户端真实IP
option forwardfor header X-Forwarded-For
# inter 2000 健康检查时间间隔2秒
# rise 3 检测多少次才认为是正常的
# fall 3 失败多少次才认为是不可用的
# weight 30 权重
# 需要转发的ip及端口
server node1 192.168.0.4:80 check inter 2000 rise 3 fall 3 weight 30
server node2 192.168.0.5:80 check inter 2000 rise 3 fall 3 weight 30
配置文件2
global
#全局设置
daemon
#以后台进程运行
user haproxy
#运行于haproxy用户
group haproxy
#运行于haproxy组
maxconn 3500
#每个进程的最大连接数
nbproc 1
#进程数,该值可以设置小于或等于cpu核心数
#balance roundrobin
#默认的负载均衡的方式,轮询方式
#balance source
#默认的负载均衡的方式,类似nginx的ip_hash
#balance leastconn
#默认的负载均衡的方式,最小连接
defaults
#默认设置
mode http
#设置http(七层模式),也可设置为tcp(四层模式),另外还有一个Health健康监测模式。对mysql进行负载均衡的话,这里记得修改为tcp
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
listen admin_stats #配置haproxy管理页面
bind *:9999
#访问端口为9999
mode http
log global
# 继承global中log的定义
stats refresh 30s
#自动刷新时间
stats uri /stats
#项目名为status,ip+端口+项目名即可访问
stats auth admin:admin
#配置管理用户账号密码
stats realm Private lands
# 设置统计页面认证时的提示内容
stats admin if TRUE
stats hide-version
#隐藏统计页面上的haproxy版本信息
配置文件3
#--------------全局配置----------------
global
log 127.0.0.1 local0 notice #配置全局日志记录,local0为日志设备,notice为输出的日志级别,表示使用本地(127.0.0.1)机器上的rsyslog服务中的local0设备记录日志等级为notice的日志。
#log loghost local0 info #定义haproxy 日志级别
maxconn 20480 #可以接收的最大并发连接数
#chroot /usr/local/haproxy-1.5.15 #工作目录
pidfile /var/run/haproxy.pid #haproxy 进程PID文件
#maxconn 4000 #最大连接数
user haproxy #运行的程序用户
group haproxy #运行的程序用户组
daemon #创建1个进程进入deamon模式运行,以后台形式运行harpoxy
#---------------------------------------------------------------------
#common defaults that all the 'listen' and 'backend' sections will
#use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http #所处理的类别,tcp是四层,http是七层,health只会返回OK,若是混合模式则mode不需要设置
log global #定义日志,采用全局定义
option dontlognull #不记录健康检查的日志信息
option httpclose #每次请求完毕后主动关闭http通道
option httplog #日志类别为http日志格式;如果是混合模式,此处还需要加上tcpclog
#option forwardfor #后端服务器可以从Http Header中获得客户端ip
option redispatch #serverId对应的服务器挂掉后,强制定向到其他健康的服务器
balance roundrobin #设置默认负载均衡方式,轮询方式
timeout connect 10s #连接超时
timeout client 10s #客户端连接超时
timeout server 10s #服务器连接超时
timeout check 10s #健康检测的超时时间
maxconn 60000 #最大连接数
retries 3 #3次连接失败就为服务不可用
#--------------统计页面配置------------------
listen admin_stats #为haproxy访问状态监控页面配置,取名为admin_stats
bind 0.0.0.0:8189 #监听端口
stats enable #启用监听端口
mode http #http的7层模式
log global # 继承global中log的定义
stats uri /stats #监控页面的url访问路径,即http://ip/stats访问监控页面
stats realm Haproxy\ Statistics #监控页面的密码框提示信息
stats auth admin:admin #监控页面的用户和密码admin,可以设置多个用户名
#stats hide-version #隐藏统计页面上HAProxy的版本信息
stats admin if TRUE #当通过认证才可管理
stats refresh 30s #页面自动刷新时间30s
#---------------web设置-----------------------
listen webcluster #定义webcluster服务器组。
bind 0.0.0.0:81 #定义haproxy前端部分监听的端口。
mode http #http的7模式
#option httpchk GET /index.html #心跳检测7层访问
log global #继承global中log的定义
maxconn 3000 #server进程可接受的最大并发连接数
balance roundrobin #负载均衡的方式:轮询
cookie SESSION_COOKIE insert indirect nocache #根据cookie轮询
server web01 10.6.76.27:1988 check inter 2000 fall 5
server web02 10.6.76.28:1988 check inter 2000 fall 5
#server web01 192.168.80.102:80 cookie web01 check inter 2000 fall 5
#server web02 192.168.80.103:80 cookie web01 check inter 2000 fall 5
我使用的配置文件 ( 测试环境 )
global
log /dev/log local0
log /dev/log local1 notice
chroot /usr/local/haproxy
#stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
#stats timeout 30s
user haproxy
group haproxy
daemon
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# 仅使用支持 FS 和 AEAD 的加密套件
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
# 禁用 TLS 1.2 之前的 TLS
ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11
tune.ssl.default-dh-param 2048
defaults
log global
# 我们需要使用 tcp 模式
mode tcp
option dontlognull
timeout connect 5s
# 空闲连接等待时间,这里使用与 V2Ray 默认 connIdle 一致的 300s
timeout client 300s
timeout server 300s
listen stats
bind 0.0.0.0:1080 #监听端口
stats enable
mode http
stats refresh 30s #统计页面自动刷新时间
stats uri /stats #统计页面url
stats realm Haproxy Manager #统计页面密码框上提示文本
stats auth admin:admin #统计页面用户名和密码设置
frontend tls-in
# 监听 443 tls,tfo 根据自身情况决定是否开启,证书放置于 /etc/ssl/private/example.com.pem
bind *:443 tfo ssl crt /root/com.pem
tcp-request inspect-delay 5s
tcp-request content accept if HTTP
# 将 HTTP 流量发给 web 后端
use_backend web if HTTP
# 将其他流量发给 vmess 后端
default_backend vmess
backend web
server server1 127.0.0.1:8080
backend vmess
server server1 127.0.0.1:40001
测试配置文件
启动命令
/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
web-ui 的状态页面
xxx.xxx.xxx.xxx:1080/stats
设置系统启动
vim /lib/systemd/system/haproxy.service
[Unit]
Description=Haproxy Service
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
ExecStop=cd&&/usr/local/haproxy/sbin/&&pkill haproxy
[Install]
WantedBy=multi-user.target
创建软连
ln -s /lib/systemd/system/haproxy.service /etc/systemd/system/multi-user.target.wants/haproxy
# 重新载入配置文件
systemctl daemon-reload
# 启动haproxy
systemctl start haproxy
# 停止haproxy
systemctl stop haproxy
# 加入系统启动
systemctl enable haproxy
# 查看haproxy是否运行
ps -ef|grep haproxy
haproxy 74886 1 0 07:59 ? 00:00:00 /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
haproxy 74948 1 0 08:00 ? 00:00:00 /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
root 74965 74037 0 08:03 pts/2 00:00:00 grep --color=auto haproxy
centos7下haproxy2.0加lua编译安装并加入系统启动
Haproxy在centos7下的安装及配置
centos7编译安装haproxy