haproxy配置详解以及动静分离的实现
2014-04-04 19:01
656 查看
本文转载:/article/4536262.html 觉得写的很好,以后可以使用。
本文主要介绍下haproxy如何来实现web应用的动静分离的,主要思路就是通过frontend段中定义acl访问控制,把符合静态内容的请求归类到一个acl,符合动态的请求归类到另外一个acl,backend段中定义接收请求的静态内容和动态内容的服务器,然后通过use_backend调用定义的acl即可。
二、实验环境:
192.168.30.116 OS:Centos6.4 x86_64 haproxy.luojianlong.com
192.168.30.117 OS:Centos6.4 x86_64 static.luojianlong.com
192.168.30.119 OS:Centos6.4 x86_64 dynamic.luojianlong.com
haproxy version:haproxy-1.4.24
拓扑图如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/04e05222a788f78f4d4b7129faa35e2e.jpg)
在haproxy server上安装haproxy,这里使用yum安装
在static server,dynamic上安装httpd和php
分别启动static,dynamic的httpd,测试本地访问是否正常
访问都正常
下面开始配置haproxy
stats enable:启用基于程序编译时默认设置的统计报告,不能用于“frontend”区段;
stats hide-version:启用统计报告并隐藏HAProxy版本报告,不能用于“frontend”区段。默认情况下,统计页面会显示一些有用信息,包括HAProxy的版本号,然而,向所有人公开HAProxy的精确版本号是非常有风险的,因为它能帮助恶意用户快速定位版本的缺陷和漏洞;
stats realm:启用统计报告并高精认证领域,不能用于“frontend”区段。haproxy在读取realm时会将其视作一个单词,因此,中间的任何空白字符都必须使用反斜线进行转义。此参数仅在与“stats auth”配置使用时有意义;
stats scope:启用统计报告并限定报告的区段,不能用于“frontend”区段。当指定此语句时,统计报告将仅显示其列举出区段的报告信息,所有其它区段的信息将被隐藏。如果需要显示多个区段的统计报告,此语句可以定义多次。需要注意的是,区段名称检测仅仅是以字符串比较的方式进行,它不会真检测指定的区段是否真正存在;
stats auth:启用带认证的统计报告功能并授权一个用户帐号,其不能用于“frontend”区段;
stats admin:在指定的条件满足时启用统计报告页面的管理级别功能,它允许通过web接口启用或禁用服务器,不过,基于安全的角度考虑,统计报告页面应该尽可能为只读的。此外,如果启用了HAProxy的多进程模式,启用此管理级别将有可能导致异常行为;
option http-server-close:允许服务器端关闭连接;
option dontlognull:访问内容为空的不记录日志;
option redispatch:在session失败后,是否允许重新分配;
retries:用于haproxy到后端server连接失败时重试次数;
option httplog:启用记录HTTP请求、会话状态和计时器的功能;
option forwardfor:允许在发往服务器的请求首部中插入“X-Forwarded-For”首部;
ACL语法格式:
acl <aclname> <criterion> [flags] [operator] <value> ...
<aclname>:ACL名称,区分字符大小写,且其只能包含大小写字母、数字、-(连接线)、_(下划线)、.(点号)和:(冒号);haproxy中,acl可以重名,这可以把多个测试条件定义为一个共同的acl;
<criterion>:测试标准,即对什么信息发起测试;测试方式可以由[flags]指定的标志进行调整;而有些测试标准也可以需要为其在<value>之前指定一个操作符[operator];
[flags]:目前haproxy的acl支持的标志位有3个:
-i:不区分<value>中模式字符的大小写;
-f:从指定的文件中加载模式;
--:标志符的强制结束标记,在模式中的字符串像标记符时使用;
<value>:acl测试条件支持的值有以下四类:
整数或整数范围:如1024:65535表示从1024至65535;仅支持使用正整数(如果出现类似小数的标识,其为 通常为版本测试),且支持使用的操作符有5个,分别为eq、ge、gt、le和lt;
字符串:支持使用“-i”以忽略字符大小写,支持使用“\”进行转义;如果在模式首部出现了-i,可以在 其之前使用“--”标志位;
正则表达式:其机制类同字符串匹配;
IP地址及网络地址
path_beg <string>:用于测试请求的URL是否以<string>指定的模式开头;
path_end <string>:用于测试请求的URL是否以<string>指定的模式结尾;
支持的负载均衡算法:
roundrobin:基于权重进行轮叫,在服务器的处理时间保持均匀分布时,这是最平衡、最公平的算法。此算法是动态的,这表示其权重可以在运行时进行调整,不过,在设计上,每个后端服务器仅能最多接受4128个连接;
static-rr:基于权重进行轮叫,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效;不过,其在后端服务器连接数上没有限制;
leastconn:新的连接请求被派发至具有最少连接数目的后端服务器;在有着较长时间会话的场景中推荐使用此算法,如LDAP、SQL等,其并不太适用于较短会话的应用层协议,如HTTP;此算法是动态的,可以在运行时调整其权重;
source:将请求的源地址进行hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器;这可以使得同一个客户端IP的请求始终被派发至某特定的服务器;不过,当服务器权重总数发生变化时,如某服务器宕机或添加了新的服务器,许多客户端的请求可能会被派发至与此前请求不同的服务器;常用于负载均衡无cookie功能的基于TCP的协议;其默认为静态,不过也可以使用hash-type修改此特性;
uri:对URI的左半部分(“问题”标记之前的部分)或整个URI进行hash运算,并由服务器的总权重相除后派发至某匹配的服务器;这可以使得对同一个URI的请求总是被派发至某特定的服务器,除非服务器的权重总数发生了变化;此算法常用于代理缓存或反病毒代理以提高缓存的命中率;需要注意的是,此算法仅应用于HTTP后端服务器场景;其默认为静态算法,不过也可以使用hash-type修改此特性;
url_param:通过<argument>为URL指定的参数在每个HTTP GET请求中将会被检索;如果找到了指定的参数且其通过等于号“=”被赋予了一个值,那么此值将被执行hash运算并被服务器的总权重相除后派发至某匹配的服务器;此算法可以通过追踪请求中的用户标识进而确保同一个用户ID的请求将被送往同一个特定的服务器,除非服务器的总权重发生了变化;如果某请求中没有出现指定的参数或其没有有效值,则使用轮叫算法对相应请求进行调度;此算法默认为静态的,不过其也可以使用hash-type修改此特性;
hdr(<name>):对于每个HTTP请求,通过<name>指定的HTTP首部将会被检索;如果相应的首部没有出现或其没有有效值,则使用轮叫算法对相应请求进行调度;其有一个可选选项“use_domain_only”,可在指定检索类似Host类的首部时仅计算域名部分,以降低hash算法的运算量;此算法默认为静态的,不过其也可以使用hash-type修改此特性;
这里就写这么多了,更多,请查看官方网站:http://haproxy.1wt.eu/
接下来,启动haproxy
正常启动,打开浏览器访问管理界面:http://192.168.30.116:1080/haproxyadmin?stats
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/6db5f5fc8947c08aecbec6f3504a03da.jpg)
发现定义的static_servers和dynamic_servers已经正常工作
haproxy的管理界面支持直接禁用backend_server,使客户端无法访问:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/8fe62c69fa6eb562b30bd08041b69fe7.jpg)
接下来验证下动静分离的效果,打开浏览器访问http://192.168.30.116/index.html
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/e52aa872767767857e2ef4899cedd984.jpg)
发现访问的192.168.30.117,为静态内容服务器
访问http://192.168.30.116/index.php
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/57973c50dc8dbcaada8761ea011711f7.jpg)
发现访问的192.168.30.119,为动态内容服务器
到此已经实现了动静分离的效果。
本文主要介绍下haproxy如何来实现web应用的动静分离的,主要思路就是通过frontend段中定义acl访问控制,把符合静态内容的请求归类到一个acl,符合动态的请求归类到另外一个acl,backend段中定义接收请求的静态内容和动态内容的服务器,然后通过use_backend调用定义的acl即可。
二、实验环境:
192.168.30.116 OS:Centos6.4 x86_64 haproxy.luojianlong.com
192.168.30.117 OS:Centos6.4 x86_64 static.luojianlong.com
192.168.30.119 OS:Centos6.4 x86_64 dynamic.luojianlong.com
haproxy version:haproxy-1.4.24
拓扑图如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/04e05222a788f78f4d4b7129faa35e2e.jpg)
在haproxy server上安装haproxy,这里使用yum安装
下面开始配置haproxy
stats hide-version:启用统计报告并隐藏HAProxy版本报告,不能用于“frontend”区段。默认情况下,统计页面会显示一些有用信息,包括HAProxy的版本号,然而,向所有人公开HAProxy的精确版本号是非常有风险的,因为它能帮助恶意用户快速定位版本的缺陷和漏洞;
stats realm:启用统计报告并高精认证领域,不能用于“frontend”区段。haproxy在读取realm时会将其视作一个单词,因此,中间的任何空白字符都必须使用反斜线进行转义。此参数仅在与“stats auth”配置使用时有意义;
stats scope:启用统计报告并限定报告的区段,不能用于“frontend”区段。当指定此语句时,统计报告将仅显示其列举出区段的报告信息,所有其它区段的信息将被隐藏。如果需要显示多个区段的统计报告,此语句可以定义多次。需要注意的是,区段名称检测仅仅是以字符串比较的方式进行,它不会真检测指定的区段是否真正存在;
stats auth:启用带认证的统计报告功能并授权一个用户帐号,其不能用于“frontend”区段;
stats admin:在指定的条件满足时启用统计报告页面的管理级别功能,它允许通过web接口启用或禁用服务器,不过,基于安全的角度考虑,统计报告页面应该尽可能为只读的。此外,如果启用了HAProxy的多进程模式,启用此管理级别将有可能导致异常行为;
option http-server-close:允许服务器端关闭连接;
option dontlognull:访问内容为空的不记录日志;
option redispatch:在session失败后,是否允许重新分配;
retries:用于haproxy到后端server连接失败时重试次数;
option httplog:启用记录HTTP请求、会话状态和计时器的功能;
option forwardfor:允许在发往服务器的请求首部中插入“X-Forwarded-For”首部;
ACL语法格式:
acl <aclname> <criterion> [flags] [operator] <value> ...
<aclname>:ACL名称,区分字符大小写,且其只能包含大小写字母、数字、-(连接线)、_(下划线)、.(点号)和:(冒号);haproxy中,acl可以重名,这可以把多个测试条件定义为一个共同的acl;
<criterion>:测试标准,即对什么信息发起测试;测试方式可以由[flags]指定的标志进行调整;而有些测试标准也可以需要为其在<value>之前指定一个操作符[operator];
[flags]:目前haproxy的acl支持的标志位有3个:
-i:不区分<value>中模式字符的大小写;
-f:从指定的文件中加载模式;
--:标志符的强制结束标记,在模式中的字符串像标记符时使用;
<value>:acl测试条件支持的值有以下四类:
整数或整数范围:如1024:65535表示从1024至65535;仅支持使用正整数(如果出现类似小数的标识,其为 通常为版本测试),且支持使用的操作符有5个,分别为eq、ge、gt、le和lt;
字符串:支持使用“-i”以忽略字符大小写,支持使用“\”进行转义;如果在模式首部出现了-i,可以在 其之前使用“--”标志位;
正则表达式:其机制类同字符串匹配;
IP地址及网络地址
path_beg <string>:用于测试请求的URL是否以<string>指定的模式开头;
path_end <string>:用于测试请求的URL是否以<string>指定的模式结尾;
支持的负载均衡算法:
roundrobin:基于权重进行轮叫,在服务器的处理时间保持均匀分布时,这是最平衡、最公平的算法。此算法是动态的,这表示其权重可以在运行时进行调整,不过,在设计上,每个后端服务器仅能最多接受4128个连接;
static-rr:基于权重进行轮叫,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效;不过,其在后端服务器连接数上没有限制;
leastconn:新的连接请求被派发至具有最少连接数目的后端服务器;在有着较长时间会话的场景中推荐使用此算法,如LDAP、SQL等,其并不太适用于较短会话的应用层协议,如HTTP;此算法是动态的,可以在运行时调整其权重;
source:将请求的源地址进行hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器;这可以使得同一个客户端IP的请求始终被派发至某特定的服务器;不过,当服务器权重总数发生变化时,如某服务器宕机或添加了新的服务器,许多客户端的请求可能会被派发至与此前请求不同的服务器;常用于负载均衡无cookie功能的基于TCP的协议;其默认为静态,不过也可以使用hash-type修改此特性;
uri:对URI的左半部分(“问题”标记之前的部分)或整个URI进行hash运算,并由服务器的总权重相除后派发至某匹配的服务器;这可以使得对同一个URI的请求总是被派发至某特定的服务器,除非服务器的权重总数发生了变化;此算法常用于代理缓存或反病毒代理以提高缓存的命中率;需要注意的是,此算法仅应用于HTTP后端服务器场景;其默认为静态算法,不过也可以使用hash-type修改此特性;
url_param:通过<argument>为URL指定的参数在每个HTTP GET请求中将会被检索;如果找到了指定的参数且其通过等于号“=”被赋予了一个值,那么此值将被执行hash运算并被服务器的总权重相除后派发至某匹配的服务器;此算法可以通过追踪请求中的用户标识进而确保同一个用户ID的请求将被送往同一个特定的服务器,除非服务器的总权重发生了变化;如果某请求中没有出现指定的参数或其没有有效值,则使用轮叫算法对相应请求进行调度;此算法默认为静态的,不过其也可以使用hash-type修改此特性;
hdr(<name>):对于每个HTTP请求,通过<name>指定的HTTP首部将会被检索;如果相应的首部没有出现或其没有有效值,则使用轮叫算法对相应请求进行调度;其有一个可选选项“use_domain_only”,可在指定检索类似Host类的首部时仅计算域名部分,以降低hash算法的运算量;此算法默认为静态的,不过其也可以使用hash-type修改此特性;
这里就写这么多了,更多,请查看官方网站:http://haproxy.1wt.eu/
接下来,启动haproxy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/6db5f5fc8947c08aecbec6f3504a03da.jpg)
发现定义的static_servers和dynamic_servers已经正常工作
haproxy的管理界面支持直接禁用backend_server,使客户端无法访问:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/8fe62c69fa6eb562b30bd08041b69fe7.jpg)
接下来验证下动静分离的效果,打开浏览器访问http://192.168.30.116/index.html
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/e52aa872767767857e2ef4899cedd984.jpg)
发现访问的192.168.30.117,为静态内容服务器
访问http://192.168.30.116/index.php
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/57973c50dc8dbcaada8761ea011711f7.jpg)
发现访问的192.168.30.119,为动态内容服务器
到此已经实现了动静分离的效果。
相关文章推荐
- haproxy配置详解以及动静分离的实现 推荐
- HAproxy负载均衡动静分离实现及配置详解
- 分布式数据库的实现,以及负载均衡和反向代理,动静分离的配置
- haproxy+varnish实现discuz论坛的动静分离以及静态缓存
- Nginx安装配置,简单构建LNMP环境配置反向代理,实现动静分离,以及实现负载均衡。
- Haproxy 基础详解及动静分离配置
- haproxy实现的web反向代理,动静分离,以及基于keepalived实现的haproxy的高可用
- haproxy配置实现动静分离
- 高性能Web服务之haproxy应用详解及实现论坛的动静分离机制
- HAProxy详解及网上商城动静分离的实现
- HAproxy实现反向代理、负载均衡集群以及web动静分离
- windows下配置Nginx+memcached+tomcat实现负载均衡以及动静资源分离
- haproxy 基础详解 及 动静分离的实现
- haproxy实现动静分离-实例
- keepalived高可用haproxy配合varnish实现wordpress的动静分离
- 通过HAproxy实现动静分离
- HAProxy实现动静分离
- 使用Haproxy实现动静分离和负载均衡
- Haproxy实现负载均衡,网页重定向,访问请求动静分离,上传下载分离
- haproxy实现动静分离机制