阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

HAproxy配置详解以及动静分离的实现

163次阅读
没有评论

共计 12504 个字符,预计需要花费 32 分钟才能阅读完成。

一、前面已经介绍过关于 haproxy 的工作特性了,本文主要介绍下 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

拓扑图如下:

HAproxy 配置详解以及动静分离的实现

在 haproxy server 上安装 haproxy,这里使用 yum 安装

[root@haproxy ~]# yum -y install haproxy

在 static server,dynamic 上安装 httpd 和 php

[root@static ~]# yum -y install httpd

[root@dynamic ~]# yum -y install httpd php

分别启动 static,dynamic 的 httpd,测试本地访问是否正常

[root@static ~]# service httpd start

[root@static ~]# ss -naptl | grep :80

LISTEN    0      128                      :::80                      :::*      users:((“httpd”,24245,5),(“httpd”,24247,5),(“httpd”,24248,5),(“httpd”,24249,5),(“httpd”,24250,5),(“httpd”,24251,5),(“httpd”,24252,5),(“httpd”,24253,5),(“httpd”,24254,5))

[root@static ~]# echo “static.luojianlong.com” >> /var/www/html/index.html

[root@static ~]# curl 192.168.30.117

static.luojianlong.com

[root@dynamic ~]# service httpd start

[root@dynamic ~]# ss -anplt | grep :80

LISTEN    0      128                      :::80                      :::*      users:((“httpd”,13702,5),(“httpd”,13704,5),(“httpd”,13705,5),(“httpd”,13706,5),(“httpd”,13707,5),(“httpd”,13708,5),(“httpd”,13709,5),(“httpd”,13710,5),(“httpd”,13711,5))

[root@dynamic ~]# vi /var/www/html/index.php

<?php

echo “dynamic.luojianlong.com”

?>

[root@dynamic ~]# curl -I http://192.168.30.119/index.php

HTTP/1.1 200 OK

Date: Thu, 03 Apr 2014 05:39:23 GMT

Server: Apache/2.2.15 (CentOS)

X-Powered-By: PHP/5.3.3

Connection: close

Content-Type: text/html; charset=UTF-8

访问都正常

下面开始配置 haproxy

[root@haproxy ~]# cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak

[root@haproxy ~]# vi /etc/haproxy/haproxy.cfg

global                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 

    log        127.0.0.1 local2

    chroot      /var/lib/haproxy

    pidfile    /var/run/haproxy.pid

    maxconn    4000

    user        haproxy

    group      haproxy

    daemon

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 

    stats socket /var/lib/haproxy/stats

defaults

    mode                    http

    log                    global

    option                  httplog

    option                  dontlognull

    option http-server-close

    option forwardfor      except 127.0.0.0/8

    option                  redispatch

    retries                3

    timeout http-request    10s

    timeout queue          1m

    timeout connect        10s

    timeout client          1m

    timeout server          1m

    timeout http-keep-alive 10s

    timeout check          10s

    maxconn                3000

listen stats

    mode http

    bind 0.0.0.0:1080

    stats enable

    stats hide-version

    stats uri    /haproxyadmin?stats

    stats realm  Haproxy\ Statistics

    stats auth    admin:admin

    stats admin if TRUE

frontend http-in

    bind *:80

    mode http

    log global

    option httpclose

    option logasap

    option dontlognull

    capture request  header Host len 20

    capture request  header Referer len 60

    acl url_static      path_beg      -i /static /images /javascript /stylesheets

    acl url_static      path_end      -i .html .jpg .jpeg .gif .png .css .js

    acl url_dynamic      path_end      -i .php .jsp

    use_backend static_servers          if url_static

    use_backend dynamic_servers        if url_dynamic

backend static_servers

    balance roundrobin

    server imgsrv1 192.168.30.117:80 check maxconn 6000

#  server imgsrv2 192.168.30.118:80 check maxconn 6000

backend dynamic_servers

    balance source

    server websrv1 192.168.30.119:80 check maxconn 1000

#  server websrv2 192.168.30.120:80 check maxconn 1000

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”首部;

HAproxy 的详细介绍:请点这里
HAproxy 的下载地址:请点这里

推荐阅读:

Haproxy+Keepalived 搭建 Weblogic 高可用负载均衡集群 http://www.linuxidc.com/Linux/2013-09/89732.htm

Keepalived+HAProxy 配置高可用负载均衡 http://www.linuxidc.com/Linux/2012-03/56748.htm

CentOS 6.3 下 Haproxy+Keepalived+Apache 配置笔记 http://www.linuxidc.com/Linux/2013-06/85598.htm

Haproxy + KeepAlived 实现 WEB 群集 on CentOS 6 http://www.linuxidc.com/Linux/2012-03/55672.htm

Haproxy+Keepalived 构建高可用负载均衡 http://www.linuxidc.com/Linux/2012-03/55880.htm

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

[root@haproxy ~]# service haproxy start

Starting haproxy: [OK]

[root@haproxy ~]# ss -anptl | grep :80

LISTEN 0 128 *:80 *:* users:((“haproxy”,20436,6))

正常启动,打开浏览器访问管理界面:http://192.168.30.116:1080/haproxyadmin?stats

HAproxy 配置详解以及动静分离的实现

