实验目的

  • 测试基于haproxy的反代和负载均衡配置
  • 测试keepalived高可用haproxy的效果

实验要点

(1) 动静分离discuzx,动静都要基于负载均衡实现;

(2) 进一步测试在haproxy和后端主机之间添加varnish缓存;

(3) 给出拓扑设计;

(4) haproxy的设定要求:

(a) 启动stats;

(b) 自定义403、502和503的错误页;

(c) 各组后端主机选择合适的调度方法;

(d) 记录好日志;

(e) 使用keepalived高可用haproxy;

.

拓扑结构

拓扑图的简要说明

  • node2和node5上同时运行keepalived和haproxy,做高可用,VIP为172.16.47.100
  • 在node3和node4上,模拟了2台基于IP的虚拟主机,以减少实验中机器的数量
  • 在node3上,运行nginx的同时,还运行了nfs服务,共享目录;在node4上把该共享目录挂载到本地,用于httpd服务存放静态内容;node3上的nginx将该目录作为其网页文件根路径,从而实现了静态内容的共享
  • haproxy主机负责接受用户请求,当用户请求的是图片资源时,调度至nginx服务器,否则调度请求至httpd服务器

实验配置

根据实验拓扑,在node3上部署nginx服务,nfs服务

[root@node3 ~]# rpm -ivh nginx-1.10.0-1.el7.ngx.x86_64.rpm  #安装nginx
[root@node3 ~]# yum install nfs-utils -y #安装nfs
[root@node3 ~]# mkdir /testdir/nfs -pv #创建nfs服务器的导出目录
[root@node3 ~]# vim /etc/exports
[root@node3 ~]# cat /etc/exports #授权node4上的2个ip可以访问
/testdir/nfs 172.16.47.104(rw,no_root_squash) 172.16.47.204(rw,no_root_squash)
[root@node3 ~]# systemctl start rpcbind
[root@node3 ~]# systemctl start nfs #启动nsf服务,因为nfs服务依赖于rpc服务,因此要先启动rpc

ssl -tnl可以看到111端口(rpc)和2049(nfs)都已经起来

修改nginx的配置文件,添加两个基于IP的虚拟主机,以模拟一组静态服务器组,将其网页根文件路径设置为nfs服务器的导出目录。

[root@node3 /etc/nginx/conf.d]# egrep -v "#|^$" default.conf
server {
listen 172.16.47.103:80;
server_name www.33love.me;
location / {
root /testdir/nfs;
index index.html index.htm;
rewrite /attachment/(.*)$ /$1; #因为在前端用户访问某附件资源时,其访问路径是http://172.16.47.100/bbs/data/attachment/XX,而nginx本地只有attachment目录下的相关资源,因此要对url进行重写
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
server {
listen 172.16.47.203:80;
server_name www.33love.com;
root /testdir/nfs;
index index.html;
rewrite /attachment/(.*)$ /$1;
}
[root@node3 /etc/nginx/conf.d]#

提供测试主页,启动nginx服务,测试nginx服务是否正常

在node4上部署配置amp环境

yum install httpd php php-mysql mariadb-server -y,启动mariadb,创建bbs库,授权用户访问,部署用于安装Discuz论坛所需的数据库环境

解压Discuzx至httpd工作目录/var/www/html/下,改名upload为bbs,解压目录下的data/attachment/目录为用户上传附件的目录,将node3上的共享目录/testdir/nfs挂载到该目录下。这样的话,就需要先将该目录下的文件先备份处理,待挂载后,再移进来。

注意:得先在node3上创建一个于node4上的apache用户相同ID号的用户,并且让该用户对nfs导出的目录有写权限。

再来配置httpd服务器,创建两个基于IP的虚拟主机,模拟动态服务器组

两个IP访问都没问题,开始安装

在node2上安装部署haproxy和keepalived

yum install haproxy keepalived -y #安装相应软件

配置keepalived高可用haproxy,node2为备节点
! Configuration File for keepalived global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id Lurker
vrrp_mcast_group4 224.0.100.33
} vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 1 #每隔一秒执行一次上面的检测
weight -5 #权重减5,而主的上面我配置的是权重减10
rise 1
fall 2
} vrrp_instance VI_1 {
state BACKUP #备
interface eno16777736
virtual_router_id 14
priority 95 #优先级
advert_int 1 #vrrp通告的时间间隔
authentication {
auth_type PASS
auth_pass 3333
} track_script {
chk_haproxy
} virtual_ipaddress {
172.16.47.100/16 dev eno16777736
}
track_interface {
eno16777736
}
} HAProxy的配置
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
errorfile 403 /tmp/403.html #定义错误页面
errorfile 502 /tmp/502.html
errorfile 503 /tmp/503.html frontend bbs *:80 #注意备份节点上的监听地址不能写出VIP,因为它是Backup状态时,是没有VIP的,如果写出VIP,这时会报错的
acl fujian path_sub -i /attachment #定义acl,当访问路径有attachment时,匹配
use_backend nginxgroup if fujian
default_backend httpdgroup backend nginxgroup #定义处理静态内容的nginx服务器组
balance roundrobin
server nginx103 172.16.47.103:80 check maxconn 1000
server nginx203 172.16.47.203:80 check maxconn 2000 backend httpdgroup #定义处理动态内容的httpd服务器组
balance uri
option httpchk /index.html
hash-type consistent
server httpd104 172.16.47.104:80 check maxconn 300
server httpd204 172.16.47.204:80 check maxconn 500 listen statspage #自定义状态页面
bind *:3333
stats enable
stats uri /myadmin?stats
stats realm Lurker\ HAProxy \stats \Page
stats auth admin:admin@123
stats admin if TRUE 配置rsyslog
开启TCP或UDP
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514 # Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
加上一句定义loacl2的facility日志文件路径
local12.* /varlog/haproxy.log

