docker搭建nginx主备模式反向代理Nacos集群加mysql主从复制

本教程环境

服务器1:CentOS7.7 IP:192.168.200.131(推荐使用该版本)
都需安装docker,安装docker环境教程请移步 https://blog.csdn.net/weixin_44790046/article/details/105612438

一、先确定自己是否有docker-compose环境

docker-compose version

在这里插入图片描述

如果出现了docker-compose的版本号则直接看第3步,否则进入第2步的docker-compose环境安装

二、 安装docker-compose环境

# Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker。下面我们以编译好的二进制包方式安装在Linux系统中。 
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

# 设置文件可执行权限 
chmod +x /usr/local/bin/docker-compose

# 查看版本信息 
docker-compose -version

三、 搭建Nacos集群

官网地址:https://nacos.io/zh-cn/docs/quick-start-docker.html

1、 Clone 项目

#进入根目录
cd /
#clone项目
git clone https://github.com/nacos-group/nacos-docker.git
#进入项目目录
cd nacos-docker

如果提示git指令未找到

#安装git工具
yum install -y git

nacos-docker目录结构

在这里插入图片描述

项目目录

  • build:nacos 镜像制作的源码
  • env: docker compose 环境变量文件
  • example: docker-compose 编排例子

构建各种类型镜像的指令:

  • 单机模式 Derby
docker-compose -f example/standalone-derby.yaml up
  • 单机模式 Mysql
docker-compose -f example/standalone-mysql.yaml up
  • 集群模式
docker-compose -f example/cluster-hostname.yaml up 

2、修改配置

这里我们搭建集群模式,我们先对构建集群的yaml文件做一些配置(修改了mysql的容器名,挂载路径,默认root用户密码),修改/nacos-docker/example/cluster-hostname.yaml 文件

version: "3"
services:
  nacos1:
    hostname: nacos1
    container_name: nacos1
    image: nacos/nacos-server:latest
    volumes:
      - ./cluster-logs/nacos1:/home/nacos/logs
      - ./init.d/custom.properties:/home/nacos/init.d/custom.properties
    ports:
      - "8848:8848"
      - "9555:9555"
    env_file:
      - ../env/nacos-hostname.env
    restart: always
    depends_on:
      - mysql

  nacos2:
    hostname: nacos2
    image: nacos/nacos-server:latest
    container_name: nacos2
    volumes:
      - ./cluster-logs/nacos2:/home/nacos/logs
      - ./init.d/custom.properties:/home/nacos/init.d/custom.properties
    ports:
      - "8849:8848"
    env_file:
      - ../env/nacos-hostname.env
    restart: always
    depends_on:
      - mysql
  nacos3:
    hostname: nacos3
    image: nacos/nacos-server:latest
    container_name: nacos3
    volumes:
      - ./cluster-logs/nacos3:/home/nacos/logs
      - ./init.d/custom.properties:/home/nacos/init.d/custom.properties
    ports:
      - "8850:8848"
    env_file:
      - ../env/nacos-hostname.env
    restart: always
    depends_on:
      - mysql
  mysql:
    container_name: mysql_master
    image: mysql:5.7
    env_file:
      - ../env/mysql.env
    volumes:
      - /mysql/master/data:/var/lib/mysql
      - /mysql/master/conf/my.cnf:/etc/my.cnf
    environment:
        MYSQL_ROOT_PASSWORD: 362623
        TZ: 'Asia/Shanghai'
    ports:
      - "3306:3306"

3、创建宿主机的挂载目录(重要)

#进入根目录
cd /

#root目录创建
mkdir -p mysql/master

#进入目录
cd mysql/master

#创建两个目录
mkdir conf data

#创建配置文件
cd conf/
vim my.cnf

#my.cnf输入如下内容
[mysqld]
server-id	= 1	#服务id,不可重复
log-bin		= mysql-bin	#开启二进制日志

在这里插入图片描述
4、如果你的服务器内存资源足够(大于4G),则可以直接运行

docker-compose -f example/cluster-hostname.yaml up 

如果资源不够会出现三台nacos机器疯狂重启的情况,这时我们可以选择增加服务器内存或者修改nacos运行配置,修改/root/nacos-docker/env/nacos-hostname.env配置文件如下
在这里插入图片描述

