设为首页 收藏本站
查看: 1013|回复: 0

[经验分享] HAProxy安装与配置(一)

[复制链接]

尚未签到

发表于 2019-1-1 07:59:29 | 显示全部楼层 |阅读模式
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、编译安装
  [root@www~]# cd /usr/local/src/
  [root@www~]# tar xf haproxy-1.5.1.tar.gz
  [root@www~]# cd haproxy-1.5.1
  [root@www~]# make TARGET=linux26 ARCH=x86_64 USE_LINUX_TPROXY=1
  #TARGET是指定内核版本,ARCH指定CPU架构,我使用的是64bit系统,这里就是x86_64,USE_LINUX_TPROXY是透明代理模块,如不需要,可以不加
  [root@www~]# make install PREFIX=/usr/local/haproxy
  2、安装完毕后,创建配置文件和启动文件。
  [root@www~]# mkdir /etc/haproxy
  [root@www~]# cp examples/haproxy.cfg /etc/haproxy
  [root@www~]# cp examples/haproxy.init /etc/init.d/haproxy
  [root@www~]# chmod +x /etc/init.d/haproxy
  [root@www~]# ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/
  [root@www~]# 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                    #日志级别[err warninginfo debug]
  #         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不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包
  maxconn  40000                          #默认的最大连接数
  timeout    connect    10000             #连接超时(毫秒)一般10秒就可以了,根据情况设定,时间太短,可能会有408错误
  timeout    http-request    30s          #请求超时时间
  timeout    queue       1m               #队列超时间
  timeout    connect    30s               #连接超时时间,一般10s就可以,但有的网站偶尔10s不能完成请求,会有408错误
  timeout    client  1m                   #客户端超时
  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                              #最大连接数
  stats  uri       /haproxy-stats         #统计页面url
  stats  realm     Statistics\ Report     #统计页面密码框上提示文本
  stats  refresh 10s                      #统计页面自动刷新时间
  stats  auth    admin:123456             #统计页面用户名和密码设置
  stats  hide-version                     #隐藏统计页面上HAProxy的版本信息
  stats  admin 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 request  header Host len 20
  # log the amount of data uploadedduring a POST
  capture request  header Content-Length len 10
  # log the beginning of the referrer
  capture request  header 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       forwardfor  except 127.0.0.0/8 header X-Forwarded-For     #后端服务器需要获得客户端的真实IP,将从Http Header中获得客户端IP
  ######################ACL策略定义###################
  #如果请求的域名满足正则表达式返回true -i是忽略大小写
  #       acl  ali_web  hdr_reg(host) -i ^(www.test.cn|ww1.test.cn)$
  #如果请求域名满足blog.test.cn返回 true -i是忽略大小写
  #       acl  ali_blog  hdr_dom(host) -i blog.test.cn
  #       use_backend  server_web if  ali_web
  #       use_backend  server_blog  if  ali_blog
  default_backend web_cluters                   #指定默认的后端服务器
  

  backend  web_cluters              #webserver作用域

  mode http                #上边设置了,可以不设
  #       source 0.0.0.0 usesrc clientip #全透明代理传递客户端真实ip,需将后端服务器网关指向自己,要内核支持
  #       balance leastconn         #最少连接者先处理
  balance  roundrobin      #轮询
  #       balance  source           #跟Nginx的IP_hash机制类似,作为解决session问题的一种方法
  #       balance  static-rr        #权重
  #       balance  ri               #根据请求的URI
  #       balance  rl_param         #根据请求的URl参数'balanceurl_param' requires an URL parameter name
  #       balance  hdr(name)        #根据HTTP请求头来锁定每一次HTTP请求
  #       balance  rdp-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
  #       balance  roundrobin
  #       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
  [root@www~]# service haproxy start



  HAProxy自己是不能生成日志的,需要系统的rsyslog来记录日志,在rsyslog.conf中开启udp 514的日志收集
  [root@www~]# vim /etc/rsyslog.conf
  取消以下两行的注释
  #Provides UDP syslog reception
  $ModLoadimudp
  $UDPServerRun514
  新增以下条目
  local3.*                                               /var/log/haproxy.log
  local0.*                                               /var/log/haproxy.log
  重启rsyslog服务
  [root@www~]# /etc/init.d/rsyslog restart
  查看haproxy.log
  # tail-f /var/log/haproxy.log
  Jun 3016:16:03 localhost haproxy[5309]: 192.168.100.202:52597 [30/Jun/2014:16:16:03.396]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[5309]: 192.168.100.202:52597[30/Jun/2014:16:16:03.396] 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[5309]: 192.168.100.202:52599[30/Jun/2014:16:16:04.847] 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[5309]: 192.168.100.202:52599[30/Jun/2014:16:16:04.847] 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[5309]                 haproxy pid
  192.168.100.202:52573         客户端源地址源端口
  [30/Jun/2014:16:16:03.396]    请求开始时间
  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进入管理监控平台。


  HAProxy-1.4.9以后版本最大的亮点是添加了手工启用/禁用功能,对升级变更应用时非常有用。
  四、Keepalived的安装与配置
  

  1、下载Keepalived安装包
  [root@www~]# wget http://www.keepalived.org/software/keepalived-1.2.12.tar.gz -P/usr/local/src
  2、安装
  [root@www~]# yum install -y kernel-devel openssl-* gcc gcc-c++
  [root@www~]# ln -s /usr/src/kernels/`uname -r`/ /usr/src/linux
  [root@www~]# cd /usr/local/src
  [root@www~]# tar -xf keepalived-1.2.12.tar.gz
  [root@www~]# cd keepalived-1.2.12
  [root@www~]# ./configure --prefix=/usr/local/keepalived
  [root@www~]# make && make install
  [root@www~]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
  [root@www~]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
  [root@www~]# mkdir -pv /etc/keepalived
  [root@www~]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
  [root@www~]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
  3、编辑配置文件
  [root@www~]# 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服务。
  [root@www~]# 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
  [root@www~]# vim /etc/sysconfig/iptables
  -A INPUT -p vrrp -j ACCEPT
  或
  -A INPUT -d224.0.0.18 -j ACCEPT
  4、查看VRRP通讯记录
  [root@www~]# tcpdump vrrp

  





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-658094-1-1.html 上篇帖子: Haproxy支持的调度算法 下篇帖子: B6
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表