nginx集群综合项目
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx集群综合项目相关的知识,希望对你有一定的参考价值。
需求分析
(1)拆分集群,分别配置,使其成为一个高性能的环境
(2)响应服务器nginx搭建
(3)nginx反向代理后端服务器
(4)通过KeepAlived实现心跳检测、负载均衡、响应服务器的冗余(高可用)
(5)Tomcat对接mysql实现动态网页
(6)数据库主从复制、部署代理服务器atlas实现数据库的读写分离
(7)存储数据的磁盘使用lvm实现动态磁盘
(8)Tomcat部署多个应用并实现对应的域名解析
(9)运维人员可以通过OpenVPN接入Zabbix、Jumpserver进行监控管理
(10)操作系统安全加固
2、需求实现及详情配置
IP分配:
IP | 角色 |
192.168.10.100 | VIP |
192.168.10.10 | Nginx-1 |
192.168.10.20 | Nginx-2 |
192.168.10.11 | Tomcat-1 |
192.168.10.12 | Tomcat-2 |
192.168.10.30 | Mysql-1 |
192.168.10.31 | Mysql-2 |
192.168.10.40 | atlas |
192.168.10.50 | zabbbix |
192.168.10.60 | jump-server |
1、nginx
(1)官网下载nginx压缩包:nginx.org
(2)ssh连接到crt、然后通过lrzsz中的rz上传压缩包,之后tar解压并且指定解压目录为/usr/src
tar zxf nginx-1.16.1.tar.gz -C /usr/src
(3)创建用户实现管控分离(单独进程-单独用户)方便运维
useradd -M -s /sbin/nologin nginx
-M 不配置宿主目录 -s 配置shell环境
(4)配置(configure)
针对当前系统、软件环境配置安装参数
cd /usr/src/nginx-1.16.1
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
--with-http_stub_status_module --with-http_ssl_module
--prefix 定义安装路径
--user --group 定义运行进程的用户及组
--with-http_stud_status 初步监控nginx的状态,如并发连接,请求数量
--with-http_ssl_module 实现https
(5)编译并安装(make && make install)
make 将源码转换为二进制可执行程序
make install 将编译好的程序文件复制到系统
(6)软链接实现命令便捷化(将nginx目录下的命令链接到linux的环境变量)
ln -s /usr/local/nginx/sbin /usr/local/sbin/
(7)防火墙配置
如果防火墙是开着的,需要放行80端口
firewall-cmd --permanent --add-port=80/tcp //放行端口
systemctl restart firewalld //重启使配置生效
firewall-cmd --list-all //查看配置
这里默认关掉防火墙
setenforce()
vim /etc/selinux/config 修改SELINEX为disabled
getenforce
nginx //启动服务
ss -lnt //查看端口是否启用
浏览器访问192.168.10.10
(8)上传html文件到nginx的网站根目录下
cd /usr/local/nginx/html
rz
访问网站
(9)为方便运维,将nginx加入系统服务脚本
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/bin/kill -s HUP $PIDFile
ExecStop=/usr/bin/kill -s QUIT $
PrivateTmp=true
[Install]
WantedBy=multi-user.target
//:wq保存退出
systemctl restart nginx //测试配置是否成功
注:无法启动的话可能是端口占用的问题,可以通过ps aux | grep nginx 找到pid号,使用kill pid号的命令用于卡死时杀死进程来中断进程
(10)进入配置文件修改进程数、添加状态模块监控nginx并发数、连接数
查看CPU数:
cat /proc/cpuinfo | grep "processor"| wc -l
worker_connections:最大并发数,2的倍数
添加监控模块配置
Location /status
stub_status on; //打开模块
access_log off; //状态监控不需要日志记录
systemctl restart nginx
访问:192.168.10.10/status //打开监控,多开浏览器模拟多并发
2、nginx反向代理后端服务器
(1)克隆虚拟机作为后端服务器并配置网络环境以及初始化
进入网卡配置,配置服务器ip与网关使其能访问外网
vim /etc/sysconfig/network-scripts/ifcfg-ens33
配置关闭防火墙,流程与配置nginx服务器相同
(2)上传java包,tar解压到/usr/src目录下
cd /usr/src
rz
tar zxf java-demo.tar.gz
(3)编译java源代码包
清理仓库,使用在线仓库,下载maven:
yum clean all
yum repolist
配置源:
wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
yum install maven
使用命令跳过测试进行编译,因为测试比较耗时,编译过程会下载依赖
mvn package -Dmaven.test.skip=true
编译之后会生成一个target目录,目录下有.war的包(没有做前后端分离)
(4)配置java项目容器TomCat
首先通过java -version查询是否安装java所需jdk
查询结果:
openjdk version "1.8.0_161"
OpenJDK Runtime Environment (build 1.8.0_161-b14)
OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode)
yum install -y java验证是否安装
下载TomCat包,下载时需要忽略检查,下载后解包
wget https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.76/bin/apache-tomcat-8.5.76.tar.gz --no-check-certificate
删除/usr/src/apache-tomcat-8.5.76/webapps/ROOT目录下的内容
rm -rf /usr/src/apache-tomcat-8.5.76/webapps/ROOT/*
将target目录下的ly-simple-tomcat-0.0.1-SNAPSHOT.war包克隆到/webapps/ROOT下,也就是网站的根目录下
cp ly-simple-tomcat-0.0.1-SNAPSHOT.war /usr/src/apache-tomcat-8.5.76/webapps/ROOT
在/usr/src/apache-tomcat-8.5.76/bin路径下执行启动,关闭等命令,也可以软链接
startup.sh//启动
shutdown.sh //停止
daemon.sh//重载
启动后查看日志:
startup.sh
cd /usr/src/apache-tomcat-8.5.76/logs
tail catalina.2022-03-16.log
注:访问http://192.168.10.11:8080显示404是因为版本兼容问题,可以手动解开war包,重启服务
(5)关联nginx和TomCat实现反向代理,并且增加TomCat机实现负载均衡
主配置文件http下配置反向代理
upstream mytomcat
server 192.168.10.11:8080;
location /
proxy_pass http://mytomcat;
之后访问nginx的ip则会被代理到tomcat服务器上
克隆tomcat机更改ip配置并与nginx关联实现负载
也可以通过在地址后面添加权重来调度流量走向以及分布,也可以实现灰度测试(产品或应用正式发布前,选择特定人群试用,逐步扩大其试用者数量,以便及时发现和纠正其中的问题,由“灰”到“黑”,也是版本较大的更迭时先进行小范围的尝试,再慢慢放量直至全部覆盖)
来进行版本的更新。
因为代理是轮询机制,所以通过追踪两台代理服务器的访问日志文件可以看到nginx响应机发来的代理请求
3、KeepAlived实现高可用
(1)实现原理
由于早起的LVS软件无法对LVS节点进行健康检测、针对这项缺陷,KeepAlived软件就诞生了。
KeepAlived可以通过在自身KeepAlived.conf配置文件中配置LVS的节点IP和相关参数实现对LVS的直接管理,当节点故障时,KeepAlived会自动将失效的节点服务器从工作队列移除并且将请求转交到正常的节点上,当高优先级的节点修复后,再将请求转交到其上。
KeepAlived采用的其实就是虚拟冗余协议VRRP,两台主机安装配置KeepAlive后,会生成一个虚拟的vip地址供用户访问,因为该地址会因机器的故障状态进行漂移,所以称其为漂移地址,请求会交到MASTER机上,BACKUP机不做工作,但是会一直监听MASTER机发送的心跳报文,从而确认其是否存活,当其停止发送时,BACKUO会接管请求进入工作模式知道MASTER机修复后抢占请求(通过优先级的比对),这种机制响应时间较短,所以用户几乎无法感受到异常。
(2)KeepAlived安装与配置
首先通过本地yum源安装KeepAlived:
yum install -y keepalived
配置为开机自启
Systemctl enable keepalived
通过rpm -qa查询是否安装成功
rpm -qa keepalived
查询结果:
keepalived-1.3.5-6.el7.x86_64
进入主配置文件进行配置:
global_defs //全局配置
router_id HA_TEST_R1//服务器主机名
#vrrp_script check_nginx
# script "/etc/keepalived/check_nginx.sh"
# interval 2
# weight 2
#
vrrp_instance VI_1 //定义实例
state MASTER//主服务器
interface ens33//当前集群和其他主机通信的网卡
virtual_router_id 45//虚拟路由器ip号,主备一致
priority 120//优先级,决定抢占
advert_int 1//检测时延
authentication //主备通信验证
auth_type PASS
auth_pass 123456
virtual_ipaddress //虚拟ip
192.168.10.100
# track_script
# check_nginx
#
查看ip可以看到虚拟ip
通过访问虚拟ip发现可以访问到后端服务器
克隆主服务器一台作为备服务器并修改ip地址
备份主配置文件之后进行修改,主要修改角色状态与优先级
global_defs
router_id HA_TEST_R1
#vrrp_script check_nginx
# script "/etc/keepalived/check_nginx.sh"
# interval 2
# weight 2
#
vrrp_instance VI_1
state BACKUP
interface ens33
virtual_router_id 45
priority 100
advert_int 1
authentication
auth_type PASS
auth_pass 123456
virtual_ipaddress
192.168.10.100
# track_script
# check_nginx
#
(3)模拟故障以及效果检查
停掉主服务器的服务,查看备服务器的ip
可以看到漂移地址已经飘到了备服务器上
(4)脚本追踪
虽然说服务器故障会自动切换到备服务器,但真实情况很多时候设备是不容易坏掉的,更容易故障的是nginx这个服务,所以要编写shell脚本来对nginx进行监控。
脚本内容
#!/bin/bash
A=`ps -C nginx --no-header | wc -l`//查询nginx进程数
if [ $A -eq 0 ];then//如果等于零
让我开一哈你的nginx \\e[0m"
systemctl restart nginx//启动nginx
sleep 3//间隔三秒后
if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
systemctl stop keepalived//关闭keepalived
哦豁,服务器已故障\\e[0m"
fi
fi
赋予脚本可执行权限:
chmod 754 check_nginx.sh
之后在keepalived主配置文件进行脚本追踪,间隔两秒一次
vrrp_script check_nginx
script "/etc/keepalived/check_nginx.sh"
interval 2 //间隔两秒执行一次
track_script
check_nginx
//vrrp_script 用户自定义资源监控脚本
//track_script 调用脚本
注:如果脚本没有被执行,可以查看脚本文件配置权限有没有可执行权,如果都没问题的话有可能是防火墙没有关。
最后重启keepalived服务,手动关闭nginx之后查询nginx的进程数验证脚本,可以看出停掉服务后,脚本又帮我们启动了nginx服务,所以查询到的进程不变
如果在两秒内再次查询或者调低脚本检测频率则可以发现停掉nginx后其进程变为
现在开始只要nginx故障,脚本运行后首先会重启一次nginx,如果成功则主服务器仍旧可用,如果失败则关闭主服务器,备服务器进行工作。
4、tomcat对接数据库实现动态网页(实现前后端交互)
(1)数据库搭建
yum下载mariadb客户端以及服务器并启动
yum install -y mariadb mariadb-server
syetemctl start mariadb
登录mysql,默认没有密码,修改mysql密码
mysqladmin -u root password ‘123456’
mysql -u root -p
(2)练习数据库基础增删查改命令
show databases; //查看数据库
create database school; //创建数据库
use school //进入数据库
create table student(stu_id INT,stu_name VARCHAR(100) NOT NULL); //创建数据表并指定列类型stu_id为整型,stu_name为长字符串型
insert into student values(1,’zhangsan’); //插入数据
show create table student; //查询创建的数据表
select * from student; //查询数据
delete from student where stu_id=1; //删除数据
drop table student; //删除数据表
drop database school; //删除数据库
mysqldump -u root -p school student > /tmp/school_student.sql //备份数据库
备份好之后删除数据库school,之后source school_student.sql;
报错发现无法还原数据:发现是没有创建数据库school,因为只备份了数据表,需要数据库school才能进行还原,所以我们要先创建一个名为school的数据库
(3)前后端对接
首先将之前前端java目录下db目录下的sql文件通过远程复制复制到mysql服务器上的/root目录下
scp /usr/src/java-demo/db/tables_ly_tomcat.sql root@192.168.10.30:/root
因为这个文件所属库为test所以直接进入到test库通过source添加数据表
修改java源码包中的配置文件,修改调用的数据库ip、库名、用户密码等
vim /usr/src/java-demo/src/main/resources
重新打包:
mvn package -Dmaven.test.skip=true
删除/usr/src/apache-tomcat-8.5.76/webapps/ROOT下的所有内容然后将刚刚打包的war包cp到当前目录下,同样删除tomcat2下的所有内容并且将war包远程复制到汤姆猫2号的ROOT下
cd /usr/src/apache-tomcat-8.5.76/webapps/ROOT
rm -rf ./*
注:访问网页添加学生失败,查看日志返回500和304的状态码
有可能是没有权限,返回到数据库服务器进入mysql查询
grant all on *.* to root@% identified by 123456;
为root所有库所有表在任何主机上赋予所有权限
再次添加并且查询可以看到添加成功:
5、数据库主从复制与读写分离
(1)主从复制
1)主从复制的原理
企业网络中如果后端数据库服务器只有一台的话,可能会因为单点故障导致网页瘫痪,并且一台服务器无法处理大量的并发数据请求,如果数据丢失更是会导致无法预料的后果,故此应用主从复制使得数据同步,后面再通过读写分离提升并发负载能力。
工作原理:
当从服务器连接到主服务器时,主服务器会开启一个线程将自己的binlog其中包括relay log文件发送到从服务器,从服务器启动后,从服务器上会开启I/O、SQL两个线程,I/O线程用于拉取主服务器二进制日志内容,写入到Relay log中,然后通过SQL线程进行读取写入本地。
2)时间同步
主节点搭建时间同步服务器,通过安装ntp更改其配置文件来实现时间同步
主:
yum install -y ntp
vim /etc/ntp.conf
删除server 0-3
添加server 127.127.1.0
fudge 127.127.1.0 startum 8
从:
yum install -y ntpdate
ntpdate 192.168.10.30
3)主服务器配置
因为数据库有之前的内容所以要先进行一下数据库备份,并将其传输到从服务器用来同步
mysqldump -u root -p test > /tmp/mybak.sql
scp /tmp/mybak.sql root@192.168.10.31:/root
进入主服务器配置文件添加配置,之后重启服务使其生效
vim /etc/my.cnf
server_id=66 //做了主从复制所以需要通过id识别
log_bin=master_bin //开启二进制日志
log_slave_updates=true //允许从主服务器中读取日志
授权允许从服务器进行日志拷贝之后刷新
mysql -u root -p
grant replication slave on *.* to ‘myslave’@’192.168.10.%’identified by ‘123456’; //授权myslave用户密码123456可以拷贝
flush privileges;//刷新
查看当前服务器状态:
show master status;
4)从服务器配置
进入主配置文件添加内容并重启服务使其生效
vim /etc/my.cnf
server_id=55 //辨识id
relay_log=relay_log_bin //定义relay_log中继日志
relay_log_index=slave_relay_bin.index //日志索引,提高查询效率
启动同步
change master to
master_host=192.168.10.30,master_user=myslave,master_password=123456
,master_log_file=master_bin.000001,master_log_pos=476;
start slave;
//使用myslave用户,密码为123456(被主服务器授权)同步主服务器日志(前面查询所得)
注:由于本人的不正当操作导致了如下报错,搜索后得知是该服务器之前做过主从复制,中途修改过my.cnf配置文件,重启mariadb服务后,binlog和relay_log文件名已经改变所以无法从之前的relay_log复制了
解决方法:reset slave; //重置
启动后查询线程是否开启:
可以看到双线程已启动,接下来可以进行验证啦
结果验证:
在主服务器添加新库test1,在从服务器查看:
主:
从:
(2)读写分离
1)读写分离的安装与配置
克隆服务器作为atlas代理服务器,初始化配置并通过ssh远程连接
上传rpm包并且安装,默认安装在/usr/local下
rz Atlas-2.2.1.el6.x86_64.rpm
rpm -ivh Atlas-2.2.1.el6.x86_64.rpm
进入到/usr/local/mysql-proxy/下可以看到bin、log、conf、lib,分别是可执行命令、日志文件、配置文件以及一些依赖的文件。
首先要在主从库上对altas进行授权
grant all on *.* to test@’192.168.10.%’identified by ‘123.com’
接着进入到atlas的配置文件进行配置,修改主从库的ip以及端口、 用户名以及加密之后的密码、如果要通过前端来对接代理则需要修改altas监听的工作接口ip和端口。
启动altas服务:
/usr/local/mysql-proxy/bin/mysql-proxyd/test start
2)验证是否分离
在代理主机上安装mariadb客户端用来进行验证。
yum install -y mariadb
使用管理用户和密码登录数据库
mysql -P2345 -uuser -ppwd -h127.0.0.1
输入show databases;提示输入select * from help来查询命令,通过select * from backends来查询后端服务器
登录工作用户来进行读写分离验证,通过show databases;查看库
在从库添加新库,查看主库,可以看出数据无法回流到主库
从:
主:
在主库添加数据,查看从库,可以看到数据;
主:
从:
3)修改配置重新打包
因为代理服务器atlas的加入,所以需要修改前端配置文件中的资源定位信息url以及数据库登入的用户和密码,然后重新打包解包
配置之后如果还是与网页交互,则有可能是tomcat与mysql对接不成功,重新将java中db下的.sql包远程复制过去进行导入即可
6、Tomcat服务器部署LAMP服务分别做DNS解析
(1)LAMP环境搭建
根据文档,注意修改其中部分配置文件,比如添加mysql到系统服务时,PIDfile需要设置为当前虚拟机的主机名,分别部署apache、mysql、php,环境搭建之
以上是关于nginx集群综合项目的主要内容,如果未能解决你的问题,请参考以下文章