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及相关配置案例的主要内容,如果未能解决你的问题,请参考以下文章

HAproxy指南之haproxy重定向配置(案例篇)

HAproxy配置指令简单总结之一

Express实战 - 应用案例- realworld-API - 路由设计 - mongoose - 数据验证 - 密码加密 - 登录接口 - 身份认证 - token - 增删改查API(代码片段

HAproxy配置指令简单总结之一

大咖有约赵伟:负载均衡利器 HAProxy 功能剖析及部署案例

Linux高性能负载均衡HAProxy配置详解