Aldebaran

人生最棒的感觉,就是你做到别人说你做不到的事。

0%

HAProxy 1.8入门指南

指原莉乃

前言

HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。

安装

正常安装

默认情况下haproxy不会对系统和CPU做优化,因此如果有必要还是可以用uname先查看一下

$ uname -r

下面是HAProxy 1.8支持的 OS。

To build haproxy, you have to choose your target OS amongst the following ones
and assign it to the TARGET variable :

- linux22     for Linux 2.2
- linux24     for Linux 2.4 and above (default)
- linux24e    for Linux 2.4 with support for a working epoll (> 0.21)
- linux26     for Linux 2.6 and above
- linux2628   for Linux 2.6.28, 3.x, and above (enables splice and tproxy)
- solaris     for Solaris 8 or 10 (others untested)
- freebsd     for FreeBSD 5 to 10 (others untested)
- netbsd      for NetBSD
- osx         for Mac OS/X
- openbsd     for OpenBSD 5.7 and above
- aix51       for AIX 5.1
- aix52       for AIX 5.2
- cygwin      for Cygwin
- haiku       for Haiku
- generic     for any other OS or version.
- custom      to manually adjust every setting

安装

$ yum install -y gcc pcre-devel openssl openssl-devel make psmisc systemd-devel
$ cd /usr/local/src
$ wget https://www.haproxy.org/download/1.8/src/haproxy-1.8.21.tar.gz
$ tar xf haproxy-1.8.21.tar.gz && cd /usr/local/src/haproxy-1.8.21
$ make TARGET=linux2628 USE_OPENSSL=1 ADDLIB=-ldl USE_ZLIB=1 USE_PCRE=1 USE_SYSTEMD=1
$ make install PREFIX=/usr/local/haproxy-1.8.21
$ ln -s /usr/local/haproxy-1.8.21 /usr/local/haproxy

自定义Openssl(可选)

系统版本自带的openssl通常比较旧(可能会有一下安全漏洞是没有解决的),可以考虑自己编一个。

要针对haproxy静态链接OpenSSL,请使用no-shared 关键字构建OpenSSL并将其安装到本地目录,这样您的系统就不会受到影响:

安装openssl

# 下载openssl(注意:目前haproxy1.8是不支持openssl-1.1.x的)
$ cd /usr/local/src
$ wget https://www.openssl.org/source/openssl-1.0.2t.tar.gz

$ tar xf openssl-1.0.2t.tar.gz && cd /usr/local/src/openssl-1.0.2t
$ export STATICLIBSSL=/usr/local/src/staticlibssl/openssl-1.0.2t
$ ./config --prefix=$STATICLIBSSL no-shared
$ make && make install_sw

安装

$ yum install -y gcc pcre-devel make psmisc systemd-devel
$ cd /usr/local/src
$ wget https://www.haproxy.org/download/1.8/src/haproxy-1.8.21.tar.gz
$ tar xf haproxy-1.8.21.tar.gz && cd /usr/local/src/haproxy-1.8.21
$ make TARGET=linux2628 \
    USE_OPENSSL=1 \
    SSL_INC=$STATICLIBSSL/include \
    SSL_LIB=$STATICLIBSSL/lib \
    ADDLIB=-ldl \
    USE_ZLIB=1 \
    USE_PCRE=1 \
    USE_SYSTEMD=1
$ make install PREFIX=/usr/local/haproxy-1.8.21
$ ln -s /usr/local/haproxy-1.8.21 /usr/local/haproxy

初始化

查看版本号和编译参数

$ /usr/local/haproxy/sbin/haproxy -vv

初始化环境

$ sudo mkdir -p /usr/local/haproxy/etc/
$ sudo mkdir -p /var/lib/haproxy
$ sudo useradd -s /sbin/nologin haproxy
$ chown haproxy:haproxy -R /usr/local/haproxy

拷贝启动脚本(该脚本需要额外修改一下))

$ cp /usr/local/src/haproxy-1.8.21/contrib/systemd/haproxy.service.in /usr/lib/systemd/system/haproxy.service

配置文件

常用的配置文件

$ vim /usr/local/haproxy/etc/haproxy.cfg 

# 用于设置全局配置参数
global
        log             127.0.0.1 local3 warning

        # 每个进程可用的最大连接数
        maxconn         50000

        # 设置进程数量
        nbproc          4

        user             haproxy
        group            haproxy

        daemon

        chroot          /usr/local/haproxy/
        pidfile         /var/run/haproxy.pid

        ssl-default-bind-options no-sslv3 no-tls-tickets force-tlsv12
        ssl-default-bind-ciphers EECDH+AESGCM:EDH+AESGCM
        tune.ssl.default-dh-param 2048