#jvm
JVM_XMS=256m
JVM_XMX=256m
JVM_XMN=256m

5、现在就可以运行命令了

#进入项目目录
cd /root/nacos-docker/
#执行
docker-compose -f example/cluster-hostname.yaml up 

启动成功后 我们就可以访问 nacos 控制台了

访问地址1:http://宿主机IP:8848/nacos
访问地址2:http://宿主机IP:8849/nacos
访问地址3:http://宿主机IP:8850/nacos
默认登录账号密码都是nacos
如图则集群搭建成功

在这里插入图片描述
6、如果以上步骤你都做得一样,但还是访问不了页面

(1)登录运行中的mysql数据库查看是否有nacos_devtest数据库并且有表有数据
在这里插入图片描述
(2)如果有那么执行以下命令

 #进入项目目录
cd /nacos-docker/

#停止所有相关服务
docker-compose -f /nacos-docker/example/cluster-hostname.yaml stop

#开启所有相关服务
docker-compose -f /nacos-docker/example/cluster-hostname.yaml start

(3)如果只有数据库没有表,那么自行执行sql脚本添加即可
进入官网地址下载:https://github.com/alibaba/nacos/releases/tag/1.3.0
在这里插入图片描述
这两个随便下哪一个都可以,下载完成后解压,conf目录下有一个nacos-mysql.sql
在这里插入图片描述
连接数据库将sql脚本数据导入nacos_devtest数据库中即可

(4)然后执行以下命令,生效较慢,多等一会就行

 #进入项目目录
cd /nacos-docker/

#停止所有相关服务
docker-compose -f /nacos-docker/example/cluster-hostname.yaml stop

#开启所有相关服务
docker-compose -f /nacos-docker/example/cluster-hostname.yaml start

然后应该就没问题了,访问试试,如果还是不行,在下方评论留言

四、搭建MySQL数据库的主从复制架构

注意:主从复制需要注意的地方
	● 主DB server和从DB server数据库的版本一致
	● 主DB server和从DB server数据库数据一致
	● 主DB server开启二进制日志,主DB server和从DB server的server_id都必须唯一

一、主数据库搭建

1、查看二进制日志功能是否打开

show variables like '%log_bin%';

在这里插入图片描述

如果显示为OFF那么就是mysql的my.cnf配置文件没配置对
这步如果不能成功,下面就无法进行

2、创建同步账户以及授权该账户

create user 'admin'@'%' identified by '362623';
grant replication slave on *.* to 'admin'@'%';
flush privileges;

查看mysql数据库user中是否有新添加的用户
在这里插入图片描述
如果执行过程中出现[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and错误

#解决方案,在my.cnf配置文件中添加如下设置
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION'

查看master状态

#查看master状态
show master status;

#查看二进制日志相关的配置项
show global variables like 'binlog%';

#查看s erver相关的配置项
show global variables like 'server%';

在这里插入图片描述

至此,主数据库搭建完成!

二、从数据库搭建

在这里插入图片描述
注意:开头所说的第二条注意事项,我们前面创建完Nacos集群后,mysql_master这个mysql中是有一个nacos_devtest数据库的。

方式一:我们需要将mysql_masternacos_devtest数据库copy到mysql_slave01中,这样的话两个mysql的数据就保持一致了。主数据库执行 reset slave; 命令清除一下记录

方式二:我们将mysql_masternacos_devtest数据库直接删除,主数据库执行 reset slave; 命令清除一下记录,这样的话两个mysql的数据就保持一致了,等下面配置完后,再将数据信息导入主数据库,注意数据库名还是一开始设置的nacos_devtest,由于我们配置完了主从关系,你给主数据库添加了,那么从数据库也就有了。(推荐)
如图:
在这里插入图片描述

1)创建目录

#进入根目录
cd /
#创建目录
mkdir -p mysql/slave01
cd mysql/slave01
mkdir conf data

在这里插入图片描述
2)创建配置文件

cd conf/
#创建配置文件
vim my.cnf

#在里面写入如下内容
[mysqld]
server-id	= 2	#服务id,不可重复

