HAProxy是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。
4层负载均衡
将网络流量负载平衡到多个服务器的最简单方法是使用第4层(传输层)负载平衡。以这种方式进行负载均衡将根据IP范围和端口转发用户流量。
用户访问负载均衡器,负载均衡器将用户的请求转发给后端服务器的Web后端组,无论选择哪个后端服务器,都将直接响应用户的请求。
7层负载均衡
7层负载平衡是更复杂的负载均衡网络流量的方法是使用第7层(应用层)负载均衡。使用第7层允许负载均衡器根据用户请求的内容将请求转发到不同的后端服务器。这种负载平衡模式允许您在同一域和端口下运行多个Web应用程序服务器。
示例中,如果用户请求yourdomain.com/blog,则会将其转发到博客后端,后端是一组运行博客应用程序的服务器。其他请求被转发到web-backend,后端可能正在运行另一个应用程序。
安装配置
HAProxy官方需要翻墙才能打开,建议先翻墙之后下载安装包,再通过FTP上传到服务器。
# 下载安装包 wget http://www.haproxy.org/download/1.8/src/haproxy-1.8.20.tar.gz # 解压安装包 tar zxvf haproxy-1.8.20.tar.gz cd haproxy-1.8.20 # 编译 uname -r # 查看本地版本号,需要根据本地Liunx设置TARGET make TARGET=linux440 PREFIX=/usr/local/haproxy # 安装 make install PREFIX=/usr/local/haproxy
HAProxy源码中提供了启动脚本,需要将它放到/etc/init.d目录下,并修改haproxy安装路径。
# 将启动脚本移动到/etc/init.d目录下 sudo cp haproxy-1.8.20/examples/haproxy.init /etc/init.d/haproxy # 添加执行权限 sudo chmod u+x /etc/init.d/haproxy # 修改启动脚本 sudo vim /etc/init.d/haproxy
HAProxy启动脚本中,指定了配置文件存放路径和进程ID文件存放路径:
BASENAME=`basename $0` if [ -L $0 ]; then BASENAME=`find $0 -name $BASENAME -printf %l` BASENAME=`basename $BASENAME` fi BIN=/usr/local/haproxy/sbin/$BASENAME CFG=/usr/local/haproxy/etc/$BASENAME.cfg [ -f $CFG ] || exit 1 PIDFILE=usr/local/haproxy/var/$BASENAME.pid LOCKFILE=/var/lock/subsys/$BASENAME
所以我们需要在haproxy安装目录下,新建etc/var两个文件夹:
cd /usr/local/haproxy sudo mkdir var sudo mkdir etc
haproxy配置文件是放在etc目录下,默认名字为:haproxy.cfg。
配置文件详解
haproxy 配置中分成五部分内容,分别如下:
- global: 设置全局配置参数,属于进程的配置,通常是和操作系统相关。
- defaults:配置默认参数,这些参数可以被用到frontend,backend,Listen组件;
- frontend:接收请求的前端虚拟节点,Frontend可以更加规则直接指定具体使用后端的backend
- backend:后端服务集群的配置,是真实服务器,一个Backend对应一个或者多个实体服务器;
- Listen :frontend和backend的组合体。
以下是一个配置文件示例:
global log 127.0.0.1 local0 info maxconn 4096 user nobody group nobody daemon nbproc 1 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 option httplog option forwardfor option httpclose log global default_backend htmpool backend htmpool mode http option redispatch option abortonclose balance roundrobin cookie SERVERID option httpchk GET /index.php server web1 10.200.34.181:80 cookie server1 weight 6 check inter 2000 rise 2 fall 3 server web2 10.200.34.182:8080 cookie server2 weight 6 check inter 2000 rise 2 fall 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:admin123 stats hide-version stats admin if TRUE
global配置
- log:全局的日志配置,local0 是日志设备,info 表示日志级别。其中日志级别有err、warning、info、debug 四种可选。这个配置表示使用 127.0.0.1 上的 rsyslog 服务中的local0 日志设备,记录日志等级为info。
- maxconn:设定每个 haproxy 进程可接受的最大并发连接数,此选项等同于 Linux命令行选项“ulimit -n”。
- user/ group:设置运行 haproxy 进程的用户和组,也可使用用户和组的 uid 和gid 值来替代。
- daemon:设置 HAProxy 进程进入后台运行。这是推荐的运行模式。
- nbproc:设置 HAProxy 启动时可创建的进程数,此参数要求将HAProxy 运行模式设置为“daemon”,默认只启动一个进程。根据使用经验,该值的设置应该小于服务器的 CPU 核数。创建多个进程,能够减少每个进程的任务队列,但是过多的进程可能会导致进程的崩溃。
- pidfile:指定 HAProxy 进程的 pid 文件。启动进程的用户必须有访问此文件的权限。
defaults部分
- mode:设置 HAProxy 实例默认的运行模式,有 tcp、http、health 三个可选值。
- retries:设置连接后端服务器的失败重试次数,连接失败的次数如果超过这里设置的值,HAProxy 会将对应的后端服务器标记为不可用。此参数也可在后面部分进行设置。
- timeout connect:设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,但也可以使用其他的时间单位后缀。
- timeout client:设置连接客户端发送数据时最长等待时间,默认单位是毫秒,也可以使用其他的时间单位后缀。
- timeout server:设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒,也可以使用其他的时间单位后缀。
- timeout check:设置对后端服务器的检测超时时间,默认单位是毫秒,也可以使用其他的时间单位后缀。
frontend部分
- bind:此选项只能在 frontend 和 listen 部分进行定义,用于定义一个或几个监听的套接字。bind 的使用格式为:bind [
- :<port_range>] 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 httpclose:此选项表示在客户端和服务器端完成一次连接请求后,HAProxy 将主动关闭此 TCP 连接。这是对性能非常有帮助的一个参数。
- log global:表示使用全局的日志配置,这里的“ global”表示引用在HAProxy 配置文件 global 部分中定义的 log 选项配置格式。
- default_backend:#指定默认的后端服务器池,也就是指定一组后端真实服务器,而这些真实服务器组将在 backend 段进行定义。这里的htmpool 就是一个后端服务器组。
backend部分
- option redispatch:此参数用于 cookie 保持的环境中。在默认情况下,HAProxy会将其请求的后端服务器的 serverID 插入到 cookie 中,以保证会话的 SESSION 持久性。而如果后端的服务器出现故障,客户端的 cookie 是不会刷新的,这就出现了问题。此时,如果设置此参数,就会将客户的请求强制定向到另外一个健康的后端服务器上,以保证服务的正常。
- option abortonclose:如果设置了此参数,可以在服务器负载很高的情况下, 自动结束掉当前队列中处理时间比较长的链接。
- balance:此关键字用来定义负载均衡算法。目前 HAProxy 支持多种负载均衡算法,常用的有如下几种:
- cookie:表示允许向 cookie 插入 SERVERID,每台服务器的 SERVERID 可在下面的 server 关键字中使用 cookie 关键字定义。
- option httpchk:此选项表示启用 HTTP 的服务状态检测功能。HAProxy 作为一款专业的负载均衡器,它支持对 backend 部分指定的后端服务节点的健康检查,以保证在后端 backend 中某个节点不能服务时,把从 frotend 端进来的客户端请求分配至 backend 中其他健康节点上,从而保证整体服务的可用性。“option httpchk”的用法如下:
option httpchk 其中,各个参数的含义如下:
- server:这个关键字用来定义多个后端真实服务器,不能用于 defaults 和frontend部分。使用格式为:server[:port] [param*] 其中,每个参数含义如下:
- check:表示启用对此后端服务器执行健康状态检查。
- inter:设置健康状态检查的时间间隔,单位为毫秒。
- rise:设置从故障状态转换至正常状态需要成功检查的次数,例如。“rise 2”表示 2 次检查正确就认为此服务器可用。
- fall:设置后端服务器从正常状态转换为不可用状态需要检查的次数,例如,“fall 3”表示 3 次检查失败就认为此服务器不可用。
- cookie:为指定的后端服务器设定 cookie 值,此处指定的值将在请求入站时被检查,第一次为此值挑选的后端服务器将在后
listen 部分
这个部分通过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 实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
- HAProxy 支持连接拒绝 : 因为维护一个连接的打开的开销是很低的,有时我们很需要限制攻击蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。 这个已经为一个陷于小型DDoS攻击的网站开发了而且已经拯救了很多站点,这个优点也是其它负载均衡器没有的。
本文暂时没有评论,来添加一个吧(●'◡'●)