zoukankan      html  css  js  c++  java
  • keepalived高可用haproxy负载均衡varnish缓存wordpress的动静分离(第一次配置成功)

    haproxy和nginx都可以作为七层和四层反代服务器对外提供服务,此文通过haproxy和keealived配置varnish搭建wordpress的动静分离站点

    一、实验环境

    五台虚拟机

    • haproxy-1:搭建haproxy和keepalived服务,ip地址:192.168.11.176

    • haproxy-2:搭建haproxy和keepalived服务,ip地址:192.168.11.172

    • varnish服务器ip地址:192.168.11.173

    • wordpress静态服务器:搭建httpd,ip地址:192.168.11.177

    • wordpress动态服务器,搭建httpd+php+mariadb,ip地址:192.168.11.178

    实验目的

    通过haproxy访问到后台网站,并且varnish为网站提供缓存,提升网站性能。

    实验拓扑:此处虚拟机数量不够,就不采用动静分离集群了,而是分别采用一台虚拟机部署:

    二、实验步骤

    wordpress配置

    • 动态服务器配置:

      1. 安装httpd,mariadb,php服务,此处php作为httpd的模块进行动态php文件处理:

        yum install -y httpd mariadb-server php php-mysql php-mbstring
      2. 上传wordpress到/var/www/html路径下并修改属主属组为apache,此处不做详细演示;

    • 静态服务器配置:

      1. 安装httpd服务并上传wordpress到/var/www/html,修改属主属组为apache;

    varnish配置

    1. 安装varnish服务并修改varnish的配置文件default.vcl,修改内容如下:

      vcl 4.0;      #声明为varnish4.0
      import directors;   #调用多个后端主机做集群#
      
      probe health_check {    #定义健康状态检测机制#
          .url = "/.health_check.html";   #定义检测文件#
          .window = 5;    #定义一共检测几次#
          .threshold = 3; #定义检测几次失败则认为后端主机失效#
          .interval = 2s; #每隔2秒检测一次#
          .timeout = 3s;  #连接超时时长为3秒#
      }
      
      backend dynamic {   #定义后端动态主机#
          .host = "192.168.11.178";
          .port = "80";
          .probe = health_check;
      }
      
      backend static {    #定义前端主机#
          .host = "192.168.11.177";
          .port = "80";
          .probe = health_check;
      }
      
      sub vcl_recv {
          # Happens before we check if we have this in cache already.
          #
          # Typically you clean up the request here, removing cookies you don't need,
          # rewriting the request, etc.
          if (req.url ~ "(?i).*php.*") {      #当访问的url包括php,则转到动态服务器,否则所有请求转到静态服务器,实现动静分离#
              set req.backend_hint = dynamic;
          } else {
              set req.backend_hint = static;
          }
          if (req.url ~ "(?i)(register|login)$") {    #如果请求地址结尾为register或者login,注册和登录页面,则不查缓存,,直接从后端服务器获取内容#
              return (pass);
          }
      
      }
      sub vcl_backend_response {
          # Happens after we have read the response headers from the backend.
          #
          # Here you clean the response headers, removing silly Set-Cookie headers
          # and other mistakes your backend does.
          #当后端服务器回复给varnish的响应如果不包含公共缓存信息,而且请求为jpg等静态资源,则卸载cookie信息并缓存资源1小时#
          if (beresp.http.cache-control !~ "s-maxage") {  
              if (bereq.url ~ "(?i).(jpg|jpeg|png|gif|css|js|xml)$") {
                      unset beresp.http.Set-Cookie;
                      set beresp.ttl = 3600s;
              }
          }
            #当varnish请求后端服务器的url包括php,则卸载cookie信息并缓存资源1小时#
          if (bereq.url ~ "(?i).*php.*") {
              unset beresp.http.Set-Cookie;
              set beresp.ttl = 3600s;
          }
      }
      
      sub vcl_deliver {
          # Happens when we have all the pieces we need, and are about to send the
          # response to the client.
          #
          # You can do accounting or modifying the final object here.
          if (obj.hits>0) {
              set resp.http.X-Cache = "HIT via "+server.ip;
          } else {
              set resp.http.X-Cache = "MISS via "+server.ip;
          }
      }

      注意:

      varnish在探测到请求和响应报文头部有cookie信息的时候是不缓存的,所以缓存命中率会非常低。这就是为什么要卸载php页面和jpg等动态资源cookie的原因。

    2. 然后通过varnishadm登录varnish并加载配置项,用ab进行压测会发现启用和不启用缓存的性能差出数倍,而且启用和不启用缓存后端服务器压力也差出数倍;

    haproxy配置

    1. 修改/etc/haproxy/haproxy.cfg配置文件,内容如下:

      global        #全局配置#
          log         127.0.0.1 local2        #log记录到rsyslog服务器,此处需要在rsyslog进行配置#
          chroot      /var/lib/haproxy        #把haproxy禁锢到/var/lib/haproxy,防止haproxy被劫持后破坏系统
          pidfile     /var/run/haproxy.pid    #pid文件位置#
          maxconn     4000                    #每个进程最大连接数为4000#
          user        haproxy                 
          group       haproxy
          daemon                              #以服务方式运行#
          stats socket /var/lib/haproxy/stats
          
      defaults    #默认配置#
          mode                    http    #默认为http七层代理#
          log                     global  #日志采用global配置#
          option                  httplog #以http方式记录日志#
          option                  dontlognull #不记录健康状态检测日志#
          option http-server-close    
          option forwardfor       except 127.0.0.0/8  #传递客户端ip到后端服务器,需要在后端服务器修改日志样式#
          option                  redispatch
          retries                 3   #最大尝试3次连接#
          timeout http-request    10s #等待http请求时间为10s#
          timeout queue           1m  #
          timeout connect         10s #等待建立连接时间为10s#
          timeout client          1m  #等待客户端连接时间#
          timeout server          1m  #等待服务端连接时间#
          timeout http-keep-alive 10s #长连接时长#
          timeout check           10s #检测间隔#
          maxconn                 3000    
          
      listen stats    #定义状态页#
          bind        *:9000
          stats       enable
          stats auth  admin:admin
          stats uri   /admin?stats    #定义stats url路径#
          stats refresh       30s
          stats realm         "status-page"
          stats hide-version  #隐藏版本信息#
          stats admin if TRUE #开启后端管理功能#
          
      frontend  web   #定义前端服务器名为web#
          bind        *:80
          default_backend     appsrvs #绑定的后端服务器#
          
      backend appsrvs #定义后端服务器名为appsrvs#
          server      static  192.168.11.173:80 check #定义后端服务器,static为名字,check表示进行健康状态检测,也可以添加其他值进来,如检测间隔等信息#
    2. 状态页面如下:

    keepalived配置

    1. 修改/etc/keepalived/keepalived.conf配置文件,内容如下:

      ! Configuration File for keepalived
      
      global_defs {
         notification_email {
           acassen@firewall.loc
           failover@firewall.loc
           sysadmin@firewall.loc
         }
         notification_email_from Alexandre.Cassen@firewall.loc
         smtp_server 192.168.200.1
         smtp_connect_timeout 30
         router_id node1
         vrrp_mcast_group4 224.0.115.15
      }
      
      vrrp_script chk_haproxy {
          script "pkill -0 haproxy && exit 0 || exit 1"
          interval 1
          weight -5
          fall 2
          rise 1
      }
      
      vrrp_instance VI_1 {
          state BACKUP
          interface ens33
          virtual_router_id 10
          priority 96
          advert_int 1
          authentication {
              auth_type PASS
              auth_pass hello
          }
          virtual_ipaddress {
              192.168.11.200 label ens33:0
          }
          track_script {
              chk_haproxy
          }
          notify_master "/etc/keepalived/notify.sh master"
          notify_backup "/etc/keepalived/notify.sh backup"
          notify_fault "/etc/keepalived/notify.sh fault"
      
      }
    2. 写notify脚本,内容如下:

      #!/bin/bash
      #
      
      contact='root@localhost'
      
      notify() {
              local mailsubject="$(hostname) to be $1,vip floating."
              local mailbody="$(date + '%F %T'):vrrp transition,$(hostname) changed to be $1."
              echo "$mailbody" | mail -s "$mailsubject" $contact
      }
      
      case $1 in
      master)
              notify master;;
      backup)
              notify backup;;
      fault)
              notify fault;;
      *)
              echo "Usage: $(basename $0) {master|backup|fault}"
              exit 1;;
      esac
    3. 定义的haproxy的虚拟ip为192.168.11.200,此时任何一个haproxy主机或者haproxy服务故障都不会影响网站的正常访问,通过192.168.11.200即可访问到网站。此时实验配置成功,而且网站通过varnish可承载大量并发,但是仍有问题,前台haproxy为高可用,但是后台varnish和动静服务器均是单点,为单点故障,所以还需要进一步完善。

    网站访问流程为:client –> 前端MASTER haproxy –> varnish –> 后端动静服务器。

    原文链接:https://www.cnblogs.com/chenghuan/articles/7533110.html

    其他参考:

    Keepalived高可用+HAproxy实现Nginx+wordpress动静分离:https://blog.51cto.com/tianrandai01/1927305?utm_source=oschina-app
    HAProxy+Varnish动静分离部署WordPress:https://www.jianshu.com/p/16f65c538db7
    haproxy实现Discuz!动静分离:https://blog.51cto.com/9528du/1557181

     

  • 相关阅读:
    《Think Python》第7章学习笔记
    Arrays和String单元测试
    结对编程项目-四则运算 第二周
    2018-2019-2 20175227张雪莹《Java程序设计》 实验二《Java面向对象程序设计》
    类定义
    20175227张雪莹 2018-2019-2 《Java程序设计》第六周学习总结
    结对编程项目-四则运算 第一周 阶段性总结
    迭代和JDB
    20175227张雪莹 2018-2019-2 《Java程序设计》第五周学习总结
    结对学习小组
  • 原文地址:https://www.cnblogs.com/soymilk2019/p/11136762.html
Copyright © 2011-2022 走看看