您的位置:首页 > 其它

Haproxy其他功能及配置

2017-07-26 13:11 197 查看
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://jerry12356.blog.51cto.com/4308715/1858396

下面了解一下haproxy的其他功能设置,多是一些生产环境中常用的功能设置,所以列举如下。

一、haproxy健康检查

1、基于HEAD的检查方法

写法:

option httpchk HEAD /a.html HTTP/1.0

相当于curl http://*.*.*.*/a.html,
如果a.html不存在,即使http服务正常也会提示服务器不可用。





两个节点的状态原本都是正常的。

下面修改一下配置文件,内容添加httpchk一项:

再次查看服务器的状态:





发现两个Server都是宕机的状态。









然而两个服务器的http服务都是正常的,只是没有check.html这个页面。

在mylinux3上生成check.html这个页面,再次查看监控界面:





发现mylinux3的状态已经恢复,说明httpchk作用正常。

2、基于GET的检查方法

写法:

option httpchk GET /a.txt

相当于wget http://*.*.*.*/a.txt,如果a.txt不存在,则即使httpd服务正常也会提示服务不可用。
配置示例:





mylinux3和mylinux4上的httpd服务正常,浏览器可以正常访问,但是监控界面两个服务器都是宕机状态。

在mylinux4上创建info.txt文件,再次刷新监控界面:





此时,mylinux4已经重新恢复成活动状态。

3、httpchk默认检查方法

写法:

option httpchk

这种写法就相当于option httpchk / ,也就是检查对应web服务器的站点根目录是否存在,如果不存在则认为服务器宕机(这种方法类似上面的第一种方法,就不再补图实验了)。

二、配置后端web服务器日志记录客户端真实IP地址

1、先来看一下web服务器日志,如下:

上面的日志中,第二行是我在mylinux1上使用curl访问的,而后面的都是在windows客户端通过haproxy的代理连接访问的,但是apache的日志中显示的用户IP地址都是192.168.100.121,也就是mylinux1的IP地址,这实际上不是真实的客户访问IP。如果想让web服务器记录真实的客户访问IP,则需要调整以下设置。

2、修改haproxy配置文件

在listen中添加forwardfor选项,注意:该选项只有放在listen段中才能生效,而放在global,default等其他段中无效。

3、修改web服务器日志格式

下面以apache为例,如果想要apache记录客户端的真实IP地址,还需要修改apache的日志格式。

[root@mylinux3 ~]# vi /etc/httpd/conf/httpd.conf

[root@mylinux3 ~]# grep LogFormat /etc/httpd/conf/httpd.conf

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

#LogFormat "%h %l %u %t \"%r\" %>s %b" common

LogFormat "\"%{X-Forwarded-For}i\" %V %A %t \"%r\" %>s %b \"%{Referer}i\"
\"%{User-Agent}i\"" common

LogFormat "%{Referer}i -> %U" referer

LogFormat "%{User-agent}i" agent

#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio

注释掉原有的日志格式(我这里是common格式,如果是其他模式可以依样修改),然后添加一行新的common格式,使用蓝色部分中的模式匹配真实IP地址。

4、重启web服务

5、使用haproxy代理访问测试

可以看到,已经可以记录客户端的真实IP了。

三、haproxy的后端服务器backup设置

haproxy可以设置后端服务器的高可用,也就是可以有多个服务器,但是正常情况下,只有一部分提供服务,而只有在正常提供服务的机器宕机之后,备用机器才会提供服务。

listenwebsites

bind 192.168.100.120:80

option forwardfor

#option httpchk GET /info.txt

#option httpchk HEAD /check.html HTTP/1.0

timeout server 15s

timeout connect 30s

server mylinux3 192.168.100.181:80 check port 80 inter 2000 fall 3

server mylinux4 192.168.100.182:80 check port 80 inter 2000 fall 3 backup

这里设置mylinux4是备用机器,正常情况下只有mylinux3提供服务,而在haproxy认为mylinux3挂掉之后,才会启用mylinux4提供服务。

说明在mylinux3正常的情况下,mylinux4是不提供服务的,只当做备用机器,下面将mylinux3的web服务关闭,再进行测试:





mylinux3已经关闭httpd服务,在监控界面显示为不可用状态。

此时,访问haproxy代理链接,全部都是转发给mylinux4,即我在haproxy配置文件中设置的备用机器。

另外,这里backup主机提供服务的前提是所有正常服务的主机全部都不能通过健康检查,即haproxy认为所有的提供服务的主机都是宕机状态(我这里只有一台,如果有多台的话,必须是不加backup的所有主机都无法提供服务),才会启用第一个backup主机提供服务。当然这样实际上不太好,如果正常情况下提供服务的主机有多台,而backup的主机数量较少,我们可能希望启动所有的backup主机,就需要添加如下参数:

option allbackups

四、Acl规则

1、首先在web服务器上创建虚拟主机

1)mylinux3

2)mylinux4

2、修改haproxy配置文件

3、重启haproxy服务

4、查看监控界面





5、修改windows客户端hosts文件

注:这里是因为没有DNS,所以windows要进行访问需要修改hosts文件,如果是生产环境,haproxy代理绑定外网IP,然后通过DNS将域名进行解析,就可以直接通过域名访问了。





然后访问www.mylinux3.com









然后访问www.mylinux4.com









而访问http://192.168.100.121/









6、在linux上进行测试