发现定义的 static_servers 和 dynamic_servers 已经正常工作

haproxy 的管理界面支持直接禁用 backend_server,使客户端无法访问:

HAproxy 配置详解以及动静分离的实现

接下来验证下动静分离的效果,打开浏览器访问 http://192.168.30.116/index.html

发现访问的 192.168.30.117, 为静态内容服务器

访问 http://192.168.30.116/index.php

发现访问的 192.168.30.119, 为动态内容服务器

到此已经实现了动静分离的效果。

一、前面已经介绍过关于 haproxy 的工作特性了,本文主要介绍下 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

拓扑图如下:

HAproxy 配置详解以及动静分离的实现

在 haproxy server 上安装 haproxy,这里使用 yum 安装

[root@haproxy ~]# yum -y install haproxy

在 static server,dynamic 上安装 httpd 和 php

[root@static ~]# yum -y install httpd

[root@dynamic ~]# yum -y install httpd php

分别启动 static,dynamic 的 httpd,测试本地访问是否正常

[root@static ~]# service httpd start

[root@static ~]# ss -naptl | grep :80

LISTEN    0      128                      :::80                      :::*      users:((“httpd”,24245,5),(“httpd”,24247,5),(“httpd”,24248,5),(“httpd”,24249,5),(“httpd”,24250,5),(“httpd”,24251,5),(“httpd”,24252,5),(“httpd”,24253,5),(“httpd”,24254,5))

[root@static ~]# echo “static.luojianlong.com” >> /var/www/html/index.html

[root@static ~]# curl 192.168.30.117

static.luojianlong.com

[root@dynamic ~]# service httpd start

[root@dynamic ~]# ss -anplt | grep :80

LISTEN    0      128                      :::80                      :::*      users:((“httpd”,13702,5),(“httpd”,13704,5),(“httpd”,13705,5),(“httpd”,13706,5),(“httpd”,13707,5),(“httpd”,13708,5),(“httpd”,13709,5),(“httpd”,13710,5),(“httpd”,13711,5))

[root@dynamic ~]# vi /var/www/html/index.php

<?php

echo “dynamic.luojianlong.com”

?>

[root@dynamic ~]# curl -I http://192.168.30.119/index.php

HTTP/1.1 200 OK

Date: Thu, 03 Apr 2014 05:39:23 GMT

Server: Apache/2.2.15 (CentOS)

X-Powered-By: PHP/5.3.3

Connection: close

Content-Type: text/html; charset=UTF-8

访问都正常

下面开始配置 haproxy

[root@haproxy ~]# cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak

[root@haproxy ~]# vi /etc/haproxy/haproxy.cfg

global                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 

    log        127.0.0.1 local2

    chroot      /var/lib/haproxy

    pidfile    /var/run/haproxy.pid

    maxconn    4000

    user        haproxy

    group      haproxy

    daemon

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 

    stats socket /var/lib/haproxy/stats

defaults

    mode                    http

    log                    global

    option                  httplog

    option                  dontlognull

    option http-server-close

    option forwardfor      except 127.0.0.0/8

    option                  redispatch

    retries                3

    timeout http-request    10s

    timeout queue          1m

    timeout connect        10s

    timeout client          1m

    timeout server          1m

    timeout http-keep-alive 10s

    timeout check          10s

    maxconn                3000

listen stats

    mode http

    bind 0.0.0.0:1080

    stats enable

    stats hide-version

    stats uri    /haproxyadmin?stats

    stats realm  Haproxy\ Statistics

    stats auth    admin:admin

    stats admin if TRUE

frontend http-in

    bind *:80

    mode http

    log global

    option httpclose

    option logasap

    option dontlognull

    capture request  header Host len 20

    capture request  header Referer len 60

    acl url_static      path_beg      -i /static /images /javascript /stylesheets

    acl url_static      path_end      -i .html .jpg .jpeg .gif .png .css .js

    acl url_dynamic      path_end      -i .php .jsp

    use_backend static_servers          if url_static

    use_backend dynamic_servers        if url_dynamic

backend static_servers

    balance roundrobin

    server imgsrv1 192.168.30.117:80 check maxconn 6000

#  server imgsrv2 192.168.30.118:80 check maxconn 6000

backend dynamic_servers

    balance source

    server websrv1 192.168.30.119:80 check maxconn 1000

#  server websrv2 192.168.30.120:80 check maxconn 1000

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”首部;

HAproxy 的详细介绍:请点这里
HAproxy 的下载地址:请点这里

推荐阅读:

Haproxy+Keepalived 搭建 Weblogic 高可用负载均衡集群 http://www.linuxidc.com/Linux/2013-09/89732.htm

Keepalived+HAProxy 配置高可用负载均衡 http://www.linuxidc.com/Linux/2012-03/56748.htm

CentOS 6.3 下 Haproxy+Keepalived+Apache 配置笔记 http://www.linuxidc.com/Linux/2013-06/85598.htm

Haproxy + KeepAlived 实现 WEB 群集 on CentOS 6 http://www.linuxidc.com/Linux/2012-03/55672.htm

Haproxy+Keepalived 构建高可用负载均衡 http://www.linuxidc.com/Linux/2012-03/55880.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计12504字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中