何谓代理?
所谓的代理一般分为两种,即正向代理和反向代理。正向代理可以实现让不同的主机通过代理服务器使用同一个地址和Internet上的其他主机通信,通常在一个局域网内只有一个公网IP时都需要用到正向代理,而反向代理则实现的是将来自不同主机的请求发送给后端的其他服务器就行处理,而自己不负责具体如何去处理。
HAProxy介绍
HAProxy是一款基于Linux平台且开源的反向代理实现软件,同时支持虚拟主机,可以提供高可用性、负载均衡以及基于TCP和HTTP应用的代理。HAProxy特别适用于负载特别大的web站点,这些站点通常又需要回话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数万计的并发连接。
并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
HAProxy实现反向代理的一些配置实例
接下来将通过配置HAProxy的形式介绍HAProxy的配置。
实验地址规划
主机 |
IP |
用途 |
A |
192.168.2.240/24 |
安装HAProxy |
B |
192.168.2.241/24 |
安装HTTPD |
B |
192.168.2.242/24 |
安装HTTPD |
准备工作:
在主机A上安装好HAProxy,主机B上安装好HTTPD,
配置好yum源后可直接使用yum安装,并为主机B配置两个地址,在此就不再赘述
例1:将来自客户端的请求反向代理至后端两个不同的web-server
(1)配置虚拟主机
注释主配置文件/etc/http/conf/httpd.conf中的DocumentRoot项,然后在/etc/http/conf.d/中新建文件virtual.conf文件,并添加如下内容
<VirtualHost 192.168.2.241:80>
DocumentRoot /var/www/test1
ServerName www.test1.com
</VirtualHost>
<VirtualHost 192.168.2.242:80>
DocumentRoot /var/www/test2
ServerName www.test2.com
</VirtualHost>
新建虚拟主机目录,并提供虚拟主机主页面文件
[root@localhost ~]# mkdir /var/www/test1
[root@localhost ~]# mkdir /var/www/test2
[root@localhost ~]# echo "this is test1" >/var/www/test1/index.html
[root@localhost ~]# echo "this is test2" >/var/www/test2/index.html
(2)配置主机A,编辑HAProxy主配置文件如下
frontend testservers *:80
use_backend web1
backend web1
balance roundrobin
server web1 192.168.2.241:80
server web2 192.168.2.242:80
注释:配置项说明
frontend :用于定义前端监听的套接字,用户访问服务器时就是通过这些套接字与服务器通信
use_backend:指定使用哪个后端作为响应,通常后端会通过backend来配置一个或者一组服务器,用来响应前端代理过来的请求
backend:定义后端一系列服务器,通常可以通过名字引用,当前端的frontend接收进请求后就会把客户端的请求发给响应的backend
balance:指定调度算法,调度算法有以下几类
roundrobin:和lvs中的rr类似,不过该调度算法可在server后面加上相应的权重,加上权重后则成为基于权重的轮询调度算法,类似于wrr
static-rr:该算法和roundrobin一样,可基于权重做轮询,但是roundrobin是动态调度算法,可动态更新服务器的权重,并实时应用,而static-rr则是静态的,不会实时应用服务器权重。
leastconn:最少连接调度算法,该算法会把客户端的请求发给后端负载最小的服务器,该算法是动态算法,会实时根据每台服务器权重进行计算,然后动态判断请求的去向。
source:该算法根会据请求的源地址进行hash计算的结果,把请求转发给后端服务器,基于该调度算法,来自同一客户端IP的请求会始终被发往后端的同一台服务器。不过,当后端服务器宕机或添加了新的服务器时,许多的请求可能会被发往与之间请求不同的服务器,常用语负载均衡无cookie功能的基于TCP的协议,默认为动态,可通过hash-type修改
hash-type:指定hash算法的类型,后可跟如下两个选项
map-based:取模算法(静态)
constraint:一致性hash算法(动态)
uri:对uri的左半部分(“?”标记之前的部分)进行hash运算。并由服务器的总权重相除后派发至某匹配的服务器。
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
params:参数,
query:如何向数据库发起查询请求
frag:片段
url_param:通过<argument>为URL指定的参数在每个HTTP GET请求中将会被索引,通过找到了指定的参数且其通过等于号“=”被赋予一个值。那么此值将被执行hash运算并被服务器的总权重相除后派发至某匹配的服务器,可以使用hash_type指定hash算法类型
her(<name>):对于每个HTTP请求,通过<name>指定的HTTP首部将会被检索,如果对于那个的首部没有出现或其没有有效值,则使用轮询算法对其想用请求进行调度。此算法默认为静态,可以使用hash_type修改此特性。
例2:开启haproxy状态页,并要求基于用户认证后才能访问
编辑配置文件/etc/haproxy/haproxy.cfg,在backend段内添加如下配置项:
stats enable
stats uri /haproxy-stats
stats realm Haproxy Statistics
stats hide-version
stats scope .
stats auth zhangsan:adminadmin
stats auth lisi:adminadmin
重启或重读配置文件测试
注释:
stats enable #:启用状态页功能
stats uri /haproxy-stats #:设定状态页的访问路径
stats realm please-input-secreate #:显示认证提示信息
stats hide-version #:影藏首部信息
stats scope . #:启用统计报告,并限制统计报告的区域
stats auth zhangsan:adminadmin #:添加认证用户
stats auth lisi:adminadmin #:添加认证用户
例3:开启HAProxy日志记录功能
编辑配置文件在frontend段内添加如下参数
log 127.0.0.1:514 local2
编辑rsyslog配置文件把如下两项的前面#去掉
$ModLoad imudp
$UDPServerRun 514
重启rsyslog和haproxy服务即可
注释:
log:记录日志,可以放在不同frontend或者backend中,用于记录不同实例的日志
格式:log <address><facility>[<level>[<minlevel>]]
adrress:使用的日志服务器的地址
facility:指定某个日志设施,用于后端日志服务器记录日志时调用
level:定义日志级别,对日志信息进行过滤
minlevel:定义所需记录日志的最小级别
其他选项都是围绕其后端代理设置展开,可参考官方文档:http://cbonte.github.io/haproxy-dconv/configuration-1.4.html