综合上述测试结果,只要是符合mylinux3_dom规则的都会转发给backend为mylinux3进行展示,也就是mylinux3上的web1和web2,而符合mylinux4_dom规则的都会转发给backend为mylinux4进行展示,也就是mylinux4上的web3和web4。

五、haproxy的301跳转

1、修改haproxy配置文件

这里只修改frontend段,所以就把修改部分粘贴出来,其他的和上面的保持一致。

frontend web

bind 192.168.100.121:80

acl mylinux3_dom hdr(host) -i www.mylinux3.com

acl mylinux4_dom hdr(host) -i www.mylinux4.com

acl mylinux_dom hdr(host) -i www.mylinux.com

redirect prefix http://www.baidu.com code 301 if mylinux_dom

use_backend mylinux3 if mylinux3_dom

use_backend mylinux4 if mylinux4_dom

default_backend mylinux3

2、修改windows配置文件

192.168.100.121 www.mylinux3.com www.mylinux4.com www.mylinux.com

3、测试配置结果

浏览器中输入http://www.mylinux.com









可以看到,已经成功的跳转到百度的界面了。

六、haproxy动静分离

1、web服务器创建相应目录

2、修改haproxy配置文件

frontend web

bind 192.168.100.121:80

#acl mylinux3_dom hdr(host) -i www.mylinux3.com

#acl mylinux4_dom hdr(host) -i www.mylinux4.com

#acl mylinux_dom hdr(host) -i www.mylinux.com

#redirect prefix http://www.baidu.com code 301 if mylinux_dom

#use_backend mylinux3 if mylinux3_dom

#use_backend mylinux4 if mylinux4_dom

#default_backend mylinux3

acl web_php path_beg /php/

acl web_java path /java/

acl web_static path /

use_backend mylinux3 if web_php #访问路径中包含php的就转给mylinux3后端作用域,这里是模仿动态php内容转发

use_backend mylinux4 if web_java #访问路径中包含java的就转给mylinux4后端作用域,这里是模仿动态java内容转发

default_backend web80 #默认情况下转给web80后端作用域,相当于静态内容

backend mylinux3

balance leastconn

option httpclose

option forwardfor

server web1 192.168.100.181:8001 check port 8001 inter 2000 fall 1

server web2 192.168.100.181:8002 check port 8002 inter 2000 fall 1

backend mylinux4

balance roundrobin

option httpclose

option forwardfor

option redispatch

#option httpchk /index.html HTTP/1.0

server web1 192.168.100.182:8001 check port 8001 inter 1000 fall 2

server web2 192.168.100.182:8002 check port 8002 inter 1000 fall 2

backend web80

balance roundrobin

option httpclose

option forwardfor

server web1 192.168.100.181:80 check port 80 inter 2000 fall 3

server web2 192.168.100.182:80 check port 80 inter 2000 fall 3

3、重启haproxy服务

4、测试访问结果

这样就实现了网站动态内容和静态内容的分离,默认情况下是静态内容,如果是php则访问存在php的后端作用域,如果是java则访问java内容放置的后端作用域。

另外,也可以基于扩展名进行转发,只要是静态的内容,如.html/.jpg./png/.txt等统一做跳转,而动态内容,如.php/.java等统一做跳转,配置的格式如下:

acl web_pic path_end .gif .jpg .png .bmp

acl web_dynamic path_end .java .php .js

use_backend pic if web_pic

use_backend dynamic if web_dynamic

七、基于客户端进行7层跳转

很多网站都有基于访问客户端进行展示对应页面的功能,比如PC访问是www.***.com,安卓手机访问是android.***.com,IPhone访问是iphone.***.com,这样的效果很多是通过代码实现的,但实际上haproxy就能实现类似的功能。

修改配置文件,添加如下内容:

acl iphone_users hdr_sub(user-agent) -i iphone

redirect prefix http://iphone.***.com if
iphone_users

acl android_users hdr_sub(user-agent) -i android

redirect prefix http://android.***.com if
android_users

这里因为限制,无法进行测试,所以就不再补图说明了。但是需要注意一点,user-agent设备类型可以到web服务器日志中查看,需要检查是否iPhone设备的类型都是iphone,比如iphone5,iphone6,ipad都进行访问,然后查看日志,找出对应的设备类型,要根据日志中的设备类型进行设置,以免出现设备访问的页面出现不匹配设备的情况。

八、haproxy设置访问控制

1、修改配置文件,添加下面黄色部分内容

frontend web

bind 192.168.100.121:80

#acl mylinux3_dom hdr(host) -i www.mylinux3.com

#acl mylinux4_dom hdr(host) -i www.mylinux4.com

#acl mylinux_dom hdr(host) -i www.mylinux.com

#redirect prefix http://www.baidu.com code 301 if mylinux_dom

#use_backend mylinux3 if mylinux3_dom

#use_backend mylinux4 if mylinux4_dom

#default_backend mylinux3

acl web_php path_beg /php/

acl web_java path /java/

acl valid_ip src 172.16.100.0/24

http-request deny if !valid_ip #在之前的版本中时block if !valid_ip,现在换为http-request deny,功能是一样的

use_backend mylinux3 if web_php

use_backend mylinux4 if web_java

default_backend web80

2、重启haproxy服务

3、测试结果





Windows客户端没有172.16.100.0/24段的IP地址,所以访问拒绝。

这个功能可以用来提供一个内部测试的站点,然后只允许内部IP访问,其他外部访问统统拒绝,也是一个不错的测试方式。

本文出自 “IT小二郎” 博客,请务必保留此出处http://jerry12356.blog.51cto.com/4308715/1858396
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  haproxy