反向代理服务器功能:web缓存(加速)、反向代理、内容路由(根据流量及内容类型等将请求转发至特定服务器)、转码器
缓存:减少冗余内容传输;节省带宽、缓解网络瓶颈;降低了对原始服务器的请求压力;降低了传输延迟,公共缓存每个人都可以使用,带有敏感数据的私有缓存则只对限定某类或某个人使用
nginx可实现缓存功能,haproxy不能实现缓存功能,这里只说明其反向代理功能和负载均衡功能
yum install haproxy 主配置文件haproxy.cfg 开启日志功能: 编辑/etc/rsyslog.conf文件 $ModLoad imudp $UDPServerRun 514 #开启udp514端口 local2.* /var/log/haproxy.log 编辑/etc/haproxy/haproxy.cfg文件: log 127.0.0.1 local2 配置负载均衡后端主机: global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 定义面向客户端的总的最大连接数(面向客户端那一面) user haproxy group haproxy daemon # turn on stats unix socket stats socket /var/lib/haproxy/stats #--------------------------------------------------------------------- # main frontend which proxys to the backends #--------------------------------------------------------------------- frontend main *:80 #第一种方式 # bind *:80 #第二种方式 # bind *:8080 #只能用于frontend, listen; # maxconn 也可以定义在这里或listen后,定义了单个实例的最大并发连接数,如果在global段定义就是所有实例总的 default_backend websrvs #--------------------------------------------------------------------- # round robin balancing between the various backends #--------------------------------------------------------------------- backend websrvs balance roundrobin server web1 192.168.20.7:80 check #定义的名字web1会被加到请求首部发到后端,当后端有虚拟主机时很有用 server web2 192.168.20.8:80 check
几种调度算法:
balance: 指明调度算法;
动态:权重可动态调整
静态:调整权重不会实时生效
roundrobin: 轮询,动态算法,每个后端主机最多支持4128个连接;
static-rr: 轮询,静态算法,每个后端主机支持的数量无上限;
leastconn: 根据后端主机的负载数量进行调度;仅适用长连接的会话;动态;
hash-type:
map-based:取模法;静态;
consistent:一致性哈希法;动态;
下面的四种调度算法都基于上面的两种hash-type
source:
uri:对uri的左半部分(?标记之前的部分)或者整个uri做hash,除以后端服务器总权重后绑定到后端服务器
url_param: 根据url中的指定的参数的值进行调度;把值做hash计算,并除以总权重;
hdr(<name>) :根据请求报文中指定的header(如use_agent, referer, hostname)进行调度;把指定的header的值做hash计算得值除以总权重;
示例:
backend websrvs balance hdr(User-Agent) hash-type consistent server web1 192.168.20.7:80 check server web2 192.168.20.8:80 check
测试:
mode: 健康状态检测时基于何种协议
HAProxy的工作模式;默认为tcp;有三种:tcp, http, health
只有客户端和前端,后端都是用http通信才可以使用http模式
在front段也可以指定log:
frontend main *:80 log global log 127.0.0.2 local3
使用use_backend 和acl定义后段
use_backend dynamic if url_dyn
use_backend static if url_css url_img extension_img
server段后可加的参数:
backup:设定为备用服务器,仅在负载均衡场景中的其它server均不可用于启用此server; check:启动对此server执行健康状态检查,其可以借助于额外的其它参数完成更精细的设定,如: inter <delay>:设定健康状态检查的时间间隔,单位为毫秒,默认为2000;也可以使用fastinter和downinter来根据服务器端状态优化此时间延迟; rise <count>:设定健康状态检查中,某离线的server从离线状态转换至正常状态需要成功检查的次数; fall <count>:确认server从正常状态转换为不可用状态需要检查的次数; cookie <value>:为指定server设定cookie值,此处指定的值将在请求入站时被检查,第一次为此值挑选的server将在后续的请求中被选中,其目的在于实现持久连接的功能; maxconn <maxconn>:指定此服务器接受的最大并发连接数;如果发往此服务器的连接数目高于此处指定的值,其将被放置于请求队列,以等待其它连接被释放; maxqueue <maxqueue>:设定请求队列的最大长度; observe <mode>:通过观察服务器的通信状况来判定其健康状态,默认为禁用,其支持的类型有“layer4”和“layer7”,“layer7”仅能用于http代理场景; redir <prefix>:启用重定向功能,将发往此服务器的GET和HEAD请求均以302状态码响应;需要注意的是,在prefix后面不能使用/,且不能使用相对地址,以免造成循环;例如: server srv1 172.16.100.6:80 redir http://imageserver.magedu.com check weight <weight>:权重,默认为1,最大值为256,0表示不参与负载均衡;
定义健康检查方式可以使用option:
option httpchk option httpchk <uri> option httpchk <method> <uri> 例如: backend https_relay mode tcp option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www.lee123.com server apache1 192.168.1.1:443 check port 80 使用案例: server first 172.16.100.7:1080 cookie first check inter 1000 server second 172.16.100.8:1080 cookie second check inter 1000
基于浏览器cookie实现session sticky:
要点: (1) 每个server有自己惟一的cookie标识; (2) 在backend中定义为用户请求调度完成后操纵其cookie backend websrvs balance roundrobin cookie SERVERID insert nocache indirect server web1 192.168.20.7:80 check cookie websrv1 server web2 192.168.20.8:80 check cookie websrv2
测试:注意到cookie头部的websrv1关键字了么?
开启统计页面:
listen statistics bind *:9090 stats enable stats hide-version #stats scope . stats uri /haproxyadmin?stats stats realm "HAPorxy\ Statistics" stats auth admin:mageedu stats admin if TRUE
向日志中记录额外信息:
capture request header
capture response header
当mode为http时,记录丰富的日志信息:
option httplog----默认是开启的
错误页面重定向:
errorfile: 使用haproxy主机本地文件进行响应;
errorloc, errorloc302: 使用指定的url进行响应,响应状态码为302;不适用于GET以外的其它请求方法;
errorloc303:返回303状态码;
添加请求或响应报文首部:
reqadd
rspadd
frontend main bind *:80 bind *:8080 rspadd Via:\ node1.lee.com default_backend websrvs
出现了Via:
动静分离的示例: frontend main bind *:80 bind *:8080 acl url_static path_beg -i /static /images /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js use_backend static if url_static default_backend appsrvs #--------------------------------------------------------------------- # static backend for serving up images, stylesheets and such #--------------------------------------------------------------------- backend static balance roundrobin server static1 192.168.20.7 check server static2 192.168.20.8 check backend appsrvs balance roundrobin option forwardfor except 127.0.0.1 header X-Client option httpchk cookie SERVERID insert indirect nocache server web1 192.168.20.7:80 check cookie web1 server web2 192.168.20.8:80 check cookie web2