docker搭建nginx主备模式反向代理Nacos集群加mysql主从复制
本教程环境服务器:CentOS7.7(推荐使用该版本)需安装docker,安装docker环境教程请移步https://blog.csdn.net/weixin_44790046/article/details/1056124381、先确定自己是否有docker-compose环境docker-compose version如果出现了docker-compose的版本号则直接看第3步,否则进入第2
本教程环境
服务器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集群
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_master
的nacos_devtest
数据库copy到mysql_slave01
中,这样的话两个mysql的数据就保持一致了。主数据库执行 reset slave;
命令清除一下记录
方式二:
我们将mysql_master
的nacos_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 有三种工作模式,分别是:
enforcing:强制模式。违反 SELinux 规则的行为将被阻止并记录到日志中。
permissive:宽容模式。违反 SELinux 规则的行为只会记录到日志中。一般为调试用。
disabled:关闭 SELinux。
我们可以永久关闭selinux
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
然后记得重启机器。
再次测试应该就没有问题了,如果有请下方评论
更多推荐
所有评论(0)