我是靠谱客的博主 孤独乌龟,最近开发中收集的这篇文章主要介绍高可用Web群集架构(Keepalived,Nginx,Tomcat,Docker-Compose,Elk,Consul)前言一、案例拓扑图二、案例环境三、案例搭建四、案例测试,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

  • 前言
  • 一、案例拓扑图
  • 二、案例环境
  • 三、案例搭建
    • 3.1 Web服务器
    • 3.2 Nginx反向代理服务器-主
    • 3.3 Nginx反向代理服务器-从
    • 3.4 日志服务器
  • 四、案例测试
    • 4.1 访问Web服务器
    • 4.2 Consual自动发现
    • 4.3 VIP地址访问
    • 4.4 模仿宕机
    • 4.5 查看后台日志

前言

本文介绍了如何搭建一个高可用Web群集架构。

Nginx反向代理服务器特点如下:

  1. 利用Keepalived实现高可用
  2. 利用Nginx反向代理服务器实现网页访问的负载均衡以及动静分离
  3. 利用Consul-Template实现高灵活性Web服务器的搭建,从而使Web服务器使用Docker创建Web容器时,可以自动发现容器,并实现负载均衡

Web服务器特点如下:

  1. 利用Docker-Compose编排迅速搭建多个Web容器

日志服务器特点如下:

  1. 群集实现,保证高可用性
  2. 分别收集主备Nginx反向代理服务器的日志
  3. 利用Kibana使日志可视化

一、案例拓扑图

在这里插入图片描述

二、案例环境

服务器所含服务IP地址
Nginx反向代理服务器-主Consul,Nginx,Logstash,Keepalived,Consul-Template10.0.0.102
10.0.0.100(VIP)
Nginx反向代理服务器-备Consul,Nginx,Logstash,Keepalived,Consul-Template10.0.0.103
10.0.0.100(VIP)
Web服务器Docker(Nginx,Tomcat),Docker-Compose,Registrator10.0.0.104
日志服务器Elasticsearch,Kibana10.0.0.105
日志服务器Elasticsearch10.0.0.106

三、案例搭建

注意:
以下只是按照每个服务器搭建
部分服务的搭建有一定顺序要求

  1. Consual-Agent------>Registrator------>Consul-Template
  2. Elasticsearch------>Logstash------>Kibana

3.1 Web服务器

Docker服务器环境部署见博文Docker搭建

# 创建相关网页
[root@web ~]# echo "<center>Nginx-1</center>" > /web/1/index.html 
[root@web ~]# echo "<center>Nginx-2</center>" > /web/2/index.html 
[root@web ~]# echo "<center>Tomcat-1</center>" > /web/3/index.jsp 
[root@web ~]# echo "<center>Tomcat-2</center>" > /web/4/index.jsp 

# 使用Docker—Compose编排Web相关容器
[root@web ~]# vi compose_web/docker.yml 

version: '3'
services:
  nginx1:
    hostname: nginx
    container_name: nginx1
    image: nginx:latest
    ports:
     - 1414:80
    networks:
     - master
    volumes:
     - /web/1/:/usr/local/nginx/html
  nginx2:
    hostname: nginx
    container_name: nginx2
    image: nginx:latest
    ports:
     - 1415:80
    networks:
     - master
    volumes:
     - /web/2/:/usr/local/nginx/html
  tomcat1:
    hostname: tomcat
    container_name: tomcat1
    image: tomcat:latest
    ports:
     - 1515:8080
    networks:
     - master
    volumes:
     - /web/3/:/usr/local/tomcat/webapps/ROOT
  tomcat2:
    hostname: tomcat
    container_name: tomcat2
  hostname: tomcat
    container_name: tomcat2
    image: tomcat:latest
    ports:
     - 1516:8080
    networks:
     - master
    volumes:
     - /web/4/:/usr/local/tomcat/webapps/ROOT
networks:
  master:

