前言
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