创建mysql从数据库容器

#创建容器
docker run -d \
--name mysql_slave01 \
-v /mysql/slave01/data:/var/lib/mysql \
-v /mysql/slave01/conf/my.cnf:/etc/my.cnf \
-p 3307:3306 \
-e MYSQL_ROOT_PASSWORD=362623 \
mysql:5.7

在这里插入图片描述
4)查看目录是否挂载成功(重要),如果/mysql/slave01/data目录有如下文件说明挂载成功
在这里插入图片描述
5)进入容器登录mysql(可以用远程连接工具连接)

docker exec -it mysql_slave01 /bin/bash

在这里插入图片描述
6)设置主库master的相关信息(注意:以下执行sql都是在从库中执行

#设置主库master的相关信息
CHANGE MASTER TO
 master_host='192.168.200.131',	#你的宿主机ip
 master_user='admin',	#上面在主数据库添加的用户名
 master_password= '362623',	#上面在主数据库添加的用户名密码
 master_port=3306,	#主数据库端口
 master_log_file='mysql-bin.000003',	#主数据库搭建最后一步的那两个信息
 master_log_pos=741;	#主数据库搭建最后一步的那两个信息

在这里插入图片描述
7)启动同步

start slave;

注意:这里如果执行start slave 命令出现 Slave failed to initialize relay log info structure from the repository 错误,那么就是执行 reset slave; 命令清除记录再次执行第6步设置主库master的相关信息

在这里插入图片描述
8)查看master状态,如果红框两项都为yes那么恭喜你搭建成功

show slave status;

在这里插入图片描述

三、修改主从复制模式

#查看mysql_master二进制日志相关的配置项
show global variables like 'binlog%';

可以看到当前模式默认为ROW(基于行的复制)
在这里插入图片描述

在查看二进制日志相关参数内容中,会发现默认的模式为ROW ,其实在MySQL中提供了有3种模式,基于SQL语句的复制(statement-based replication, SBR) ,基于行的复制(row-based replication, RBR) ,混合模式复制(mixed-based replication, MBR)。对应的, binlog的格式也有三种: STATEMENT , ROW , MIXED。

STATEMENT模式(SBR)

  • 优点是并不需要记录每一条sql语句和每一 行的数据变化 ,减少了binlog日志量,节约IO ,提高性能。
  • 缺点是在某些情况下会导致master-slave中的数据不一致(如sleep)函数 ,last_insert_id() ,以及user-defined functions(udf)等会出现问题

ROW模式( RBR )

  • 不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了。而且不会出现某些特定情况下
    的存储过程、或function、 或trgger的调用和触发无法被正确复制的问题。缺点是会产生大量的日志,尤其是
    alter table的时候会让日志暴涨。

MIXED模式( MBR )

  • 以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog ,对于STATEMENT模式无法复制的操作使
    用ROW模式保存binlog , MySQL会根据执行的SQL语句选择日志保存方式。
    建议使用MIXED模式。

修改主库配置文件my.cnf

#追加下面配置
binlog_format	= MIXED

#停止所有服务
docker-compose -f /nacos-docker/example/cluster-hostname.yaml stop

#开启所有服务
docker-compose -f /nacos-docker/example/cluster-hostname.yaml start

#再次查看二进制日志相关的配置项
show global variables like 'binlog%';

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

测试

在主库中新建ceshi数据库并创建user表,在里面添加一条记录
在这里插入图片描述
我们发现从库也有了这张表和数据
在这里插入图片描述

至此,我们就实现了主从复制,当我们去执行写入的操作就可以写入到主库中,当执行查的操作就去从库查询,这样就节省了主库的压力。

五、Nginx主备模式搭建

一、创建主Nginx服务器

1、拉取nginx镜像

 docker pull nginx:1.19.0

2、创建映射目录

# 在根目录下创建nginx目录用于存储nginx数据信息
cd /
mkdir -p nginx/nginx_master
cd nginx/nginx_master
mkdir conf
cd conf
# 在nginx/nginx_master/conf/下创建nginx.conf文件,粘贴下面内容
vim nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        listen  [::]:80;
        server_name  localhost;
    
        #charset koi8-r;
        #access_log  /var/log/nginx/host.access.log  main;
    
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }
    
        #error_page  404              /404.html;
    
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}
    
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}
    
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }
}

