何谓代理?html
所谓的代理通常分为两种,即正向代理和反向代理。正向代理能够实现让不一样的主机经过代理服务器使用同一个地址和Internet上的其余主机通讯,一般在一个局域网内只有一个公网IP时都须要用到正向代理,而反向代理则实现的是未来自不一样主机的请求发送给后端的其余服务器就行处理,而本身不负责具体如何去处理。前端
HAProxy介绍git
HAProxy是一款基于Linux平台且开源的反向代理实现软件,同时支持虚拟主机,能够提供高可用性、负载均衡以及基于TCP和HTTP应用的代理。HAProxy特别适用于负载特别大的web站点,这些站点一般又须要回话保持或七层处理。HAProxy运行在当前的硬件上,彻底能够支持数万计的并发链接。github
而且它的运行模式使得它能够很简单安全的整合进您当前的架构中, 同时能够保护你的web服务器不被暴露到网络上。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