CentOS 7 编译安装 haproxy 2.0

标签: none

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

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

配置文件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

1131047-20190716175656663-727959601.png

1131047-20190716175715859-162631256.png

1131047-20190716175736473-963286316.png

我使用的配置文件 ( 测试环境 )

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   #统计页面自动刷新时间 
    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

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

设置系统启动

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


扫描二维码,在手机上阅读!

添加新评论