3、创建nginx容器

docker run -id --name=nginx_master \ 
-p 80:80 \
-v /nginx/nginx_master/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /nginx/nginx_master/logs:/var/log/nginx \
-v /nginx/nginx_master/html:/usr/share/nginx/html \
nginx:1.19.0

4、设置nginx_master容器自动启动

docker update --restart=always nginx_master

补充:

#docker容器设置自动启动
创建启动容器时加--restart=always

Flag                  Description
no             不自动重启容器. (默认value)
on-failure     容器发生error而退出(容器退出状态不为0)重启容器
unless-stopped 在容器已经stop掉或Docker stoped/restarted的时候才重启容器
always         在容器已经stop掉或Docker stoped/restarted的时候才重启容器

如果已经创建启动的容器,则使用update更新:
docker update --restart=always nginx_master

5、在/nginx/nginx_master/html目录下新建一个index.html页面内容随意
在这里插入图片描述

6、启动容器访问测试

docker start nginx_master

在这里插入图片描述
7、配置反向代理和负载均衡(使用默认轮询方式)

修改/nginx/nginx_master/conf/nginx.conf配置文件如下

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    upstream nacos-cluster {
	server 192.168.200.131:8848;
	server 192.168.200.131:8849;
	server 192.168.200.131:8850;
    }

    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        listen  [::]:80;
        server_name  192.168.200.131;
    
        #charset koi8-r;
        #access_log  /var/log/nginx/host.access.log  main;
    
        location / {
	    	proxy_pass   http://nacos-cluster;
        }
    
        #error_page  404              /404.html;
    
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}
    
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}
    
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }
}
!!!分配方式
    Nginx的upstream支持5种分配方式,下面将会详细介绍,其中,前三种为Nginx原生支持的分配方式,后两种为第三方支持的分配方式:
1、轮询        
        轮询是upstream的默认分配方式,即每个请求按照时间顺序轮流分配到不同的后端服务器,如果某个后端服务器down掉后,能自动剔除。
        upstream backend {
            server 192.168.200.131:8848;
			server 192.168.200.131:8849;
			server 192.168.200.131:8850;
        }
2、weight        
        轮询的加强版,即可以指定轮询比率,weight和访问几率成正比,主要应用于后端服务器异质的场景下。
        upstream backend {
            server 192.168.200.131:8848 weight=1;
            server 192.168.200.131:8849 weight=2;
            server 192.168.200.131:8850 weight=3;
        }
3、ip_hash        
        每个请求按照访问ip(即Nginx的前置服务器或者客户端IP)的hash结果分配,这样每个访客会固定访问一个后端服务器,可以解决session一致问题。
        upstream backend {
            ip_hash;
            server 192.168.200.131:8848;
			server 192.168.200.131:8849;
			server 192.168.200.131:8850;
        }
4、fair        
        fair顾名思义,公平地按照后端服务器的响应时间(rt)来分配请求,响应时间短即rt小的后端服务器优先分配请求。
        upstream backend {
            server 192.168.200.131:8848;
			server 192.168.200.131:8849;
			server 192.168.200.131:8850;
            fair;
        }
5、url_hash
        与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。
        upstream backend {
            server 192.168.200.131:8848;
			server 192.168.200.131:8849;
			server 192.168.200.131:8850;
            hash $request_uri;
            hash_method crc32;
        }
        其中,hash_method为使用的hash算法,需要注意的是:此时,server语句中不能加weight等参数。

8、测试:直接访问你的nginx服务器地址http://192.168.200.131/nacos
在这里插入图片描述

上述已经完成了搭建,当然为避免nginx服务器单点故障,我们需要再配置一台备用nginx服务器,那么就需要用到keepalived

二、安装配置keepalived

1、体系架构