node5上的配置也是类似,只不过配置keepalived时要配置成主节点。

重启rsyslog,启动keepalived,haproxy,测试访问。

停掉主节点node5上的haproxy,可以看到VIP,已经到备节点node2上,页面也仍可以正常访问

至此,keepalived高可用haproxy成功。不过在这里的时候遇到一个坑,记录一下。

在配置好keepalived高可用haproxy后,把node5(主)和node3(备)上的haproxy和keepalived都起起来,这时VIP在node5上面,能正常访问页面,这没问题;把node5上的Haproxy停掉之后,它的优先级减了10,成了90,,这也没问题,但是,node3的优先级按正常来说应该是95,这时node3优先级比node5高,应该成为主,VIP应该在node3上,但是实际上却没有。

在node2上抓包'tcpdump -i eno16777736 -nn host 224.0.100.33'

可以看到,仍是node5(172.16.47.105)发的vrrp报文,并且优先级变成了90。

到这里我们来分析一下:node5的优先级降低,都变成了90,而node2却还没有变成主,难道是node2的优先级更低?停掉node5上的keepalived让其优先级变为0,来看看node2的优先级。

node2的优先级不是应该是95吗,怎么变成90了?于是想到检查haproxy健康状态的配置段:

vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 1 #每隔一秒执行一次上面的检测
weight -5 #权重减5,而主的上面我配置的是权重减10
rise 1
fall 2
}

killall -0 haproxy是检查haproxy进程是否存在,存在返回0。所以检测的逻辑是:每秒钟执行一次script "killall -0 haproxy",如果返回码为0,则不执行下面的weight -5,否则执行。自己手动执行一下killall -0 haproxy,发现killall命令竟然不存在。

killall命令不存在,那么killall命令肯定执行不成功,返回非0值了。于是就明白为什么node2权重会异常的减5了。安装上killall所需的包,问题就解决了。

统计页面如下:

现在来验证动静分离是否成功:查看已经上传的图片是由谁处理的。

可以看到,是由nignx处理的,再来看看其他资源

可以看到,是由apache处理的。这说明,我们在haproxy上定义的acl生效了,当匹配到/attachment时,请求就被调度至nginx,其他的请求全都送往httpd服务器组,查看我们定义的haproxy的日志,可以看到nginxgroup和httpdgroup都处理过请求。

node4上停掉httpd服务器,systemctl stop httpd.service ,我们自定义的错误页面也出来了

至此,discuz论坛的动静分离也已经实现。

