Haproxy及相关配置案例
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Haproxy及相关配置案例相关的知识,希望对你有一定的参考价值。
前言
LB Cluster中可以分为四层调度和七层调度。前面学的LVS、nginx(stream模块)都属于四层调度,七层调度有nginx(http模块)等。HAProxy是一款应对客户端10000以上的同时连接的高性能的TCP和HTTP负载均衡器。就是说四层和七层都可以调度,这就是为什么HAProxy是一款专业的调度器。简单说它的功能是用来提供基于cookie的持久性,基于内容的交换,过载保护的高级流量管制,自动故障切换,以正则表达式为基础的控制运行时间,基于Web的报表,高级日志记录以帮助排除故障的应用或网络及其他功能。
HAProxy功能
1、支持TCP / HTTP反向代理服务器,尤其适合于高可用性环境
2、支持http反向代理
3、支持动态程序的反向代理
4、支持基于数据库的反向代理
HAProxy配置文件结构
1、global:全局配置段
进程及安全配置相关的参数
性能调整相关参数
Debug参数
2、proxies:代理配置段
defaults:为frontend, backend, listen提供默认配置
frontend:前端,相当于nginx中的server {}
backend:后端,相当于nginx中的upstream {}
listen:同时拥有前端和后端,适用于一对一环
简单的轮询调度
frontend http bind 172.18.32.118:80 default_backend websrvs backend websrvs balance roundrobin server srv1 192.168.32.9:80 check server srv2 192.168.32.10:80 check
或者一对一的写法也可以,灵活性不高
listen http bind :80,:8080 balance roundrobin server srv1 192.168.32.9:80 check server srv2 192.168.32.10:80 check
记录日志:默认配置文件中已经定义了日志记录,但是还需要去日志配置文件中打开通道,并配置。也可以记录在另外的日志服务器中。
]#cat /etc/haproxy/haproxy.cfg log 127.0.0.1 local2 ]#vim /etc/rsyslog.conf $ModLoad imudp 这两行默认注销的,需打开 $UDPServerRun 514 local2.* /var/log/haproxy.log
基于uri的调度和hash环的一致性配置
backend websrvs balance uri hash-type consistent ...
因为HAProxy是应用层的调度,还可以根据http首部来进行调度
backend websrvs balance hdr(host) ...
定义sorry server,当后端服务器都宕机的情况下使用,注意端口不要冲突
backend websrvs server sorryserver 192.168.32.101:8080 backup ...
健康状态检查,检测的地址和提供服务的地址分开
addr:检测时使用的IP地址
port :针对此端口进行检测
inter <delay>:检测之间的时间间隔,默认为2000ms
rise <count>:连续多少次检测结果为“成功”才标记服务器为可用;默认为2
fall <count>:连续多少次检测结果为“失败”才标记服务器为不可用;默认为3
backend websrvs balance roundrobin server srv1 192.168.32.9:80 check weight 1 addr 192.168.32.101 prot 80 inter 3000 rise 3 fall 3 ...
如果有服务器需要维护,可以设置disabled,标记为不可用,就不会往这个服务器上调度了。
server srv1 192.168.32.9:80 disabled
重定向到另一个地址
server srv1 192.168.32.9:80 redir http://www.baidu.com
基于cookie的的session sticky的调度
backend websrvs cookie SRV insert nocache server srv1 192.168.32.9:80 weight 2 check cookie srv1 server srv2 192.168.32.10:80 check cookie srv2 ...
启用web管理界面
listen admin 192.168.32.101:8080 stats enable <===启用统计页,默认值/haproxy?statsuri stats uri /haproxy <===自定义stats page uri stats realm "haproxy info" <===认证时的realm stats auth h1:centos <===认证时的账号和密码,可使用多次 stats hide-version <===隐藏版本 stats refresh 20 <===设定自动刷新时间间隔 stats admin if TRUE <===启用stats page中的管理功能
对后端服务器做http协议健康状态检测:通常用于bendend。option httpchk 默认为:/ OPTIONS HTTP/1.0,也可以自己定义。
backend websrvs option httpchk GET /index.html HTTP/1.1\r\nhost http-check status 200 <===期望得到的值,返回200即正常
在发送后端主机的请求报文中携带真实的客户端IP
option forwadfor except 127.0.0.0/8
默认设置中就定义了此行,只需修改后端主机的日志配置文件 ,头部添加x-forwarded-for
]#vim /etc/httpd/conf/httpd.conf LogFormat "%{x-forwarded-for}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined CustomLog logs/access_log combined
也可不用默认的,自己定义,加在后面
]#vim haproxy.cfg option forwadfor except 127.0.0.0/8 header x-client ]#vim /etc/httpd/conf/httpd.conf LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{x-client}i" combined CustomLog logs/access_log combined
定制错误页面,仅支持200, 400, 403, 408, 500, 502, 503, 504
frontend http errorfile 503 <file> <===<file>错误页文件路径 errorloc 503 <url> <===<url>重定向的地址 ...
修改报文首部
frontend http reqadd X-via:\ haproxy107 <===请求报文尾部添加指定首部,在后端服务器端能看到具体哪台haproxy调度的 rspadd X-via:\ haproxy107 <===在响应报文尾部添加指定首部,指在客户端能看到是哪台代理服务器转发回的数据 reqidel Server <===i是不区分大小写,后面可以用正则表达式匹配 rspidel Server ...
ACL:访问控制列表
源控制
frontend http acl deny_src src 172.18.0.108 <===定一个acl拒绝的源地址 block if deny_src <===如果符合deny_src就block拒绝
路径控制
frontend http acl adminpath path_beg /admin <===路径开头带admin的拒绝,精确匹配,-i忽略大小写 block if adminpath
文件控制
frontend http acl imagefile path_end .jpg .png... block if imagefile
实现动静分离
frontend http acl imagefile path_end .jpg .png... acl appfile path_end .php use_backend webserv1 if imagefile use_backend webserv2 if appfile backend webserv1 server web1 192.168.32.9:80 check ... backend webserv2 server web1 192.168.32.10:80 check ...
提取在一个HTTP请求报文的首部,实现域名调度
frontend http acl imagehost hdr(host) images.magedu.com use_backend webserv1 if imagehost ...
对7层请求的访问控制
... acl deny_method method HEAD <===不能看-I 看头部信息 http-request if deny_method ...
TCP转发、四层代理
listen ssh bind 172.18.0.107:22 <===不能和本身的服务冲突,绑定在外网网卡,内网网卡绑定的自身ssh mode tcp server ssh1 192.168.32.9:22 server ssh2 192.168.32.10:22
fronted mysql bind 172.18.0.107:3306 mode tcp default_backend mysqlsrvs backend mysqlsrvs mode tcp <===必须定义模式 server ssh1 192.168.32.9:3306 server ssh2 192.168.32.10:3306
注意:1、mysql只需对对网授权,无需对内网授权。
2、客户端如何查案代理服务器调度的是哪个服务器呢?可以使用”show variables like ‘hostname‘;”查看变量的方式看到主机名。
支持https协议
前提:必须把私钥和公钥放在一个文件。使用make 生成最简单方便。
fronted ssl bind 172.18.0.107:80 bind 172.18.0.107:443 ssl crt /PATH/TO/SOME_PEM_FILE (证书路径) default_backend webserv1 ... redirect scheme https if !{ ssl_fc } <===访问http重定向到https
向后端传递用户请求的协议和端口(frontend或backend),记得在后端主机日志文件中添加。
http_request set-header X-Forwarded-Port %[dst_port] http_request add-header X-Forwared-Proto https if { ssl_fc}
本文出自 “沉默是金” 博客,请务必保留此出处http://maguofu.blog.51cto.com/12431016/1978563
以上是关于Haproxy及相关配置案例的主要内容,如果未能解决你的问题,请参考以下文章
Express实战 - 应用案例- realworld-API - 路由设计 - mongoose - 数据验证 - 密码加密 - 登录接口 - 身份认证 - token - 增删改查API(代码片段