在Keepalived + Nginx高可用负载均衡架构中,keepalived负责实现High-availability (HA) 功能控制前端机VIP(虚拟网络地址),当有设备发生故障时,热备服务器可以瞬间将VIP自动切换过来,实际运行中体验只有2秒钟切换时间,DNS服务可以负责前端VIP的负载均衡。
nginx负责控制后端web服务器的负载均衡,将客户端的请求按照一定的算法转发给后端Real Server处理,而Real Server将响应直接返回给客户端。

2、简单原理

NGINX_MASTER、NGINX_BACKUP两台服务器均通过keepalived软件把ens33网卡绑上一个虚拟IP(VIP)地址192.168.200.199,此VIP当前由谁承载着服务就绑定在谁的ens33上,当NGINX_MASTER发生故障时,NGINX_BACKUP会通过/etc/keepalived/keepalived.conf文件中设置的心跳时间advert_int 1检查,无法获取NGINX_MASTER正常状态的话,NGINX_BACKUP会瞬间绑定VIP来接替nginx_master的工作,当NGINX_MASTER恢复后keepalived会通过priority参数判断优先权将虚拟VIP地址192.168.200.199重新绑定给NGINX_MASTER的ens33网卡。

3、使用此方案的优越性

1.实现了可弹性化的架构,在压力增大的时候可以临时添加web服务器添加到这个架构里面去;
2.upstream具有负载均衡能力,可以自动判断后端的机器,并且自动踢出不能正常提供服务的机器;
3.相对于lvs而言,正则分发和重定向更为灵活。而Keepalvied可保证单个nginx负载均衡器的有效性,避免单点故障;
4.用nginx做负载均衡,无需对后端的机器做任何改动。
5.nginx部署在docker容器里,即大量地节约开发、测试、部署的时间,又可以在出现故障时通过镜像快速恢复业务。

4、安装keepalived,其他安装方法请自行百度

yum install keepalived -y

5、keepalived.conf文件配置,文件路径:/etc/keepalived/keepalived.conf


global_defs {
   notification_email {
   acassen@firewall.loc
   failover@firewall.loc
   sysadmin@firewall.loc
 }

   notification_email_from Alexandre.Cassen@firewall.loc        #定义利用什么邮箱发送邮件
   smtp_server smtp.163.com     #定义邮件服务器信息
   smtp_connect_timeout 30      #定义邮件发送超时时间
   router_id 192.168.200.131    #(重点参数)局域网keppalived主机身份标识信息(每台唯一)
   script_user root             #添加运行健康检查脚本的用户
   enable_script_security       #添加运行健康检查脚本的组
}

vrrp_script chk_http_port {
 script "/usr/local/src/nginx_check.sh"         #表示将一个脚本信息赋值给变量check_web
 interval 2      #检测脚本执行的间隔
 weight -20      #监测失败,则相应的vrrp_instance的优先级会减少20个点
}

vrrp_instance VI_1 {
 state MASTER           #keepalived角色描述信息,备份服务器上将 MASTER 改为 BACKUP
 interface ens33        #将虚拟ip用于那块网卡
 virtual_router_id 51   #主、备机的 virtual_router_id 必须相同
 priority 100            #主、备机取不同的优先级,主机值较大,备份机值较小
 advert_int 1           #主服务器组播包发送间隔时间

authentication {        # 主备主机之间的认证表示信息
   auth_type PASS       #采用明文认证机制
   auth_pass 1111       #编写明文密码
 }
 virtual_ipaddress {
   192.168.200.199      #设置虚拟ip地址信息,此参数备节点设置和主节点相同
 }
 track_script {
    chk_http_port       #调用执行脚本
  }
}

5、添加检查nginx状态的脚本

vim /usr/local/src/nginx_check.sh

脚本内容:

#!/bin/bash

# 传入容器名称
containerName=nginx_master
currTime=`date +"%Y-%m-%d %H:%M:%S"`

# 查看进程是否存在
exist=`docker inspect --format '{{.State.Running}}' ${containerName}`

if [ "${exist}" != "true" ]; then
		pkill keepalived	#杀死所有keepalived服务进程

		# 记录
		echo "${currTime} docker容器宕机,容器名称:${containerName}" >> /mnt/xvde1/ms_ctynyd/scripts/wbwf_monitor.log
	
fi

