安装配置HAProxy
HAProxy安装过程与日志输出配置
先安装LUA
$ yum -y install zlib gcc gcc-c++ libgcc zlib-devel pcre pcre-devel openssl openssl-devel
$ yum install -y libnl libnl-devel libnl3 libnl3-devel
$ yum install -y libnfnetlink-devel
$ cd /data
$ wget https://www.lua.org/ftp/lua-5.4.4.tar.gz
$ tar xf lua-5.4.4.tar.gz
$ cd lua-5.4.4/
$ make linux test
$ make install
再安装haproxy
可以在HAProxy的官网http:// www.haproxy.org/下载HAProxy的源码包
下载的HAProxy是目前的稳定版本haproxy-2.6.1.tar.gz
安装过程如下:
$ cd /data/
#下载解压
$ wget https://www.haproxy.org/download/2.6/src/haproxy-2.6.1.tar.gz
$ tar xf haproxy-2.6.1.tar.gz
$ cd haproxy-2.6.1/
#开始编译安装
#注意,需要指定刚刚编译安装的lua的源文件地址 指定安装位置
$ make TARGET=linux-glibc \
USE_OPENSSL=1 \
USE_LUA=1 \
USE_PCRE=1 \
USE_ZLIB=1 \
USE_SYSTEMD=1 \
LUA_LIB_NAME=lua \
LUA_INC=/data/lua-5.4.4/src/ \
LUA_LIB=/data/lua-5.4.4/src/ \
PREFIX=/usr/local/haproxy
$ make install PREFIX=/usr/local/haproxy
#haproxy默认不创建配置文件目录和日志目录,这里是创建haproxy配置文件目录和日志文件目录
$ mkdir /usr/local/haproxy/conf
$ mkdir /usr/local/haproxy/logs
#haproxy安装完成后,默认安装目录中没有配置文件,这里是将源码包里面的示例配置文件拷贝到配置文件目录
$ cp examples/option-http_proxy.cfg /usr/local/haproxy/conf/haproxy.cfg
这样,HAProxy就安装完成了。
编写日志输出文件
rsyslog是linux系默认的日志输出系统,配置文件为/etc/rsyslog.conf,此主配置文件默认会读取/etc/rsyslog.d/*.conf
目录下所有已.conf
结尾的文件。
$ cat /etc/rsyslog.conf|grep IncludeConfig
$IncludeConfig /etc/rsyslog.d/*.conf
因此,这里我们为haproxy单独创建一个独立的配置文件,将文件命名为haproxy.conf,并放到/etc/rsyslog.d目录下,然后添加如下内容:
$ModLoad imudp
$UDPServerRun 514
local0.* /usr/local/haproxy/logs/haproxy.log
&~ #如果不加这个配置,则除了在/usr/local/haproxy/logs/haproxy.log中写入日志外,也会将haproxy日志写入/var/log/message文件中。
配置rsyslog的主配置文件,开启远程日志
打开 /etc/sysconfig/rsyslog文件,将SYSLOGD_OPTIONS
修改为如下内容:
SYSLOGD_OPTIONS="-c 2 -r -m 0"
其中:
-c 2
使用兼容模式,默认是 -c 5。-r
开启远程日志。-m 0
标记时间戳。单位是分钟,为0时,表示禁用该功能。
重启haproxy和rsyslog服务
配置完成后,需要重启haproxy和rsyslog服务,以保证配置生效。
$ systemctl restart rsyslog
$ systemctl restart haproxy.service
HAProxy基础配置与应用实例
HAProxy配置文件的组成部分
HAProxy配置文件根据功能和用途,主要有5个部分组成,但有些部分并不是必须的,可以根据需要选择相应的部分进行配置。
-
global部分
用来设定全局配置参数,属于进程级的配置,通常和操作系统配置有关。
-
defaults部分
默认参数的配置部分。在此部分设置的参数值,默认会自动被引用到下面的frontend、backend和listen部分中,因此,如果某些参数属于公用的配置,只需在defaults部分添加一次即可。
而如果在frontend、backend和listen部分中也配置了与defaults部分一样的参数,那么defaults部分参数对应的值自动被覆盖。
-
frontend部分
此部分用于设置接收用户请求的前端虚拟节点。
frontend是在HAProxy1.3版本之后才引入的一个组件,同时引入的还有backend组件。
通过引入这些组件,在很大程度上简化了HAProxy配置文件的复杂性。
frontend可以根据ACL规则直接指定要使用的后端backend。
-
backend部分
此部分用于设置集群后端服务集群的配置,也就是用来添加一组真实服务器,以处理前端用户的请求。
添加的真实服务器类似于LVS中的real server节点。
-
listen部分
此部分是frontend部分和backend部分的结合体。
在HAProxy1.3版本之前,HAProxy的所有配置选项都在这个部分中设置。
为了保持兼容性,HAProxy新的版本仍然保留了listen组件的配置方式。
目前在HAProxy中,两种配置方式任选其一即可。
HAProxy配置文件详解
1、global部分
配置示例如下:
global
maxconn 20000
ulimit-n 40031
log 127.0.0.1 local0 info
user nobody
group nobody
chroot /usr/local/haproxy
daemon
pidfile /usr/local/haproxy/logs/haproxy.pid
下面介绍每个选项的含义。
- log:全局的日志配置,local0是日志设备,info表示日志级别。其中日志级别有err、warning、info、debug四种可选。这个配置表示使用127.0.0.1上的rsyslog服务中的local0日志设备,记录日志等级为info。
- maxconn:设定每个haproxy进程可接受的最大并发连接数
- ulimit-n: 表示最大文件打开数,ulimit-n的值必须大于maxconn的值,而且ulimit-n必须小于或等于
ulimit -n
的值 - user/ group:设置运行haproxy进程的用户和组,也可使用用户和组的uid和gid值来替代。
- chroot: 指定haproxy的工作目录
- daemon:设置HAProxy进程进入后台运行。这是推荐的运行模式。
- pidfile:指定HAProxy进程的pid文件。启动进程的用户必须有访问此文件的权限。
修改ulimit -n
的值
$ vim /etc/security/limits.d/20-nproc.conf
#加上一下两句
* hard nofile 65535
* soft nofile 65535
然后退出重新登录
通过ulimit命令来查看
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7797
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65535
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 7797
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
$ ulimit -n
65535
2、defaults部分
配置示例如下:
defaults
mode http
retries 3
timeout connect 10s
timeout client 20s
timeout server 30s
timeout check 5s
- mode:设置HAProxy实例默认的运行模式,有tcp、http、health三个可选值。
- tcp模式:在此模式下,客户端和服务器端之间将建立一个全双工的连接,不会对七层报文做任何类型的检查,默认为tcp模式,经常用于SSL、SSH、SMTP等应用。
- http模式:在此模式下,客户端请求在转发至后端服务器之前将会被深度分析,所有不与RFC格式兼容的请求都会被拒绝。
- health模式:目前此模式基本已经废弃,不在多说。
- retries:设置连接后端服务器的失败重试次数,连接失败的次数如果超过这里设置的值,HAProxy会将对应的后端服务器标记为不可用。此参数也可在后面部分进行设置。
- timeout connect:设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,但也可以使用其他的时间单位后缀。
- timeout client:设置连接客户端发送数据时最长等待时间,默认单位是毫秒,也可以使用其他的时间单位后缀。
- timeout server:设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒,也可以使用其他的时间单位后缀。
- timeout check:设置对后端服务器的检测超时时间,默认单位是毫秒,也可以使用其他的时间单位后缀。
3、frontend部分
这是HAProxy配置文件的第三部分——frontend部分的配置,配置示例如下:
frontend www
bind *:80
mode http
option httplog
option forwardfor
option originalto
option dontlognull
option httpclose
log global
default_backend htmpool
这部分通过frontend关键字定义了一个名为www
的前端虚拟节点,下面介绍每个选项的含义。
-
bind
:此选项只能在frontend和listen部分进行定义,用于定义一个或几个监听的套接字。bind的使用格式为:
bind [<address>:<port_range>] interface <interface>
其中,
- address为可选选项,其可以为主机名或IP地址,如果将其设置为“*”或“0.0.0.0”,将监听当前系统的所有IPv4地址。
- port_range可以是一个特定的TCP端口,也可是一个端口范围,小于1024的端口需要有特定权限的用户才能使用。
- interface为可选选项,用来指定网络接口的名称,只能在Linux系统上使用。
-
option httplog
:在默认情况下,haproxy日志是不记录HTTP请求的,这样很不方便HAProxy问题的排查与监控。通过此选项可以启用日志记录HTTP请求。 -
option forwardfor
:如果后端服务器需要获得客户端的真实IP,就需要配置此参数。由于HAProxy工作于反向代理模式,因此发往后端真实服务器的请求中的客户端IP均为HAProxy主机的IP,而非真正访问客户端的地址,这就导致真实服务器端无法记录客户端真正请求来源的IP,而X-Forwarded-For则可用于解决此问题。
通过使用forwardfor选项,HAProxy就可以向每个发往后端真实服务器的请求添加“X-Forwarded-For”记录,这样后端真实服务器日志可以通过X-Forwarded-For信息来记录客户端来源IP。
-
option originalto
:如果服务器上的应用程序想记录发起请求的原目的IP地址,需要在HAProxy上配置此选项,这样HAProxy会添加X-Original-To字段。跟上一个forwardfor
类似 -
option httpclose
:此选项表示在客户端和服务器端完成一次连接请求后,HAProxy将主动关闭此TCP连接。这是对性能非常有帮助的一个参数。 -
option dontlognull
:保证HAProxy不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包。 -
log global
:表示使用全局的日志配置,这里的“global”表示引用在HAProxy配置文件global部分中定义的log选项配置格式。 -
default_backend
:#指定默认的后端服务器池,也就是指定一组后端真实服务器,而这些真实服务器组将在backend段进行定义。这里的htmpool就是一个后端服务器组。
4、backend部分
接着介绍的是HAProxy配置文件的第四部分——关于backend部分的配置,配置示例如下:
backend htmpool
mode http
option redispatch
option abortonclose
balance roundrobin
balance static-rr
cookie SERVERID
option httpchk HEAD /index.html
server web1 10.0.0.6:80 cookie server1 weight 6 check inter 2000 rise 2 fall 3
server web2 10.0.0.7:8000 cookie server2 weight 6 check inter 2000 rise 2 fall 3
这个部分通过backend关键字定义了一个名为htmpool的后端真实服务器组。
下面介绍每个选项的含义。
-
option redispatch
:此参数用于cookie保持的环境中。在默认情况下,HAProxy会将其请求的后端服务器的serverID插入到cookie中,以保证会话的SESSION持久性。
而如果后端的服务器出现故障,客户端的cookie是不会刷新的,这就出现了问题。
此时,如果设置此参数,就会将客户的请求强制定向到另外一个健康的后端服务器上,以保证服务的正常。
-
option abortonclose
:如果设置了此参数,可以在服务器负载很高的情况下,自动结束掉当前队列中处理时间比较长的链接。 -
balance
:此关键字用来定义负载均衡算法。目前HAProxy支持多种负载均衡算法,常用的有如下几种:-
roundrobin:是基于权重进行轮叫调度的算法,在服务器的性能分布比较均匀的时候,这是一种最公平、最合理的算法。此算法经常使用。
-
static-rr:也是基于权重进行轮叫的调度算法,不过此算法为静态方法,在运行时调整其服务器权重不会生效。
-
source:是基于请求源IP的算法。
此算法先对请求的源IP进行hash运算,然后将结果与后端服务器的权重总数相除后转发至某个匹配的后端服务器。
这种方式可以使同一个客户端IP的请求始终被转发到某特定的后端服务器。
-
leastconn:此算法会将新的连接请求转发到具有最少连接数目的后端服务器。
在会话时间较长的场景中推荐使用此算法,例如数据库负载均衡等。此算法不适合会话较短的环境中,例如基于HTTP的应用。
-
uri:此算法会对部分或整个URI进行hash运算,再经过与服务器的总权重相除,最后转发到某台匹配的后端服务器上。
-
uri_param:此算法会根据URL路径中的参数进行转发,这样可保证在后端真实服务器数量不变时,同一个用户的请求始终分发到同一台机器上。
-
hdr(
) : 此算法根据http头进行转发,如果指定的http头名称不存在,则使用roundrobin算法进行策略转发。
-
-
cookie
:表示允许向cookie插入SERVERID,每台服务器的SERVERID可在下面的server关键字中使用cookie关键字定义。 -
option httpchk
:此选项表示启用HTTP的服务状态检测功能。HAProxy作为一款专业的负载均衡器,它支持对backend部分指定的后端服务节点的健康检查,以保证在后端backend中某个节点不能服务时,把从frotend端进来的客户端请求分配至backend中其他健康节点上,从而保证整体服务的可用性。
option httpchk的用法如下:
option httpchk <method> <uri> <version>
其中,各个参数的含义如下:
-
method:表示HTTP请求的方式,常用的有
OPTIONS
、GET
、HEAD
几种方式。一般的健康检查可以采用HEAD方式进行,而不是才采用GET方式,这是因为HEAD方式没有数据返回,仅检查Response的HEAD是不是200状态。
因此相对与GET来说,HEAD方式更快,更简单。
-
uri:表示要检测的URL地址,通过执行此URL,可以获取后端服务器的运行状态。
在正常情况下将返回状态码200,返回其他状态码均为异常状态。
-
version:指定心跳检测时的HTTP的版本号。可以不指定
-
-
[:port] [param*]server
:这个关键字用来定义多个后端真实服务器,不能用于defaults和frontend部分。使用格式为:
server
其中,每个参数含义如下:<name>
:为后端真实服务器指定一个内部名称,随便定义一个即可。<address>
:后端真实服务器的IP地址或主机名。<port>
:指定连接请求发往真实服务器时的目标端口。在未设定时,将使用客户端请求时的同一端口。[param*]
:为后端服务器设定的一系参数,可用参数非常多这里仅介绍常用的一些参数:
-
check
:表示启用对此后端服务器执行健康状态检查。 -
inter
:设置健康状态检查的时间间隔,单位为毫秒。 -
rise
:设置从故障状态转换至正常状态需要成功检查的次数,例如。rise 2表示2次检查正确就认为此服务器可用。 -
fall
:设置后端服务器从正常状态转换为不可用状态需要检查的次数,例如,fall 3表示3次检查失败就认为此服务器不可用。 -
cookie
:为指定的后端服务器设定cookie值,此处指定的值将在请求入站时被检查,第一次为此值挑选的后端服务器将在后续的请求中一直被选中,其目的在于实现持久连接的功能。上面的cookie server1表示web1的serverid为server1。同理,cookie server2表示web2的serverid为server2。
-
weight
:设置后端真实服务器的权重,默认为1,最大值为256。设置为0表示不参与负载均衡。 -
backup
:设置后端真实服务器的备份服务器,仅仅在后端所有真实服务器均不可用的情况下才启用。
-
5、listen部分
HAProxy配置文件的第五部分是关于listen部分的配置
配置示例如下:
listen admin_stats
bind 0.0.0.0:9188
mode http
log 127.0.0.1 local0 err
stats refresh 30s
stats uri /haproxy-status
stats realm welcome login\ Haproxy
stats auth admin:admin~!@
stats hide-version
stats admin if TRUE
这个部分通过listen关键字定义了一个名为“admin_stats”的实例,其实就是定义了一个HAProxy的监控页面,每个选项的含义如下:
-
stats refresh
:设置HAProxy监控统计页面自动刷新的时间。 -
stats uri
:设置HAProxy监控统计页面的URL路径,可随意指定。例如,指定
stats uri /haproxy-status
,就可以通过http://IP:9188/haproxy-status 查看。 -
stats realm
:设置登录HAProxy统计页面时密码框上的文本提示信息。 -
stats auth
:设置登录HAProxy统计页面的用户名和密码。用户名和密码通过冒号分割。可为监控页面设置多个用户名和密码,每行一个。
-
stats hide-version
:用来隐藏统计页面上HAProxy的版本信息。 -
stats admin if TRUE
:通过设置此选项,可以在监控页面上手工启用或禁用后端真实服务器,仅在haproxy1.4.9以后版本有效。
至此,完整的一个HAProxy配置文件介绍完毕了。当然,这里介绍的仅仅是最常用的一些配置参数,要深入了解HAProxy的功能,可参阅官方文档。
完整配置文件
$ cat conf/haproxy.cfg
global
maxconn 20000
log 127.0.0.1 local0 info
user nobody
group nobody
chroot /usr/local/haproxy
daemon
pidfile /usr/local/haproxy/logs/haproxy.pid
defaults
mode http
retries 3
timeout connect 10s
timeout client 20s
timeout server 30s
timeout check 5s
frontend www
bind *:80
mode http
log global
option httplog
option forwardfor
option httpclose
option dontlognull
default_backend test-proxy-srv
backend test-proxy-srv
mode http
option redispatch
option abortonclose
balance roundrobin
cookie SERVERID
option httpchk HEAD /index.html
server web1 10.0.0.6:80 cookie server1 weight 4 check inter 2000 rise 2 fall 3
server web2 10.0.0.7:8000 cookie server2 weight 6 check inter 2000 rise 2 fall 3
timeout connect 5s
timeout server 5s
retries 2
listen stats
bind 0.0.0.0:9188
mode http
log 127.0.0.1 local0 err
stats refresh 30s
stats uri /status
stats realm hahahahaha
stats auth admin:admin
stats hide-version
stats admin if TRUE
测试配置文件
$ /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg -c
[NOTICE] (5691) : haproxy version is 2.6.1-f6ca66d
[NOTICE] (5691) : path to executable is /usr/local/haproxy/sbin/haproxy
[WARNING] (5691) : config : ca-file: '@system-ca' couldn't load '/etc/pki/tls/certs/ca-bundle.trust.crt'
Warnings were found.
Configuration file is valid
这样就配置成功
本文来自博客园,作者:厚礼蝎,转载请注明原文链接:https://www.cnblogs.com/guangdelw/p/17143402.html