CentOS 7 编译安装 HAProxy 2.0

HAProxy 是一种免费、高效且可靠的解决方案, 可为基于 TCP 和 HTTP 的应用程序提供高可用性、负载均衡和代理功能。它特别适用于高流量的网站, 并为世界上许多访问量最大的网站提供支持

为了更好地支持 TLS 1.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

创建 HAProxy 专属用户

useradd -s /sbin/nologin -M haproxy

安装依赖 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: 基本 HTTP 配置

# 全局配置
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

Snipaste_2020-05-09_03-35-34.png

配置文件2: 仅状态页面

# 全局设置
global
    # 以后台进程运行
    daemon
    user haproxy
    # 用户与用户组
    group haproxy
    # 每个进程的最大连接数
    maxconn 3500
    # 进程数, 该值可以设置小于或等于 cpu 核心数
    # balance roundrobin   负载均衡轮询方式
    # balance source       负载均衡类似 nginx 的 ip_hash
    # balance leastconn    负载均衡最小连接
    nbproc 1

# 默认设置
defaults
    # 设置 http (七层模式), 也可设置为 tcp (四层模式)
    # 另外还有一个 Health 健康监测模式
    # 对 mysql 进行负载均衡的话, 这里记得修改为 tcp
    mode http
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms

# 配置 haproxy 管理页面
listen admin_stats
    # 访问端口为 9999
    bind *:9999
    mode http
    # 继承 global 中 log 的定义
    log global
    # 自动刷新时间
    stats refresh 30s
    # 路径为 status, ip+端口+路径即可访问
    stats uri /status
    # 配置管理用户账号密码
    stats auth admin:admin
    # 设置统计页面认证时的提示内容
    stats realm Private lands
    stats admin if TRUE
    # 隐藏统计页面上的 haproxy 版本信息
    stats hide-version

配置文件3: 带状态页面与负载均衡

# 全局配置
global
    # 配置全局日志记录
    # local0 为日志设备
    # notice 为输出的日志级别
    # 127.0.0.1 表示使用本地机器上的 rsyslog 服务中的 local0 设备记录日志等级为 notice 的日志
    # log loghost local0 info 定义 haproxy 日志级别
    log 127.0.0.1 local0 notice
    # 工作目录
    #chroot /usr/local/haproxy-1.5.15
    # 创建 1 个进程进入 deamon 模式运行, 以后台形式运行 harpoxy
    daemon
    # 用户与用户组
    user haproxy
    group haproxy
    # 可以接收的最大并发连接数
    maxconn 20480
    # haproxy 进程 PID 文件
    pidfile /var/run/haproxy.pid

defaults
    # 所处理的类别, tcp 是四层, http 是七层, health 只会返回 OK, 若是混合模式则 mode 不需要设置
    mode http
    # 定义日志, 采用全局定义
    log global
    # 不记录健康检查的日志信息
    option dontlognull
    # 每次请求完毕后主动关闭 http 通道
    option httpclose
    # 日志类别为 http 日志格式
    # 如果是混合模式, 此处还需要加上 tcpclog
    option httplog
    # 后端服务器可以从 Http Header 中获得客户端 IP
    #option forwardfor
    # serverId 对应的服务器挂掉后, 强制定向到其他健康的服务器
    option redispatch
    # 设置默认负载均衡方式, 轮询方式
    balance roundrobin
    # 连接超时
    timeout connect 10s
    # 客户端连接超时
    timeout client 10s
    # 服务器连接超时
    timeout server 10s
    # 健康检测的超时时间
    timeout check 10s
    # 最大连接数
    maxconn 60000
    # 3 次连接失败就为服务不可用
    retries 3

# 统计页面配置
# 为 haproxy 访问状态监控页面配置, 取名为 admin_stats
listen admin_stats
    # 监听端口
    bind 0.0.0.0:8189
    # 启用监听端口
    stats enable
    # http 的 7 层模式
    mode http
    # 继承 global 中 log 的定义
    log global
    # 页面自动刷新时间 30s
    stats refresh 30s
    # 监控页面的 url 访问路径, 即 http://ip/stats 访问监控页面
    stats uri /stats
    # 监控页面的用户和密码 admin, 可以设置多个用户名
    stats auth admin:admin
    # 监控页面的密码框提示信息
    stats realm Haproxy Statistics
    # 隐藏统计页面上 HAProxy 的版本信息
    stats admin if TRUE
    #stats hide-version
    # 当通过认证才可管理

# web 设置
# 定义 webcluster 服务器组
listen webcluster
    # 定义 haproxy 前端部分监听的端口
    bind 0.0.0.0:81
    # http 的 7 层模式
    mode http
    # 心跳检测 7 层访问
    #option httpchk GET /index.html
    # 继承 global 中 log 的定义
    log global
    # server 进程可接受的最大并发连接数
    maxconn 3000
    # 负载均衡的方式: 轮询
    balance roundrobin
    # 根据 cookie 轮询
    cookie SESSION_COOKIE insert indirect nocache
    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

1131047-20190716175656663-727959601.png

1131047-20190716175715859-162631256.png

1131047-20190716175736473-963286316.png

配置文件4: TCP + TLS + Web

这是我使用的配置文件, TCP + TLS + Web 方案

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
    # 统计页面 url
    stats uri /stats
    # 统计页面密码框上提示文本
    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 -c -f /etc/haproxy/haproxy.cfg

启动 HAProxy

/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg

访问 Web UI 状态页面

http://<your-ip>:1080/stats

Snipaste_2020-05-09_02-52-38.png

设置系统服务

创建服务文件

创建 HAProxy 的 systemd 服务文件, 编辑文件 /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
# ExecReload=/bin/kill -USR2 $MAINPID
ExecReload=/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg -sf $(cat /var/run/haproxy.pid)
# ExecStop=cd&&/usr/local/haproxy/sbin/&&pkill haproxy
KillMode=mixed
Restart=always

[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

最后更新于 2022-02-20
使用 Hugo 构建
主题 StackJimmy 设计