# 默认参数的配置部分。
defaults
        log           global
        mode          tcp

        # 是否允许重新分配在session 失败后
        option        redispatch

        # # 如果服务器上的应用程序想记录发起请求的客户端的IP地址,需要在HAProxy上配置此选项,这样HAProxy会把客户端的IP信息发送给服务器,在HTTP请求中添加"X-Forwarded-For"字段
        # # 仅仅适用于http模式
        # option       forwardfor

        # # 表示开始打开记录http请求的日志功能
        # # 仅仅适用于http模式
        # option       httplog

        # 保证HAProxy不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包。
        option       dontlognull

        # 丢弃由于客户端等待时间过长而关闭连接但仍在haproxy等待队列中的请求
        # 当haproxy负载很高时,自动结束掉当前队列处理比较久的链接。
        option       abortonclose

        # HAProxy会针对客户端的第一条请求的返回添加cookie并返回给客户端,客户端发送后续请求时会发送此cookie到HAProxy,HAProxy会针对此cookie分发到上次处理此请求的服务器上,如果服务器不能忽略此cookie值会影响处理结果。如果避免这种情况配置此选项,防止产生多余的cookie信息。
        option       httpclose

        # # 支持会话长连接
        # # 仅仅适用于http模式
        # option http-keep-alive
        # option http-server-close

        # # 允许连续的流量统计更新
        # option  contstats

        # # 记录健康检查日志
        # option  log-health-checks

        # HAProxy把请求轮流的转发到每一个服务器上,依据每台服务器的权重,此权重会动态调整。最常见的默认配置
        # 其他的还有: roundrobin, source, leastconn
        balance      roundrobin

        # 重试的次数
        retries       3

        timeout connect         3500
        timeout queue           11000
        timeout tarpit          12000
        timeout client          30000
        timeout http-request    40000
        timeout http-keep-alive 5000
        timeout server          40000
        timeout check           7000


## 参考模板
## ------------------------------------------------------
# # listen部分此部分是frontend和backend部分的结合体。配置此部分不需要在配置
# # 统计页面配置
# listen admin_stats
#         bind 0.0.0.0:1080
#         mode http
#         log 127.0.0.1 local3 err #[err warning info debug]
#         stats  refresh 30s
#         stats uri /admin?stats
#         stats realm gao7\ Haproxy
#         stats auth admin:admin
#         stats hide-version
#         #stats admin if TRUE

# # 用于设置接收用户请求的前端虚拟节点。frontend可以根据ACL规则直接指定要使用的后端backend。
# frontend test-proxy
#       bind            192.168.200.10:8080
#       mode            http
#       log             global
#       option          httplog
#       option          dontlognull
#       option          nolinger
#       option          http_proxy
#       maxconn         8000
#       timeout client  30s

#       # layer3: Valid users
#       acl allow_host src 192.168.200.150/32
#       http-request deny if !allow_host

#       # layer7: prevent private network relaying
#       acl forbidden_dst url_ip 192.168.0.0/24
#       acl forbidden_dst url_ip 172.16.0.0/12
#       acl forbidden_dst url_ip 10.0.0.0/8
#       http-request deny if forbidden_dst
#       default_backend test-proxy-srv

# # 用于设置集群后端服务集群的配置,也就是添加一组真实服务器,以处理前端用户的请求。
# backend test-proxy-srv
#        mode            http
#        timeout connect 5s
#        timeout server  5s
#        retries         2
#        option          nolinger
#        option          http_proxy

#        # layer7: Only GET method is valid
#        acl valid_method        method GET
#        http-request deny if !valid_method

#        # layer7: protect bad reply
#        http-response deny if { res.hdr(content-type) audio/mp3

# backend dynamic
#        mode            http
#        balance         roundrobin
#        retries         2
#        option redispatch
#        timeout connect 5s
#        timeout server  30s
#        timeout queue   30s
#        option httpchk  HEAD /login.php
#        cookie          DYNSRV insert indirect nocache
#        fullconn        4000 # the servers will be used at full load above this number of connections
#        server          dynsrv1 192.168.1.1:80 minconn 50 maxconn 500 cookie s1 check inter 1000
#        server          dynsrv2 192.168.1.2:80 minconn 50 maxconn 500 cookie s2 check inter 1000
#        server          dynsrv3 192.168.1.3:80 minconn 50 maxconn 500 cookie s3 check inter 1000


## ------------------------online------------------------------
#####==================== tandy mysql =====================
# tandy  cp1 mysql 3308
listen  tandy_cp1_mysql_read_3308 0.0.0.0:3308
        mode tcp
        balance roundrobin
        clitimeout 2h
        srvtimeout 2h
        server mysqlserv_148181_3308  10.19.1.1:3306  check inter 3000 rise 5 fall 6 weight 10
        server mysqlserv_057154_3308  10.19.1.2:3306  check inter 3000 rise 5 fall 6 weight 5 backup

启动

$ sudo systemctl daemon-reload
$ sudo systemctl status haproxy
$ sudo systemctl start haproxy
$ sudo systemctl enable haproxy

参考文档

How to install HAProxy load balancer on CentOS

HAProxy配置文件详解及常用案例