zoukankan      html  css  js  c++  java
  • Haproxy 简介及配置文件详解

    HAProxy简介

       官网:http://www.haproxy.com

       HAProxy提供高可用性、负载均衡以及基于TCP和HTTP的应用代理,支持虚拟主机,它是免费、快速并且可靠的一种负载均衡解决方案。适合处理高负载站点的七层数据请求。类似的代理服务可以屏蔽内部真实服务器,防止内部服务器遭受攻击。
       HAProxy特点和优点:
       1.支持原声SSL,同时支持客户端和服务器的SSL.
       2.支持IPv6和UNIX套字节(sockets)
       3.支持HTTP Keep-Alive
       4.支持HTTP/1.1压缩,节省宽带
       5.支持优化健康检测机制(SSL、scripted TCP、check agent...)
       6.支持7层负载均衡。
       7.可靠性和稳定性非常好。
       8.并发连接40000-50000个,单位时间处理最大请求20000个,最大数据处理10Gbps.
       9.支持8种负载均衡算法,同时支持session保持。
       10.支持虚拟主机。
       11.支持连接拒绝、全透明代理。
       12.拥有服务器状态监控页面。
       13.支持ACL.

     

     HAProxy为了让同一客户端访问服务器可以保持会话。有三种解决方法:客户端IP、Cookie以及Session
       1.HAProxy通过客户端IP进行Hash计算并保存,以此确保当相同IP访问代理服务器可以转发给固定的真实服务器。
       2.HAProxy依靠真实服务器发送客户端的Cookie信息进行会话保持。
       3.HAProxy将保存真实服务器的Session以及服务器标识,实现会话保持。
       (HAProxy只要求后端服务器能够在网络联通,也没有像LVS那样繁琐的ARP配置)


     HAProxy的balance8种负载均衡算法:
       1.roundrobin : 基于权重轮循。
       2.static-rr : 基于权重轮循。静态算法,运行时改变无法生效
       3.source : 基于请求源IP的算法。对请求的源IP进行hash运算,然后将结果与后端服务器的权重总数想除后转发至某台匹配服务器。使同一IP客户端请求始终被转发到某特定的后端服务器。
       4.leastconn : 最小连接。(适合数据库负载均衡,不适合会话短的环境) 
       5.uri : 对部分或整体URI进行hash运算,再与服务器的总权重想除,最后转发到匹配后端。
       6.uri_param : 根据URL路径中参数进行转发,保证在后端服务器数量不变的情况下,同一用户请求分发到同一机器。
       7.hdr(<name>) : 根据http头转发,如果不存在http头。则使用简单轮循。


     HAProxy主要工作模式
       1.tcp模式:该模式下,在客户端和服务器之间将建立一个全双工的连接,且不会对7层的报文做任何处理的简单模式。此模式默认,通常用于SSL、SSH、SMTP应用。
       2.http模式(一般使用):该模式下,客户端请求在转发给后端服务器之前会被深度分析,所有不与RFC格式兼容的请求都会被拒绝。
       

    HAProxy安装及配置文件参数

       HAProxy安装

    yum -y install haproxy

       HAProxy环境

    haproxy的配置文件通常分为三部分: global(全局配置部分) defaults(默认配置部分) listen(应用组件部分)
    配置文件:/etc/haproxy/haproxy.cfg 

    1.        ####################全局配置######################## 
    2.        #######参数是进程级的,通常和操作系统(OS)相关######### 
    3. global 
    4.        maxconn 20480                   #默认最大连接数 
    5.        log 127.0.0.1 local0            #日志输出配置,所有日志都记录在本机系统日志,通过local0输出
    6.        log 127.0.0.1 local1 notice   #notice 为日志级别,通常有24个级别(error warringinfo debug)
    7.        chroot /var/haproxy             #chroot运行的路径 
    8.        uid 99                          #所属运行的用户uid 
    9.        gid 99                          #所属运行的用户组 
    10.        daemon                          #以后台形式运行haproxy 
    11.        nbproc 1                        #进程数量(可以设置多个进程提高性能) 
    12.        pidfile /var/run/haproxy.pid    #haproxy的pid存放路径,启动进程的用户必须有权限访问此文件 
    13.        ulimit-n 65535                  #ulimit的数量限制 
    14.        #####################默认设置###################### 
    15.        ##这些参数可以被利用配置到frontend,backend,listen组件## 
    16. defaults 
    17.        log global 
    18.        mode http                       #所处理的类别 (#7层 http;4层tcp  ) 
    19.        maxconn 20480                   #最大连接数 
    20.        option httplog                  #日志类别http日志格式 
    21.        option httpclose                #每次请求完毕后主动关闭http通道 
    22.        option dontlognull              #不记录健康检查的日志信息 
    23.        option forwardfor               #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip  
    24.        option redispatch               #serverId对应的服务器挂掉后,强制定向到其他健康的服务器  
    25.        option abortonclose             #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接 
    26.        stats refresh 30                #统计页面刷新间隔 
    27.        retries 3                       #3次连接失败就认为服务不可用,也可以通过后面设置 
    28.        balance roundrobin              #默认的负载均衡的方式,轮询方式 
    29.       #balance source                  #默认的负载均衡的方式,类似nginx的ip_hash 
    30.       #balance leastconn               #默认的负载均衡的方式,最小连接 
    31.        contimeout 5000                 #连接超时 
    32.        clitimeout 50000                #客户端超时 
    33.        srvtimeout 50000                #服务器超时 
    34.        timeout check 2000              #心跳检测超时 
    35.        ####################监控页面的设置####################### 
    36. listen admin_status                    #Frontend和Backend的组合体,监控组的名称,按需自定义名称 
    37.         bind 0.0.0.0:65532             #监听端口 
    38.         mode http                      #http的7层模式 
    39.         log 127.0.0.1 local3 err       #错误日志记录 
    40.         stats refresh 5s               #每隔5秒自动刷新监控页面 
    41.         stats uri /admin?stats         #监控页面的url 
    42.         stats realm itnihao itnihao   #监控页面的提示信息 
    43.         stats auth admin:admin         #监控页面的用户和密码admin,可以设置多个用户名 
    44.         stats auth admin1:admin1       #监控页面的用户和密码admin1 
    45.         stats hide-version             #隐藏统计页面上的HAproxy版本信息  
    46.         stats admin if TRUE            #手工启用/禁用,后端服务器(haproxy-1.4.9以后版本) 
    47.        errorfile 403 /etc/haproxy/errorfiles/403.http 
    48.        errorfile 500 /etc/haproxy/errorfiles/500.http 
    49.        errorfile 502 /etc/haproxy/errorfiles/502.http 
    50.        errorfile 503 /etc/haproxy/errorfiles/503.http 
    51.        errorfile 504 /etc/haproxy/errorfiles/504.http 
    52.        #################HAProxy的日志记录内容设置################### 
    53.        capture request  header Host           len 40 
    54.        capture request  header Content-Length len 10 
    55.        capture request  header Referer        len 200 
    56.        capture response header Server         len 40 
    57.        capture response header Content-Length len 10 
    58.        capture response header Cache-Control  len 8 
    59.        #######################网站监测listen配置##################### 
    60.        ###########此用法主要是监控haproxy后端服务器的监控状态############ 
    61. listen site_status 
    62.        bind 0.0.0.0:1081                    #监听端口 
    63.        mode http                            #http的7层模式 
    64.        log 127.0.0.1 local3 err             #[err warning info debug] 
    65.        monitor-uri /site_status             #网站健康检测URL,用来检测HAProxy管理的网站是否可以用,正常返回200,不正常返回503 
    66.        acl site_dead nbsrv(server_web) lt 2 #定义网站down时的策略当挂在负载均衡上的指定backend的中有效机器数小于1台时返回true 
    67.        acl site_dead nbsrv(server_blog) lt 2 
    68.        acl site_dead nbsrv(server_bbs)  lt 2  
    69.        monitor fail if site_dead            #当满足策略的时候返回503,网上文档说的是500,实际测试为503 
    70.        monitor-net 192.168.16.2/32          #来自192.168.16.2的日志信息不会被记录和转发 
    71.        monitor-net 192.168.16.3/32 
    72.        ########frontend配置############ 
    73.        #####注意,frontend配置里面可以定义多个acl进行匹配操作######## 
    74. frontend http_80_in 
    75.        bind 0.0.0.0:80      #监听端口,即haproxy提供web服务的端口,和lvs的vip端口类似 
    76.        mode http            #http的7层模式 
    77.        log global           #应用全局的日志配置 
    78.        option httplog       #启用http的log 
    79.        option httpclose     #每次请求完毕后主动关闭http通道,HA-Proxy不支持keep-alive模式 
    80.        option forwardfor    #如果后端服务器需要获得客户端的真实IP需要配置次参数,将可以从Http Header中获得客户端IP 
    81.        ########acl策略配置############# 
    82.        acl itnihao_web hdr_reg(host) -i ^(www.itnihao.cn|ww1.itnihao.cn)$    
    83.        #如果请求的域名满足正则表达式中的2个域名返回true -i是忽略大小写 
    84.        acl itnihao_blog hdr_dom(host) -i blog.itnihao.cn 
    85.        #如果请求的域名满足www.itnihao.cn返回true -i是忽略大小写 
    86.        #acl itnihao    hdr(host) -i itnihao.cn 
    87.        #如果请求的域名满足itnihao.cn返回true -i是忽略大小写 
    88.        #acl file_req url_sub -i  killall= 
    89.        #在请求url中包含killall=,则此控制策略返回true,否则为false 
    90.        #acl dir_req url_dir -i allow 
    91.        #在请求url中存在allow作为部分地址路径,则此控制策略返回true,否则返回false 
    92.        #acl missing_cl hdr_cnt(Content-length) eq 0 
    93.        #当请求的header中Content-length等于0时返回true 
    94.        ########acl策略匹配相应############# 
    95.        #block if missing_cl 
    96.        #当请求中header中Content-length等于0阻止请求返回403 
    97.        #block if !file_req || dir_req 
    98.        #block表示阻止请求,返回403错误,当前表示如果不满足策略file_req,或者满足策略dir_req,则阻止请求 
    99.        use_backend  server_web  if itnihao_web 
    100.        #当满足itnihao_web的策略时使用server_web的backend 
    101.        use_backend  server_blog if itnihao_blog 
    102.        #当满足itnihao_blog的策略时使用server_blog的backend 
    103.        #redirect prefix http://blog.itniaho.cn code 301 if itnihao 
    104.        #当访问itnihao.cn的时候,用http的301挑转到http://192.168.16.3 
    105.        default_backend server_bbs 
    106.        #以上都不满足的时候使用默认server_bbs的backend 
    107.        ##########backend的设置############## 
    108.        #下面我将设置三组服务器 server_web,server_blog,server_bbs
    109. ###########################backend server_web############################# 
    110. backend server_web 
    111.        mode http            #http的7层模式 
    112.        balance roundrobin   #负载均衡的方式,roundrobin平均方式 
    113.        cookie SERVERID      #允许插入serverid到cookie中,serverid后面可以定义 
    114.        option httpchk GET /index.html #心跳检测的文件 
    115.        server web1 192.168.16.2:80 cookie web1 check inter 1500 rise 3 fall 3 weight 1  
    116.        #服务器定义,cookie 1表示serverid为web1,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用, 
    117.        #fall 3是3次失败认为服务器不可用,weight代表权重 
    118.        server web2 192.168.16.3:80 cookie web2 check inter 1500 rise 3 fall 3 weight 2 
    119.        #服务器定义,cookie 1表示serverid为web2,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用, 
    120.        #fall 3是3次失败认为服务器不可用,weight代表权重 
    121. ###################################backend server_blog############################################### 
    122. backend server_blog 
    123.        mode http            #http的7层模式 
    124.        balance roundrobin   #负载均衡的方式,roundrobin平均方式 
    125.        cookie SERVERID      #允许插入serverid到cookie中,serverid后面可以定义 
    126.        option httpchk GET /index.html #心跳检测的文件 
    127.        server blog1 192.168.16.2:80 cookie blog1 check inter 1500 rise 3 fall 3 weight 1  
    128.        #服务器定义,cookie 1表示serverid为web1,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重 
    129.        server blog2 192.168.16.3:80 cookie blog2 check inter 1500 rise 3 fall 3 weight 2 
    130.         #服务器定义,cookie 1表示serverid为web2,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重 
    131. ###################################backend server_bbs############################################### 
    132. backend server_bbs 
    133.        mode http            #http的7层模式 
    134.        balance roundrobin   #负载均衡的方式,roundrobin平均方式 
    135.        cookie SERVERID      #允许插入serverid到cookie中,serverid后面可以定义 
    136.        option httpchk GET /index.html #心跳检测的文件 
    137.        server bbs1 192.168.16.2:80 cookie bbs1 check inter 1500 rise 3 fall 3 weight 1  
    138.        #服务器定义,cookie 1表示serverid为web1,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重 
    139.        server bbs2 192.168.16.3:80 cookie bbs2 check inter 1500 rise 3 fall 3 weight 2 
    140.         #服务器定义,cookie 1表示serverid为web2,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重 

    haproxy 配置文件修改

    [root@localhost ~]# vim /etc/haproxy/haproxy.cfg
    # this config needs haproxy-1.1.28 or haproxy-1.2.1
     
    global
    #   log 127.0.0.1   local0
    #   log 127.0.0.1   local1 notice
        log /dev/log    local0 info
        log /dev/log    local0 notice
        maxconn 4096
        uid 99
        gid 99
        daemon
     
    defaults
        log global
        mode    http
        option  httplog
        retries 3
        maxconn 4096
        contimeout  5000
        clitimeout  50000
        srvtimeout  50000
     
    listen  webcluster 0.0.0.0:80
        option  httpchk GET /index.html
        balance roundrobin
        server  inst1 192.168.200.103:80 check inter 2000 fall 3
        server  inst1 192.168.200.104:80 check inter 2000 fall 3
     
    listen admin_stats
        bind 0.0.0.0:8000
        mode http
        option httplog
        maxconn 100
        stats refresh 30s
        stats uri /stats
        stats realm Crushlinux Haproxy
            stats auth admin:admin
        stats hide-version

      

    5.5 准备服务自启动脚本

    [root@localhost ~]# cp /usr/src/haproxy-1.4.24/examples/haproxy.init /etc/init.d/haproxy
    [root@localhost ~]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
    [root@localhost ~]# chmod +x /etc/init.d/haproxy
    [root@localhost ~]# /etc/init.d/haproxy start
    Starting haproxy:                                          [确定]

    Haproxy 日志

    Haproxy 的日志默认输出到系统的syslog中,为了更好的管理Haproxy 的日志,在生产环境中一般单独定义出来。
    8.1 修改Haproxy配置文件中关于日志配置选项,

    [root@localhost ~]# vim /etc/haproxy/haproxy.cfg
    # this config needs haproxy-1.1.28 or haproxy-1.2.1
     
    global
        #log 127.0.0.1  local0
        #log 127.0.0.1  local1 notice
         
        log /dev/log    local0 info
        log /dev/log    local0 notice
    [root@localhost ~]# service haproxy restart
    Shutting down haproxy:                                     [确定]
    Starting haproxy:                                          [确定]

    这两行配置放到global选项中,主要是将Haproxy的info和notice日志分别记录到不同的日志文件中

    8.2 修改rsyslog配置
    为了便于管理,将Haproxy相关的配置独立定义到haproxy.conf 并放到/etc/rsyslog.d/ 下,rsyslog启动时会自动加载此目录下的所有配置文件。

    [root@localhost ~]# vim /etc/rsyslog.d/haproxy.conf
    if ($programname == 'haproxy' and $syslogserverity-text == 'info') then -/var/log/haproxy/haproxy-info.log
    &~
    if ($programname == 'haproxy' and $syslogserverity-text == 'notice') then -/var/log/haproxy/haproxy-notice.log
    &~  

    将haproxy的info日志记录到/var/log/haproxy/haproxy-info.log中,将notice日志记录到/var/log/haproxy/haproxy-notice.log中,将notice日志记录到/var/log/haproxy/haproxy-notice
    &~ 表示当写入到日志文件后,rsyslog停止处理这个信息,(rainerscript 脚本语言)

    重启rsyslog服务
    [root@localhost ~]# service rsyslog restart
    关闭系统日志记录器: [确定]
    启动系统日志记录器: [确定]

    8.3 查看日志文件是否创建成功

    [root@localhost ~]# ls -l /var/log/haproxy/haproxy-info.log
    [root@localhost ~]# ls -l /var/log/haproxy/haproxy-notice.log
     
    Sep 20 23:39:26 localhost haproxy[2674]: 192.168.200.1:51629 [20/Sep/2015:23:38:27.256] web-cluster web-cluster/inst2 0/0/0/1/59740 200 1648 - - CD-- 0/0/0/0/0 0/0 "GET / HTTP/1.1"
    Sep 20 23:40:06 localhost haproxy[2674]: 192.168.200.1:51693 [20/Sep/2015:23:39:34.423] web-cluster web-cluster/inst2 0/0/0/0/32120 200 580 - - ---- 1/1/1/1/0 0/0 "GET / HTTP/1.1"

    8.4 状态统计功能测试

  • 相关阅读:
    大数加法、乘法实现的简单版本
    hdu 4027 Can you answer these queries?
    zoj 1610 Count the Colors
    2018 徐州赛区网赛 G. Trace
    1495 中国好区间 尺取法
    LA 3938 动态最大连续区间 线段树
    51nod 1275 连续子段的差异
    caioj 1172 poj 2823 单调队列过渡题
    数据结构和算法题
    一个通用分页类
  • 原文地址:https://www.cnblogs.com/2567xl/p/11640991.html
Copyright © 2011-2022 走看看