pqwsa 发表于 2019-1-1 07:59:29

HAProxy安装与配置(一)

HAProxy安装与配置(一)
  一、HAProxy概念
  

  HAProxy功能丰富,提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,易于扩展,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。根据官方数据,其最高极限支持10G的并发。
  HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上,HAProxy 甚至还支持 Mysql 的均衡负载。在4层模式下,HAProxy仅在客户端和服务器之间转发双向流量。7层模式下,HAProxy会分析协议,并且能通过允许、拒绝、交换、增加、修改或者删除请求(request)或者回应(response)里指定内容来控制协议,这种操作要基于特定规则。
  详情可以在HAProxy官方网站(http://haproxy.1wt.eu)可以下载配置说明文档(configuration.txt)和架构文件(architecture.txt)作为参考,目前HAProxy官网域名会跳转到http://www.haproxy.org/,已更换域名,最近发现网站和google一样不能访问,需要***才可以,下载一个***fg742***软件,我的网盘里有http://pan.baidu.com/s/1pNHqY ,直接在linux里***,在另外一篇文章我会介绍。
  HAProxy有着成熟的状态监控,包括一个漂亮的web GUI界面。你可以通过浏览器看到所有服务器池的状态和统计信息,包括错误数、连接、请求率、健康检查信息等等。我们可以用它来做实时监控,通过API将相应数据返回给监控系统。它拥有非常不错的服务器健康检查功能,当其代理的后端服务器出现故障, HAProxy会自动将该服务器摘除,故障恢复后再自动将该服务器加入。自1.3版本开始还引入了frontend,backend,frontend根据任意HTTP请求头内容做规则匹配,然后把请求定向到相关的backend。

  2014年6月19日 :HAProxy的1.5.0发布了
  相对于 1.4 版本来说,1.5 版本包括了许多新特性和性能改进:
  支持 SNI/NPN/ALPN 和 OCSPstapling 的原生 SSL;
  支持 IPv6 和 UNIXsockets;
  fullHTTP keep-alive for better support of NTLM and improved efficiency in staticfarms;
  HTTP/1.1compression (deflate, gzip) to save bandwidth;
  PROXYprotocol versions 1 and 2 on both sides;
  datasampling on everything in request or response, including payload;
  ACLs canuse any matching method with any input sample maps and dynamic ACLs updatablefrom the CLI stick-tables support counters to track activity on any inputsample custom format for logs, unique-id, header rewriting, and redirects;
  improvedhealth checks (SSL, scripted TCP, check agent, ...)
  muchmore scalable configuration supports hundreds of thousands of backends andcertificates    without sweating.
  从 dev26 开始,修复了一些 bug,对一些重要的东西进行了集成。
  二、安装配置过程
  从官方网站:http://www.haproxy.org下载1.5.1最新版本,修复了一些严重bug,官方建议升级这个版本,把软件传到linux的/usr/local/src/目录下,开始安装。操作系统为Centos-6.4-x86_64,内核版本为2.6.32-358.el6.x86_64。
  1、编译安装
  # cd /usr/local/src/
  # tar xf haproxy-1.5.1.tar.gz
  # cd haproxy-1.5.1
  # make TARGET=linux26 ARCH=x86_64 USE_LINUX_TPROXY=1
  #TARGET是指定内核版本,ARCH指定CPU架构,我使用的是64bit系统,这里就是x86_64,USE_LINUX_TPROXY是透明代理模块,如不需要,可以不加
  # make install PREFIX=/usr/local/haproxy
  2、安装完毕后,创建配置文件和启动文件。
  # mkdir /etc/haproxy
  # cp examples/haproxy.cfg /etc/haproxy
  # cp examples/haproxy.init /etc/init.d/haproxy
  # chmod +x /etc/init.d/haproxy
  # ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/
  # mkdir /usr/share/haproxy
  3、编辑配置文件(两台Haproxy配置文件相同)
  HAProxy配置文件中分成五部分内容,当然这些组件不是必选的,可以根据需要选择作为配置。
  global:参数是进程级的,通常和操作系统(OS)相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改;
  default:配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件;
  frontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的backend(可动态选择);
  backend:后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器;
  listen:Frontend和Backend的组合体。
  ####################全局配置信息########################
  global
  log 127.0.0.1 local0                  #日志级别
  #         log 127.0.0.1 local3 err               #日志级别,随便设一个就可以
  maxconn 30000                           #最大连接数
  chroot /usr/share/haproxy               #运行的根目录
  uid 99                                  #所属运行用户的uid,也可使用"user+用户名“
  gid 99                                  #所属运行组的gid,也可使用"group+用户组“
  daemon                                  #守护进程运行
  nbproc 1                              #开启的进程数
  pidfile /usr/local/haproxy/haproxy.pid#haproxy pid
  ulimit-n 65535                        #文件描述符的数量限制
  #turn on stats unix socket
  stats socket /usr/local/haproxy/stats   #单进程时有效
  stats timeout 10s
  stats maxconn 10
  #####################默认参数设置######################
  defaults
  log    global                           #应用全局的日志配置
  mode      http                        #http的7层模式( 如果四层和七层混用,这里不要设置,否则tcp模式会报错)
  retries      3                        #三次连接失败就认为是服务器不可用,也可以通过后面设置
  option       redispatch               #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器
  option       abortonclose               #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
  option       dontlognull                #保证HAProxy不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包
  maxconn40000                        #默认的最大连接数
  timeout    connect    10000             #连接超时(毫秒)一般10秒就可以了,根据情况设定,时间太短,可能会有408错误
  timeout    http-request    30s          #请求超时时间
  timeout    queue       1m               #队列超时间
  timeout    connect    30s               #连接超时时间,一般10s就可以,但有的网站偶尔10s不能完成请求,会有408错误
  timeout    client1m                   #客户端超时
  timeout    server 1m                  #服务器超时
  timeout    http-keep-alive10s         #存活请求时间为超时时间
  timeout    check      30s             #心跳检测超时
  #      contimeout 5000                         # 设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,新版本的haproxy使用timeout connect替代,该参数向后兼容
  #      clitimeout 50000                        #设置连接客户端发送数据时的成功连接最长等待时间,默认单位是毫秒,新版本haproxy使用timeout client替代。该参数向后兼容
  #      srvtimeout 50000                        #设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒,新版本haproxy使用timeout server替代。该参数向后兼容
  

  ####################监控页面的设置#######################
  listenhaproxy_stats
  bind 0.0.0.0:8080                     #监听端口
  mode      http                        #http的7层模式
  option      httplog                     #采用http日志格式
  maxconn 10                              #最大连接数
  statsuri       /haproxy-stats         #统计页面url
  statsrealm   Statistics\ Report   #统计页面密码框上提示文本
  statsrefresh 10s                      #统计页面自动刷新时间
  statsauth    admin:123456             #统计页面用户名和密码设置
  statshide-version                     #隐藏统计页面上HAProxy的版本信息
  statsadmin if TRUE                  #手工启用/禁用,后端服务器(haproxy-1.4.9以后版本)
  errorfile 400/etc/haproxy/errorfiles/400badreq.http    #错误页面设置
  errorfile 408 /dev/null          # workaround Chrome pre-connect bug
  errorfile 403 /etc/haproxy/errorfiles/403forbid.http
  errorfile 503/etc/haproxy/errorfiles/503sorry.http
  #################HAProxy的日志记录内容设置###################
  # log the name of the virtual server
  capture requestheader Host len 20
  # log the amount of data uploadedduring a POST
  capture requestheader Content-Length len 10
  # log the beginning of the referrer
  capture requestheader Referer len 20
  # server name (useful for outgoingproxies only)
  capture response header Server len 20
  # logging the content-length is usefulwith "option logasap"
  capture response header Content-Lengthlen 10
  # log the expected cache behaviour onthe response
  capture response header Cache-Controllen 8
  # the Via header will report the nextproxy's name
  capture response header Via len 20
  # log the URL location during aredirection
  capture response header Location len 20
  #######################网站监测listen配置#####################
  #可以使用listen形式,也可以使用Frontend和Backend形式,建议使用以下形式,易于服务器的扩展
  frontendhttp_80_in
  bind 0.0.0.0:80         #监听是所有ip的80端口,如果要使用虚ip自动切换故障,不要指定某一个ip,服务会无法启动的
  mode http
  log    global
  option       httplog
  option       http-server-close   #对于某些server端不支持http长连接的情况,利用这个参数可以使用客户端到haproxy是长连接,而haproxy到server端是短连接
  option       forwardforexcept 127.0.0.0/8 header X-Forwarded-For   #后端服务器需要获得客户端的真实IP,将从Http Header中获得客户端IP
  ######################ACL策略定义###################
  #如果请求的域名满足正则表达式返回true -i是忽略大小写
  #       aclali_webhdr_reg(host) -i ^(www.test.cn|ww1.test.cn)$
  #如果请求域名满足blog.test.cn返回 true -i是忽略大小写
  #       aclali_bloghdr_dom(host) -i blog.test.cn
  #       use_backendserver_web ifali_web
  #       use_backendserver_blogifali_blog
  default_backend web_cluters                   #指定默认的后端服务器
  

  backendweb_cluters            #webserver作用域

  mode http                #上边设置了,可以不设
  #       source 0.0.0.0 usesrc clientip #全透明代理传递客户端真实ip,需将后端服务器网关指向自己,要内核支持
  #       balance leastconn         #最少连接者先处理
  balanceroundrobin      #轮询
  #       balancesource         #跟Nginx的IP_hash机制类似,作为解决session问题的一种方法
  #       balancestatic-rr      #权重
  #       balanceri               #根据请求的URI
  #       balancerl_param         #根据请求的URl参数'balanceurl_param' requires an URL parameter name
  #       balancehdr(name)      #根据HTTP请求头来锁定每一次HTTP请求
  #       balancerdp-cookie(name) #表示根据据cookie(name)来锁定并哈希每一次TCP请求
  #       option   httpchk          #URi健康检查
  #       option httpchk HEAD /test.php HTTP/1.0
  #       option httpchk GET /test.php
  cookie SERVERID
  server iask50 192.168.200.50:80 cookieask50 weight 1 check inter 2s rise 2 fall 3 maxconn 30000
  server iask51 192.168.200.51:80 cookieask51 weight 1 check inter 2s rise 2 fall 3 maxconn 30000
  server iask52 192.168.200.52:80 cookieask52 weight 1 check inter 2s rise 2 fall 3 maxconn 30000
  #       server iask50 web1.ha.com:80 cookie ask50weight 1 check inter 2s rise 2 fall 3 maxconn 30000
  #       server iask51 web2.ha.com:80 cookie ask51weight 1 check inter 2s rise 2 fall 3 maxconn 50000
  #cookie iask50表示serverid为iask50, weigh 权重,checkinter 2s健康频率,rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用
  #backend server_web
  #       mode   http
  #       balanceroundrobin
  #       option httpchk HEAD /test.html HTTP/1.0
  #       cookie SERVERID
  #       server web53 192.168.200.53:80 cookie web53weight 1 check inter 2s rise 2 fall 3 maxconn 30000
  #       server web54 192.168.200.54:80 cookie web53weight 1 check inter 2s rise 2 fall 3 maxconn 30000
  #backend server_blog
  #       mode    http
  #       balance roundrobin
  #       option httpchk HEAD /test.html HTTP/1.0
  #       cookie SERVERID
  #       server blog55 192.168.200.55:80 cookie blog55weight 1 check inter 2s rise 2 fall 3 maxconn 30000
  #       server blog56 192.168.200.56:80 cookie blog56weight 1 check inter 2s rise 2 fall 3 maxconn 30000
  # service haproxy start
http://s3.运维网.com/wyfs02/M01/3D/74/wKioL1PEwhDhgQ4zAAKGGcloO0E846.jpg
http://s3.运维网.com/wyfs02/M00/3D/75/wKiom1PEwkTgE5CLAAKE7Rc7DUY121.jpg
http://s3.运维网.com/wyfs02/M02/3D/74/wKioL1PEwhmzImScAAKGiWOHkwo005.jpg
  HAProxy自己是不能生成日志的,需要系统的rsyslog来记录日志,在rsyslog.conf中开启udp 514的日志收集
  # vim /etc/rsyslog.conf
  取消以下两行的注释
  #Provides UDP syslog reception
  $ModLoadimudp
  $UDPServerRun514
  新增以下条目
  local3.*                                             /var/log/haproxy.log
  local0.*                                             /var/log/haproxy.log
  重启rsyslog服务
  # /etc/init.d/rsyslog restart
  查看haproxy.log
  # tail-f /var/log/haproxy.log
  Jun 3016:16:03 localhost haproxy: 192.168.100.202:52597 http_80_in web_cluters/iask50 0/0/0/2/2 200 265 - - ---- 1/1/0/0/0 0/0"GET / HTTP/1.1"
  Jun 3016:16:03 localhost haproxy: 192.168.100.202:52597 http_80_in web_cluters/iask50 0/0/0/2/2 200 265 - ----- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
  Jun 3016:16:04 localhost haproxy: 192.168.100.202:52599 http_80_in web_cluters/iask52 0/0/1/3/4 200 265 - ----- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
  Jun 3016:16:04 localhost haproxy: 192.168.100.202:52599 http_80_in web_cluters/iask52 0/0/1/3/4 200 265 - ----- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
  HAproxy日志级别有tcp和http2种,以上边http日志为例来说明
  Jun 3016:16:03                请求结束时间
  localhost                     这个大家也知道
  haproxy               haproxy pid
  192.168.100.202:52573         客户端源地址源端口
      请求开始时间
  http_80_in                  集群名称
  web_cluters/iask50            backend名称/后端server名称
  0/0/1/1/2Tq/Tw/Tc/Tr/Tt
  Tq 等待客户端发送完整的http请求的时间 (-1 表示在接收http响应之前断开连接)
  Tw 请求在队列中等待的时间 (-1 表示请求到达队列之前 断开连接)
  Tc 与后端server建联的总时间 包括重试时间 (-1 表示请求与后端建联过程中 断开连接)
  Tr 等待后端server 发送一个完整http响应总时间 不包括实体内容(-1 代表在等待发送响应之前 断开连接)
  Tt 从接受请求到关闭连接的总时间
  200 HTTP响应代码
  265 接收到该请求返回的数据大小(包括HTTP头)单位是字节
  - 响应的cookie
  ---- 请求终止状态
  1/1/0/0/0actconn/feconn/beconn/srv_conn/retries
  actconn 是指会话记录过程中进程并发连接数(好像跟系统文件描述符相关)
  feconn 是指会话记录过程中frontend中的并发连接数(frontend级别的)
  beconn 是指会话记录过程中backend中已经建立握手的并发连接数(backend 级别的)
  srv_conn是指会话记录过程中活跃的并发连接数
  retries 是指会话记录过程中重试后端server的次数
  0/0srv_queue/backend_queue
  srv_queue处理改请求时 server端的队列正在处理的连接数
  backend_queue处理改请求是 backend队列正在处理的连接数
  更多详细信息,可以到官网中查看
  http://cbonte.github.io/haproxy-dconv/configuration-1.5.html
  三、Haproxy界面
  

  访问http://192.168.100.201/haproxy-stats,输入帐号admin密码123456进入管理监控平台。
http://s3.运维网.com/wyfs02/M00/3D/74/wKioL1PEwyShiooSAAdhuCnbNsU372.jpg
http://s3.运维网.com/wyfs02/M00/3D/75/wKiom1PEw2Xidw7JAAcfzKMe5BU880.jpg
  HAProxy-1.4.9以后版本最大的亮点是添加了手工启用/禁用功能,对升级变更应用时非常有用。
  四、Keepalived的安装与配置
  

  1、下载Keepalived安装包
  # wget http://www.keepalived.org/software/keepalived-1.2.12.tar.gz -P/usr/local/src
  2、安装
  # yum install -y kernel-devel openssl-* gcc gcc-c++
  # ln -s /usr/src/kernels/`uname -r`/ /usr/src/linux
  # cd /usr/local/src
  # tar -xf keepalived-1.2.12.tar.gz
  # cd keepalived-1.2.12
  # ./configure --prefix=/usr/local/keepalived
  # make && make install
  # cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
  # cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
  # mkdir -pv /etc/keepalived
  # cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
  # ln -s /usr/local/keepalived/sbin/keepalived /sbin/
  3、编辑配置文件
  # vim /etc/keepalived/ keepalived.conf
  !Configuration File for keepalived
  global_defs{
  notification_email {
  sysadmin@localhost                      #设置报警邮件地址,可以设置多个,每行一个。需要开启本机的sendmail服务或者有其它邮件服务器
  }
  notification_email_from sysadmin@localhost#设置邮件的发送地址
  smtp_server192.168.200.1                  #设置SMTP SERVER地址
  smtp_connect_timeout30                      #设置连接SMTPSERVER的超时时间
  router_id LVS_DEVEL                         #表示Keepalived服务的一个标识,发邮件时显示在邮件主题中的信息
  }
  vrrp_scriptchk_haproxy {
  script "killall -0 haproxy"
  interval 2
  weight -2
  }
  vrrp_instanceVI_1 {
  state MASTER                            #指定Keepalived的角色,从为BACKUP
  interface eth0                        #指定HA监测网络的接口
  virtual_router_id 51                  #路由ID,可以通过tcpdump vrrp查看,不要和其它服务冲突
  priority 101                            #从优先级为100
  advert_int 1                            #检测频率为1秒
  authentication {
  auth_type PASS                      #设置验证类型,主要有PASS和AH两种
  auth_pass 1111                      #设置验证密码,同一个vrrp_instance下,MASTER和BACKUP的密码必须一致才能正常通信
  }
  virtual_ipaddress {
  192.168.100.28            #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
  }
  track_script {
  chk_haproxy
  }
  }
  haproxy健康检查还可以写个脚本,当haproxy当掉,自动重启haproxy,如果启动失败,关闭keepalived服务。
  # vim /etc/keepalived/check_haproxy.sh
  #!/bin/bash
  A=`ps -Chaproxy --no-header |wc -l`
  if [ $A-eq 0 ];then
  /usr/local/haproxy/sbin/haproxy -f/usr/local/haproxy/conf/haproxy.cfg
  sleep 3
  if [ `ps -C haproxy --no-header |wc-l` -eq 0 ];then
  /etc/init.d/keepalived stop
  fi
  fi
  这样可以保证,不会因为系统其它原因,造成虚ip不能立即自动切换。
  如果有开启了iptables,还要设置一下,否则vrrp广播会被拦截,造成两边都有虚ip
  # vim /etc/sysconfig/iptables
  -A INPUT -p vrrp -j ACCEPT
  或
  -A INPUT -d224.0.0.18 -j ACCEPT
  4、查看VRRP通讯记录
  # tcpdump vrrp
http://s3.运维网.com/wyfs02/M01/3D/76/wKioL1PExQ-CNI9iAAM8A-WyTag052.jpg
  




页: [1]
查看完整版本: HAProxy安装与配置(一)