HAProxy实战的更多相关文章

  1. 如何掌握并提高linux运维技能

    初中级Linux运维人员们系统学习并迅速掌握Linux的运维实战技能.学习路线大纲如下: 入门基础篇 系统运维篇 Web运维篇 数据库运维篇 集群实战篇 运维监控篇 第一篇:Linux入门(安装.配置 ...

  2. WEB相关系列

    一.Nginx(web服务器) Nginx概述和安装(1) Nginx配置文件(2) Nginx日常维护操作(3) Nginx常用配置实例(4) Nginx常用功能(5) Nginx性能优化技巧(6) ...

  3. 如何迅速掌握并提高linux运维技能(收藏文)

    如何迅速掌握并提高linux运维技能   文章来源于南非蚂蚁   之前曾经写过一篇如何学习Linux的文章,得到了很多反馈,大家都在分享自己的学习经验和体会,并且也提出了不少意见和建议.学习这个事情其 ...

  4. 项目实战4—haproxy 负载均衡和ACL控制

     haproxy实现高级负载均衡实战 环境:随着公司业务的发展,公司负载均衡服务已经实现四层负载均衡,但业务的复杂程度提升,公司要求把mobile手机站点作为单独的服务提供,不在和pc站点一起提供服务 ...

  5. 项目实战4—HAProxy实现高级负载均衡实战和ACL控制

     haproxy实现高级负载均衡实战 环境:随着公司业务的发展,公司负载均衡服务已经实现四层负载均衡,但业务的复杂程度提升,公司要求把mobile手机站点作为单独的服务提供,不在和pc站点一起提供服务 ...

  6. Haproxy+keepalived高可用集群实战

    1.1  Haproxy+keepalived高可用集群实战 随着互联网火热的发展,开源负载均衡器的大量的应用,企业主流软件负载均衡如LVS.Haproxy.Nginx等,各方面性能不亚于硬件负载均衡 ...

  7. 基于虚拟主机的HAProxy配置实战

    本实例是如上图所示 主要实现的功能如下: 当客户访问www.tb.com/tb.com的时候HAProxy将网站提交到电商服务器集群当访问bbs.tb.com的时候,将访问请求调度到论坛集群,实现论坛 ...

  8. haproxy/nginx+keepalived负载均衡 双机热备 邮件报警 实战及常见问题

    Haproxy 做http和tcp反向代理和负载均衡keepalived 为两台 Haproxy 服务器做高可用/主备切换.nginx   为内网服务器做正向代理,如果业务需求有变化,也可以部分替代 ...

  9. asp.net core 实战之 redis 负载均衡和"高可用"实现

    1.概述 分布式系统缓存已经变得不可或缺,本文主要阐述如何实现redis主从复制集群的负载均衡,以及 redis的"高可用"实现, 呵呵双引号的"高可用"并不是 ...

随机推荐

  1. java--面向对象编程

    instanceof的用法 静态绑定,即早期绑定,首先找父类 动态绑定,即运行时绑定,new谁找谁 Object o1 = null; //正确的语法,null也是一种特殊的引用数据类型 object ...

  2. iOS MVVM 前世今生

    MVVM,Model-View-ViewModel,一个从 MVC 模式中进化而来的设计模式,最早于2005年被微软的 WPF 和 Silverlight 的架构师 John Gossman 提出.

  3. HDU -2100-Lovekey

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2100 这题开始一直想着先把26进制转换成10进制,在转换成26进制,又200个字符因而行不通, 直接卡 ...

  4. Java数据库连接--JDBC调用存储过程,事务管理和高级应用

    相关链接:Jdbc调用存储过程 一.JDBC常用的API深入详解及存储过程的调用 1.存储过程的介绍 我们常用的操作数据库语言SQL语句在执行的时候要先进行编译,然后执行,而存储过程是在大型数据库系统 ...

  5. C# INotifyPropertyChanged使用方法

    INotifyPropertyChanged 接口:向客户端发出某一属性值已更改的通知. NotifyPropertyChanged 接口用于向客户端(通常是执行绑定的客户端)发出某一属性值已更改的通 ...

  6. Canvas arcTo绘制圆弧

    arcTo(x1,y1,x2,y2,r); 当前点x0,y0;圆弧与(x0,y0-x1,y1)相切,与(x1,y1-x2,y2)相切: <!DOCTYPE html> <html l ...

  7. 使用IntelliJ IDEA开发SpringMVC网站(一)开发环境

    使用IntelliJ IDEA开发SpringMVC网站(一)开发环境 摘要: 主要讲解初期的开发环境搭建,Maven的简单教学. 访问GitHub下载最新源码:https://github.com/ ...

  8. Python爬虫基础

    前言 Python非常适合用来开发网页爬虫,理由如下: 1.抓取网页本身的接口 相比与其他静态编程语言,如java,c#,c++,python抓取网页文档的接口更简洁:相比其他动态脚本语言,如perl ...

  9. thinkjs之页面跳转

    对于刚入手thinkjs项目的新手来说,时常会犯的一个错误就是“混用”各种代码逻辑,比如:我们经常在做后台管理系统的时候用到的登录框,,其实它原本是有一个路由专门存放自己的代码逻辑,而在点击提交按钮的 ...

  10. Win下 MySQL数据库安装与配置详解

    第一步 从官网下载安装包 (本次只写安装版的32位的mysql) 1. https://www.mysql.com/downloads/ 下载的官网地址 一直滑到最下面 然后点第一个 然后选第一个 这 ...