注意:一定要给这个脚本文件可执行权限(看到变成可执行的颜色),执行命令:chmod u+x /usr/local/src/nginx_check.sh
在这里插入图片描述

脚本说明:当nginx进程不存在时,会自动重启docker服务,docker服务启动时会自动启动nginx容器;再次检查nginx进程,如果不存在,就停止keepalived服务,然后NGINX_BACKUP主机会自动接替NGINX_MASTER的工作。

二、创建备份Nginx服务器(创建服务器2)

注意:这里需创建另一台服务器,CentOS版本依旧是7.7

服务器2:CentOS7.7 IP:192.168.200.129(推荐使用该版本)
需安装docker,安装docker环境教程请移步 https://blog.csdn.net/weixin_44790046/article/details/105612438

操作步骤基本与上面创建主nginx一致

1、拉取nginx镜像

 docker pull nginx:1.19.0

2、创建映射目录

# 在根目录下创建nginx目录用于存储nginx数据信息
cd /
mkdir -p nginx/nginx_slave
cd nginx/nginx_slave
mkdir conf
cd conf
# 在nginx/nginx_slave/conf/下创建nginx.conf文件,粘贴下面内容
vim nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        listen  [::]:80;
        server_name  192.168.200.129;
    
        #charset koi8-r;
        #access_log  /var/log/nginx/host.access.log  main;
    
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }
    
        #error_page  404              /404.html;
    
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}
    
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}
    
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }
}

3、创建nginx容器

docker run -id --name=nginx_slave\ 
-p 80:80 \
-v /nginx/nginx_slave/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /nginx/nginx_slave/logs:/var/log/nginx \
-v /nginx/nginx_slave/html:/usr/share/nginx/html \
nginx:1.19.0

4、设置nginx_master容器自动启动

docker update --restart=always nginx_slave

5、在/nginx/nginx_slave/html目录下新建一个index.html页面内容随意
在这里插入图片描述
6、启动容器访问测试

docker start nginx_slave

在这里插入图片描述
7、配置反向代理和负载均衡(使用默认轮询方式)

修改/nginx/nginx_slave/conf/nginx.conf配置文件如下

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    upstream nacos-cluster {
	  server 192.168.200.131:8848;
	  server 192.168.200.131:8849;
	  server 192.168.200.131:8850;
    }

    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        listen  [::]:80;
        server_name  192.168.200.129;
    
        #charset koi8-r;
        #access_log  /var/log/nginx/host.access.log  main;
    
        location / {
	    	proxy_pass   http://nacos-cluster;
        }
    
        #error_page  404              /404.html;
    
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}
    
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}
    
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }
}

8、测试:直接访问你的nginx服务器地址http://192.168.200.129/nacos
在这里插入图片描述

上述已经完成了搭建,当然为避免nginx服务器单点故障,我们需要再配置一台备用nginx服务器,那么就需要用到keepalived

二、安装配置keepalived

1、安装keepalived,其他安装方法请自行百度

yum install keepalived -y

2、keepalived.conf文件配置(与上方稍有不同),文件路径:/etc/keepalived/keepalived.conf

global_defs {
   notification_email {
   acassen@firewall.loc
   failover@firewall.loc
   sysadmin@firewall.loc
 }

   notification_email_from Alexandre.Cassen@firewall.loc        #定义利用什么邮箱发送邮件
   smtp_server smtp.163.com     #定义邮件服务器信息
   smtp_connect_timeout 30      #定义邮件发送超时时间
   router_id 192.168.200.129    #(重点参数)局域网keppalived主机身份标识信息(每台唯一)
   script_user root             #添加运行健康检查脚本的用户
   enable_script_security       #添加运行健康检查脚本的组
}

vrrp_script chk_http_port {
 script "/usr/local/src/nginx_check.sh"         #表示将一个脚本信息赋值给变量check_web
 interval 2      #检测脚本执行的间隔
 weight -20      #监测失败,则相应的vrrp_instance的优先级会减少20个点
}