[root@web ~]# docker-compose -f /root/compose_web/docker.yml up -d
Creating nginx2  ... done
Creating nginx1  ... done
Creating tomcat2 ... done
Creating tomcat1 ... done
[root@web ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
ec2525280baf        tomcat:latest       "/usr/local/tomcat/b…"   7 seconds ago       Up 5 seconds        0.0.0.0:1515->8080/tcp   tomcat1
5c3dfe67c0bf        tomcat:latest       "/usr/local/tomcat/b…"   7 seconds ago       Up 5 seconds        0.0.0.0:1516->8080/tcp   tomcat2
582078c6146c        nginx:latest        "/usr/local/nginx/sb…"   7 seconds ago       Up 5 seconds        0.0.0.0:1415->80/tcp     nginx2
41afbcc07872        nginx:latest        "/usr/local/nginx/sb…"   7 seconds ago       Up 5 seconds        0.0.0.0:1414->80/tcp     nginx1
# 安装Registrator并实现注册
[root@web ~]# docker run -d 
> --name=registrator1 
> --net=host 
> -v /var/run/docker.sock:/tmp/docker.sock 
> --restart=always 
> gliderlabs/registrator:latest 
> -ip=10.0.0.104 
> consul://10.0.0.102:8500
[root@web ~]# docker run -d 
> --name=registrator2 
> --net=host 
> -v /var/run/docker.sock:/tmp/docker.sock 
> --restart=always 
> gliderlabs/registrator:latest 
> -ip=10.0.0.104 
> consul://10.0.0.103:8500

3.2 Nginx反向代理服务器-主

Nginx环境搭建见博文Nginx搭建

Logstash环境搭建见博文Logstash搭建

# 创建VIP
[root@master ~]# vi VIP.sh 
ifconfig ens33:0 10.0.0.100 broadcast 10.0.0.100  netmask 255.255.255.255 up       #添加虚拟地址的虚接口
route add -host 10.0.0.100 dev ens33:0
[root@master ~]# sh VIP.sh 

# 使用agent代理功能
[root@master ~]# consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=10.0.0.102 -client=0.0.0.0 -node=consul-server02 &>/var/log/consul.log &

# 编辑 template nginx 模板文件
[root@master ~]# vi /root/consul/web.ctmpl 
upstream nginx_backend {
   {{range service "nginx"}}
    server {{.Address}}:{{.Port}};
     {{end}}
}

upstream tomcat_backend {
   {{range service "tomcat"}}
    server {{.Address}}:{{.Port}};
     {{end}}
}

server {
  listen 10.0.0.100:80;
  server_name 10.0.0.100 localhost;
  access_log /var/log/nginx/web-access.log;
  index index.html index.php index.jsp;
  location / {
    proxy_set_header HOST $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Client-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://nginx_backend;
  }
  location ~.*.jsp$ {
    proxy_set_header HOST $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Client-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://tomcat_backend;
  }
}

# 编辑nginx配置并启动
[root@master ~]# vi /usr/local/nginx/conf/nginx.conf
http {
    include       vhost/*.conf;		# 添加
    include       mime.types;		
————————----省略-------------------
[root@master ~]# /usr/local/nginx/sbin/nginx

# 配置consul-template启动
[root@master ~]# consul-template -consul-addr 10.0.0.102:8500 -template "/root/consul/web.ctmpl:/usr/local/nginx/conf/vhost/web.conf:/usr/local/nginx/sbin/nginx -s reload" --log-level=info

# 配置Logstash
[root@master ~]# vi /etc/logstash/conf.d/nginx_log.conf
input {
        file {
          path => "/var/log/nginx/web-access.log"
          start_position => "beginning"
        }

   }
output {
          elasticsearch {
            hosts => ["10.0.0.105:9200"]
            index => "web_master_access-%{+YYY.MM.dd}"
        }
    }

[root@master ~]# logstash -f /etc/logstash/conf.d/nginx_log.conf

# 配置Keepalived高可用
[root@master ~]# yum -y install keepalived
[root@master ~]# vi /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 127.0.0.1		# 需要修改
   smtp_connect_timeout 30
   router_id LVS_01				# 不同点
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER				# 不同点
    interface ens33				# 需要修改
    virtual_router_id 51
    priority 100				# 不同点		
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.100				# 需要修改
    }
}
[root@master ~]# systemctl start keepalived

# 配置 Nginx 检测脚本
[root@master ~]# vi nginx_check.sh
#!/bin/bash
while true
do
if [ $(netstat -tlnp|grep nginx|wc -l) -ne 1 ]
then
    /etc/init.d/keepalived stop
fi
sleep 2
done
[root@master ~]# chmod +x nginx_check.sh
[root@master ~]# nohup /root/nginx_check.sh &

3.3 Nginx反向代理服务器-从

Nginx环境搭建见博文Nginx搭建

Logstash环境搭建见博文Logstash搭建

# 创建VIP
[root@backup ~]# vi VIP.sh 
ifconfig ens33:0 10.0.0.100 broadcast 10.0.0.100  netmask 255.255.255.255 up       #添加虚拟地址的虚接口
route add -host 10.0.0.100 dev ens33:0
[root@backup ~]# sh VIP.sh 

# 使用agent代理功能
[root@backup ~]# consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=10.0.0.103 -client=0.0.0.0 -node=consul-server02 &>/var/log/consul.log &

# 编辑 template nginx 模板文件
[root@backup ~]# vi /root/consul/web.ctmpl 
upstream nginx_backend {
   {{range service "nginx"}}
    server {{.Address}}:{{.Port}};
     {{end}}
}

upstream tomcat_backend {
   {{range service "tomcat"}}
    server {{.Address}}:{{.Port}};
     {{end}}
}

server {
  listen 10.0.0.100:80;
  server_name 10.0.0.100 localhost;
  access_log /var/log/nginx/web-access.log;
  index index.html index.php index.jsp;
  location / {
    proxy_set_header HOST $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Client-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://nginx_backend;
  }
  location ~.*.jsp$ {
    proxy_set_header HOST $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Client-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://tomcat_backend;
  }
}

# 编辑nginx配置并启动
[root@backup ~]# vi /usr/local/nginx/conf/nginx.conf
http {
    include       vhost/*.conf;		# 添加
    include       mime.types;		
————————----省略-------------------
[root@backup ~]# /usr/local/nginx/sbin/nginx

# 配置consul-template启动
[root@backup ~]# consul-template -consul-addr 10.0.0.103:8500 -template "/root/consul/web.ctmpl:/usr/local/nginx/conf/vhost/web.conf:/usr/local/nginx/sbin/nginx -s reload" --log-level=info

# 配置Logstash
[root@backup ~]# vi /etc/logstash/conf.d/nginx_log.conf
input {
        file {
          path => "/var/log/nginx/web-access.log"
          start_position => "beginning"
        }

   }
output {
          elasticsearch {
            hosts => ["10.0.0.105:9200"]
            index => "web_master_access-%{+YYY.MM.dd}"
        }
    }

[root@backup ~]# logstash -f /etc/logstash/conf.d/nginx_log.conf

# 配置Keepalived高可用
[root@backup ~]# yum -y install keepalived
[root@backup ~]# vi /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 127.0.0.1		# 需要修改
   smtp_connect_timeout 30
   router_id LVS_02				# 不同点
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP				# 不同点
    interface ens33				# 需要修改
    virtual_router_id 51
    priority 95					# 不同点		
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.100				# 需要修改
    }
}
[root@backup ~]# systemctl start keepalived

3.4 日志服务器

日志服务器环境搭建见博文Elasticsearch及Kibana搭建

Elasticsearch
# 修改配置文件
[root@node-1 ~]# vi /etc/elasticsearch/elasticsearch.yml 
17: cluster.name: elk-cluster  	# 集群名称
23: node.name: node-1  ## 当前节点名
33: path.data: /data/elk-data   	# 数据存储的位置(目录不存在,需要创建)
37: path.logs: /var/log/elasticsearch/  	# 日志文件存放的位置
43: bootstrap.memory_lock: false 
 	# true:允许内存中的数据交还给SWAP,flase:不允许内存中的数据交还给SWAP。
 选择false,因为swap分区实在硬盘上建立的,如果内存不够,数据溢出,分到硬盘上的话,会影响速度
54: network.host: 0.0.0.0   	# 监听地址,0.0.0.0表示所有网段
58: http.port: 9200   	# ES端口号,外部通信的端口号   PS:9300是集群内部通信端口
67: discovery.zen.ping.unicast.hosts: ["node-1", "node-2"]   	# 群集中包含的节点名,也可以用IP地址

# 添加映射
[root@node-1 ~]# vi /etc/hosts
10.0.0.105       node-1
10.0.0.106       node-2
                        

# 创建目录及开启服务
[root@node-1 ~]# mkdir -p /data/elk-data		
[root@node1 elasticsearch]# chown elasticsearch.elasticsearch /data/elk-data/		
[root@node1 elasticsearch]# systemctl start elasticsearch.service   




Kibana
# 修改配置文件
[root@node-1 ~]# vi /usr/local/kibana/config/kibana.yml 
# 2行 kibana打开的端口
server.port: 5601

# 5行 kibana侦听的地址
server.host: "0.0.0.0"


# 12行 和elasticsearch建立联系
elasticsearch.url: "http://10.0.0.105:9200"

# 20行 在elasticsearch中添加.kibana索引
kibana.index: ".kibana"

[root@node-1 ~]# yum -y install screen
[root@node-1 ~]# /usr/local/kibana/bin/kibana 

至此,架构搭建完毕。

四、案例测试

4.1 访问Web服务器

在这里插入图片描述
在这里插入图片描述

4.2 Consual自动发现

在这里插入图片描述

[root@web ~]# docker run -d -P nginx
fb4306f4b417d58626b1661e78781686118fc0eec93609d42fa809c227e007f2
[root@web ~]# docker run -d -P tomcat
39939ec10452489350d0e4e842e85ba9e607e9231f1ba99e303b44b6feb14d82

在这里插入图片描述

4.3 VIP地址访问

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.4 模仿宕机

在这里插入图片描述

在这里插入图片描述

仍可以正常访问

在这里插入图片描述

4.5 查看后台日志

  • 主服务器

在这里插入图片描述

  • 备服务器

在这里插入图片描述

最后

以上就是孤独乌龟为你收集整理的高可用Web群集架构(Keepalived,Nginx,Tomcat,Docker-Compose,Elk,Consul)前言一、案例拓扑图二、案例环境三、案例搭建四、案例测试的全部内容,希望文章能够帮你解决高可用Web群集架构(Keepalived,Nginx,Tomcat,Docker-Compose,Elk,Consul)前言一、案例拓扑图二、案例环境三、案例搭建四、案例测试所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部