vrrp_instance VI_1 {
 state BACKUP           #keepalived角色描述信息,备份服务器上将 MASTER 改为 BACKUP
 interface ens33        #将虚拟ip用于那块网卡
 virtual_router_id 51   #主、备机的 virtual_router_id 必须相同
 priority 90            #主、备机取不同的优先级,主机值较大,备份机值较小
 advert_int 1           #主服务器组播包发送间隔时间

authentication {        # 主备主机之间的认证表示信息
   auth_type PASS       #采用明文认证机制
   auth_pass 1111       #编写明文密码
 }
 virtual_ipaddress {
   192.168.200.199      #设置虚拟ip地址信息,此参数备节点设置和主节点相同
 }
 track_script {
    chk_http_port       #调用执行脚本
  }
}

5、添加检查nginx状态的脚本

vim /usr/local/src/nginx_check.sh

脚本内容:

#!/bin/bash

# 传入容器名称
containerName=nginx_slave
currTime=`date +"%Y-%m-%d %H:%M:%S"`

# 查看进程是否存在
exist=`docker inspect --format '{{.State.Running}}' ${containerName}`

if [ "${exist}" != "true" ]; then
		pkill keepalived	#杀死所有keepalived服务进程

		# 记录
		echo "${currTime} docker容器宕机,容器名称:${containerName}" >> /mnt/xvde1/ms_ctynyd/scripts/wbwf_monitor.log
	
fi

注意:一定要给这个脚本文件可执行权限(看到变成可执行的颜色),执行命令:chmod u+x /usr/local/src/nginx_check.sh
在这里插入图片描述

脚本说明:当nginx进程不存在时,会自动重启docker服务,docker服务启动时会自动启动nginx容器;再次检查nginx进程,如果不存在,就停止keepalived服务,然后NGINX_BACKUP主机会自动接替NGINX_MASTER的工作。

所有工作已经完成,测试一下

nacos集群宿主机执行以下命令

1、停止所有nacos相关服务

docker-compose -f /nacos-docker/example/cluster-hostname.yaml stop

2、开启所有nacos相关服务

docker-compose -f /nacos-docker/example/cluster-hostname.yaml start

3、重启mysql从容器

docker restart mysql_slave01

4、重启主nginx服务器

docker restart nginx_master 

5、重启keepalived服务

systemctl restart keepalived.service 

看到所有容器已经启动

在这里插入图片描述

只部署了备nginx服务器的宿主机执行以下命令

1、重启主nginx服务器

docker restart nginx_master 

2、重启keepalived服务

systemctl restart keepalived.service 

使用keepalived我们设置的虚拟IP访问http://192.168.200.199/nacos

在这里插入图片描述
添加一条配置信息测试主从数据库情况
在这里插入图片描述
查看主从数据库表发现没有问题
在这里插入图片描述
测试最重要的一步,如果192.168.200.131宿主机的nginx宕机还能访问吗?

只需要执行docker stop nginx_master,我们指定的脚本就会检测到nginx已经宕机,他就会直接关闭keepalived服务,那么我们的备份nginx服务器就会启动接替主nginx的工作。

当然了我们那个脚本是为了测试才那么写的,正常是应该先尝试重新启动nginx容器,如果重启不成功再关闭keepalived服务

测试发现,访问http://192.168.200.199/nacos依旧可以进入页面

在这里插入图片描述

注意:又是一个坑, 如果你执行了docker stop nginx_master命令却没有自动关闭keepalived服务,那么你需要先查看脚本手动能不能运行。
在这里插入图片描述
坑2:关闭selinux
其实真正的罪魁祸首是selinux(具体是啥意思,有兴趣的同学可以百度)。
我们只要把它关闭脚本就会自动运行了:

#执行关闭命令
setenforce 0

这个操作只是暂时性的关闭selinux,我们重启机器之后,selinux又会重新开启。

SELinux 有三种工作模式,分别是:

  1. enforcing:强制模式。违反 SELinux 规则的行为将被阻止并记录到日志中。

  2. permissive:宽容模式。违反 SELinux 规则的行为只会记录到日志中。一般为调试用。

  3. disabled:关闭 SELinux。

我们可以永久关闭selinux

sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config

然后记得重启机器

再次测试应该就没有问题了,如果有请下方评论

猜你喜欢

转载自blog.csdn.net/weixin_44790046/article/details/106857369