2125 lines
57 KiB
Markdown
2125 lines
57 KiB
Markdown
# 防火墙
|
||
|
||
## 企业级防火墙技术IPtables
|
||
|
||
### 简介
|
||
|
||
iptables其实**并不是真正的防火墙**,我们可以把他理解为一个**客户端的代理**,用户是通过iptables这个代理,将用户的安全设定执行到对应的“安全框架”中,这个“安全框架”才是真正的防火墙。这个框架叫做netfilter
|
||
|
||
netfilter 内核态 位于内核空间
|
||
|
||
iptables 用户态 位于用户空间
|
||
|
||
注意:
|
||
|
||
企业环境内部服务器需关闭Linux自身防火墙;(解决安全问题尽量不给服务器配置外网IP.需要访问的话,就使用代理转发)**因为高并发,iptables会加大延迟**。除非并发小,服务器必须处于公网,考虑开启防火墙;大并发的情况,不能开iptables,影响性能因为iptables是要消耗CPU的,利用硬件防火墙提升架构安全
|
||
|
||
### 分类
|
||
|
||
#### 逻辑分类
|
||
|
||
主机防火墙:针对单个主机进行防护
|
||
|
||
网络防火墙:它往往处于网络入口或者边缘,针对于网络入口进行防护,服务于防火墙背后的局域网
|
||
|
||
#### 物理分类
|
||
|
||
硬件防火墙:在硬件级别实现部分防火墙功能,另一部分基于软件实现,性能高,成本高
|
||
|
||
软件防火墙:应用软件处理逻辑运行于通用硬件平台之上,性能低,成本低
|
||
|
||
### 相关术语
|
||
|
||
表:表(tables)是链的容器,即所有的链(chains)都属于其对应的表(tables)
|
||
|
||
链:链(chains)是规则(Policys)的容器。
|
||
|
||
规则:iptables系列过滤信息的规范和具体方法条款
|
||
|
||
### IPtables表和链
|
||
|
||
默认情况下,iptables根据功能和表的定义划分包含四个表,filter,nat,mangle,raw其每个表又包含不同的操作链(chains )
|
||
|
||
#### 1.表
|
||
|
||
raw 追踪数据包
|
||
|
||
mangle 对数据包打标记
|
||
|
||
nat 地址转换
|
||
|
||
filter 数据包过滤
|
||
|
||
#### 2.链
|
||
|
||
PREROUTING 在路由之前
|
||
|
||
INPUT 数据包进入时
|
||
|
||
FORWARD 数据包经过时
|
||
|
||
OUTPUT 数据包出去时
|
||
|
||
POSTROUTING 在路由之后
|
||
|
||
#### 3.表
|
||
|
||
### IPtables操作
|
||
|
||
1.安装
|
||
|
||
```shell
|
||
centos(5/6)
|
||
启动防火墙:#/etc/init.d/iptables start
|
||
centos7
|
||
[root@xingdian ~]# yum install -y iptables iptables-services
|
||
[root@xingdian ~]# systemctl stop firewalld
|
||
[root@xingdian ~]# systemctl disable firewalld
|
||
[root@xingdian ~]# systemctl start iptables
|
||
查看版本:
|
||
[root@xingdian ~]# iptables -V
|
||
iptables v1.4.21
|
||
配置文件:
|
||
/etc/sysconfig/iptables-config
|
||
/etc/sysconfig/iptables #记录规则文件
|
||
```
|
||
|
||
2.参数解释
|
||
|
||
3.常见操作
|
||
|
||
指定表名查看规则
|
||
|
||
iptables -t 表名 -L
|
||
|
||
默认查看规则
|
||
|
||
iptables -L
|
||
|
||
# Tomcat
|
||
|
||
## 简介
|
||
|
||
LNMTJ集群:Linux nginx mysql jdk tomcat
|
||
|
||
tomcat是web容器 web中间件
|
||
|
||
php语言开发的项目 php_fpm php作为中间件
|
||
|
||
python语言开发的项目 UWSGI作为中间件
|
||
|
||
java语言开发的项目 tomcat、weblogic、jboss作为中间件
|
||
|
||
java项目构建成war包 对应使用tomcat环境
|
||
|
||
java项目构建成jar包 对应使用jdk环境
|
||
|
||
|
||
|
||
web集群架构:LNMJT LNMJ LAMJT LAMJ
|
||
|
||
|
||
|
||
前后端联合
|
||
|
||
前端环境构建:h5 =>apache/nginx
|
||
|
||
后端环境构建:java =>jdk+tomcat jdk
|
||
|
||
|
||
|
||
构建:java项目 构建软件 maven(jdk+maven+tomact)(运维Linux构建 jdk+maven)mvn
|
||
|
||
开发:开发环境分支 生产环境分支
|
||
|
||
前端:不能直接使用 构建vue3 node.js(开发:windows构建 idea + node.js插件 运维:Linux构建 node.js)npm
|
||
|
||
|
||
|
||
tomcat war包 对应tomcat网站发布目录下(.war)
|
||
jar包 jdk java命令运行jar java -jar xxx.jar
|
||
|
||
### 端口
|
||
|
||
Tomcat自身服务的端口:8005
|
||
|
||
Tomcat和其他应用通信的端口:8009
|
||
|
||
Tomcat给客户端浏览器访问页面使用的端口:8080
|
||
|
||
## Tomcat安装
|
||
|
||
1.下载tomcat和jdk安装包到虚拟机上,解压即安装,自定义安装目录
|
||
|
||
```shell
|
||
下载:
|
||
wget http://10.9.12.206:30120/directlink/1/safeware/apache-tomcat-9.0.82.tar.gz
|
||
wget http://10.9.12.206:30120/directlink/1/safeware/jdk-8u211-linux-x64.tar.gz
|
||
解压到自定义安装目录:我这里自定义/opt
|
||
tar xf apache-tomcat-9.0.82.tar.gz -C /opt/
|
||
tar xf jdk-8u211-linux-x64.tar.gz -C /opt/
|
||
|
||
|
||
```
|
||
|
||
2.系统里没有命令直接启动tomcat,得到相关目录下才能启动,配置环境变量让他能启动
|
||
|
||
```shell
|
||
启动tomcat的方法:
|
||
1.直接执行
|
||
/安装目录/tomcat/bin/startup.sh
|
||
2.直接执行
|
||
/安装目录/tomcat/bin/catalina.sh start
|
||
关闭tomcat的方法:
|
||
1.直接执行
|
||
/安装目录/tomcat/bin/shutdown.sh
|
||
2.直接执行
|
||
/安装目录/tomcat/bin/catalina.sh stop
|
||
```
|
||
|
||
### 设置java环境变量
|
||
|
||
修改vim /etc/profile
|
||
|
||
```shell
|
||
JAVA_HOME=/opt/java
|
||
PATH=$JAVA_HOME/bin:$PATH
|
||
export JAVA_HOME PATH
|
||
```
|
||
|
||
生效source /etc/profile
|
||
检测 java -version
|
||
|
||
### 设置tomcat直接启动
|
||
|
||
启动之前编辑配置文件,打开8009端口
|
||
|
||
去掉注释vim /opt/tomcat/conf/server.xml
|
||
|
||
(1)编写脚本
|
||
vim /usr/bin/tomcat
|
||
|
||
```shell
|
||
#!/bin/bash
|
||
|
||
TOMCAT_HOME=/opt/tomcat/bin
|
||
|
||
case $1 in
|
||
start)
|
||
$TOMCAT_HOME/startup.sh
|
||
;;
|
||
stop)
|
||
$TOMCAT_HOME/shutdown.sh
|
||
;;
|
||
restart)
|
||
$TOMCAT_HOME/shutdown.sh
|
||
sleep 3
|
||
$TOMCAT_HOME/startup.sh
|
||
;;
|
||
esac
|
||
```
|
||
|
||
(2)增加权限
|
||
|
||
chmod a+x /usr/bin/tomcat
|
||
|
||
(3)启动
|
||
|
||
tomcat start/stop/restart
|
||
|
||
启动之后看一下三个端口是不是都在
|
||
|
||
浏览器中IP:端口测试一下
|
||
|
||
## 案例
|
||
|
||
tomcat+mysql
|
||
|
||
### Tomcat服务器
|
||
|
||
源码包:jspgou.zip
|
||
|
||
准备:把tomcat网站发布目录下的数据清空
|
||
|
||
```shell
|
||
rm -rf /opt/tomcat/webapps/*
|
||
```
|
||
|
||
下载源码包解压 将项目ROOT目录放到网站发布目录下
|
||
|
||
```shell
|
||
cp -r ROOT/ /opt/local/tomcat/webapps/
|
||
```
|
||
|
||
将数据库文件传到Mysql数据库服务器上
|
||
|
||
```shell
|
||
scp DB/jspgou.sql 192.168.59.152:jspgou.sql
|
||
scp 源文件位置 目的ip:目的位置
|
||
```
|
||
|
||
编辑安装目录下的jdbc文件进行数据库连接
|
||
|
||
```shell
|
||
vim /opt/tomcat/webapps/ROOT\WEB-INF\config\jdbc.properties
|
||
jdbc.url=jdbc:mysql://数据库服务器ip:3306/创建好的数据库名?characterEncoding=UTF-8
|
||
jdbc.username=授权用户
|
||
jdbc.password=密码
|
||
```
|
||
|
||
### Mysql服务器
|
||
|
||
创建数据库,指定字符集
|
||
|
||
授权一个新用户,用来连接数据库使用
|
||
|
||
将刚刚的sql文件导入创建的数据库
|
||
|
||
```shell
|
||
create databse jspgou default charset=utf8;
|
||
grant all on jspgou.* to 'shangyuxian'@'192.168.59.153' identified by 'QianFeng@123';
|
||
```
|
||
|
||
修改数据库配置文件
|
||
|
||
```shell
|
||
vim /etc/my.cnf
|
||
sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
|
||
explicit_defaults_for_timestamp=1
|
||
|
||
重启systemctl restart mysqld
|
||
```
|
||
|
||
将刚刚的sql文件导入创建的数据库
|
||
|
||
```shell
|
||
mysql -uroot -pQianFeng@123 jspgou < jspgou.sql
|
||
```
|
||
|
||
### 访问测试
|
||
|
||
系统管理后台登录:http://tomcatip:8080/jeeadmin/jspgou/index.do
|
||
用户名:admin
|
||
密 码:123456
|
||
|
||
前台访问:
|
||
|
||
tomcatip:8080
|
||
|
||
## 案例
|
||
|
||
### 医美项目
|
||
|
||
前后端分离+数据库sql文件
|
||
|
||
需要一台tomcat+jdk 一台apache 一台mysql
|
||
|
||
后端源码包是war包
|
||
|
||
#### Apache服务器
|
||
|
||
1.在apache服务器上安装apache服务 yum -y install httpd
|
||
2.启动并做开启启动
|
||
3.将源码放到网站发布目录下
|
||
|
||
192.168.59.152.tar.gz 前端源码解压
|
||
|
||
cp dist/* /var/www/html/
|
||
|
||
访问ip验证
|
||
|
||
#### Mysql服务器:
|
||
|
||
1.安装和初始化 mysql-5.7 数据库处于运行状态
|
||
|
||
2.创建一个库,库名自定义 web
|
||
|
||
3.把原始数据导入到创建的web库里面
|
||
[root@mysql-rpm ~]# wget http://10.9.12.206:30120/directlink/1/safeware/tomcat/unionproject.sql //方法不唯一,只要上传到服务器
|
||
[root@mysql-rpm ~]# mysql -uroot -p123 web(自己创建的数据库) < unionproject.sql
|
||
|
||
4.默认数据库root用户,只能本机访问,需要做一个授权,实现其他服务器也可以使用root用户访问数据库
|
||
|
||
mysql> grant all on *.* to 'root'@'%' identified by '123'; 授权命令,能够实现其他服务器采用root用户链接该服务器mysql
|
||
|
||
mysql> flush privileges; 刷新授权表,让刚才的授权生效
|
||
|
||
数据库的相关信息:
|
||
IP地址:10.9.12.115
|
||
端口:3306
|
||
库:web
|
||
用户:root
|
||
密码:123
|
||
|
||
#### Tomcat服务器
|
||
|
||
1.安装
|
||
|
||
2.tomcat的运行需要jdk的环境,所以安装tomcat的时候,安装了jdk;被保证Tomcat可以随时调用JDK的命令,给jdk配置环境变量
|
||
|
||
3.修改一个配置文件,开启tomcat的其中一个端口
|
||
tomcat自身有3个端口:8080(浏览器访问的时候端口号) 8009(开启8009) 8005
|
||
|
||
4.源码上线
|
||
[root@xingdian ~]# cd /usr/local/tomcat/webapps/ 该目录是网站发布目录
|
||
[root@xingdian webapps]# rm -rf ./*
|
||
[root@xingdian webapps]# wget http://10.9.12.206:30120/directlink/1/safeware/tomcat/BeautyClinic.war
|
||
|
||
5.修改链接数据库相关的源码配置
|
||
yum -y install vim unzip zip
|
||
vim BeautyClinic.war 输入/ 搜索jdbc 会看到一个文件 回车 会看到数据库的相关配置 先保存退出 在直接退出
|
||
|
||
6.启动tomcat
|
||
|
||
7.浏览器访问
|
||
http://A机器的IP地址:8080/BeautyClinic 后台显示hello world
|
||
|
||
### mayday日志项目
|
||
|
||
本项目的前后端写在一起jar包 带有数据库文件
|
||
|
||
需要一台jdk环境 一台数据库
|
||
|
||
#### mysql
|
||
|
||
本台数据库需要5.7.42
|
||
|
||
1.通过lftp传输下载安装
|
||
|
||
```shell
|
||
yum -y install lftp
|
||
lftp 10.9.12.250 cd到qf2303/safe
|
||
mirror mysql-rpm/
|
||
yum -y install mysql-rpm/*.rpm
|
||
systemctl start mysqld
|
||
systemctl enable mysqld
|
||
cat /var/log/mysqld.log | grep password
|
||
mysqladmin -u root -p'_q*M##7oy=li' password 'QianFeng@123'
|
||
```
|
||
|
||
2.创建数据库,传入sql文件
|
||
|
||
```sql
|
||
|
||
create database mayday;
|
||
grant all on mayday.* to 'syx'@'192.168.59.%' identified by 'QianFeng@123';
|
||
flush privileges;
|
||
|
||
mysql -uroot -p'QianFeng@123' mayday < mayday.sql
|
||
```
|
||
|
||
#### jdk
|
||
|
||
安装见上面的笔记
|
||
|
||
1.下载源码包
|
||
|
||
vim 源码包名.jar 编辑里面的数据库连接信息 搜索application
|
||
|
||
2.运行项目 nohup java -jar mayday.jar & 采用后台运行的方式并将java命令运行产生的数据写入到自动生成的nohup.out
|
||
|
||
tailf nohup.out 看后台运行的日志信息jvm run
|
||
|
||
##### 验证
|
||
|
||
ip:8091
|
||
|
||

|
||
|
||
# nginx
|
||
|
||
## 安装
|
||
|
||
准备关闭防火墙和selinux
|
||
|
||
1.yum install yum-utils
|
||
|
||
2.创建文件 vim /etc/yum.repos.d/nginx.repo
|
||
|
||
```shell
|
||
[nginx-stable]
|
||
name=nginx stable repo
|
||
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
|
||
gpgcheck=1
|
||
enabled=1
|
||
gpgkey=https://nginx.org/keys/nginx_signing.key
|
||
module_hotfixes=true
|
||
|
||
[nginx-mainline]
|
||
name=nginx mainline repo
|
||
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
|
||
gpgcheck=1
|
||
enabled=0
|
||
gpgkey=https://nginx.org/keys/nginx_signing.key
|
||
module_hotfixes=true
|
||
|
||
```
|
||
|
||
3.查看安装版本信息
|
||
|
||
nginx -V
|
||
|
||
4.查看nginx版本
|
||
|
||
nginx -v
|
||
|
||
5.启动测试
|
||
|
||
## nginx支持的三种类型的虚拟主机
|
||
|
||
虚拟主机:用一个物理服务器nginx分成多个虚拟主机,提供多个网站服务,每个网站都是一个虚拟主机,独立互不影响,实现一台主机对外提供多个web服务。
|
||
|
||
### 基于域名的虚拟主机
|
||
|
||
1.配置通过域名区分的虚拟机
|
||
|
||
比如这里是两台server
|
||
|
||
配置文件可以自己另写,可以写到一个里面,也可以分开写两个里面
|
||
|
||
/etc/nginx/conf.d/xxx.conf
|
||
|
||
在这里两个server加到一个配置文件里
|
||
|
||
```shell
|
||
server {
|
||
listen 80; //端口号 可以改
|
||
server_name www.xingdiancloud.com; //虚拟主机的名字
|
||
location / {
|
||
location资源定位
|
||
root /web1;//改发布目录
|
||
index index.html index.htm;//主页
|
||
}
|
||
}
|
||
//下面的server同上
|
||
server {
|
||
listen 80;
|
||
server_name www.1000phone.com;
|
||
location / {
|
||
root /web2;
|
||
index index.html index.htm;
|
||
}
|
||
}
|
||
```
|
||
|
||
比如:这里在配置文件里直接添加一个server
|
||
|
||
```shell
|
||
cat /etc/nginx/nginx.conf
|
||
|
||
worker_processes 4;
|
||
#error_log logs/error.log;
|
||
events {
|
||
worker_connections 1024;
|
||
}
|
||
|
||
http {
|
||
include mime.types;
|
||
default_type application/octet-stream;
|
||
server {
|
||
listen 80;
|
||
server_name web.testpm.com;
|
||
location / {
|
||
root /var/www/nginx/;
|
||
index index.html index.htm;
|
||
limit_rate 2k;
|
||
}
|
||
}
|
||
|
||
server {
|
||
listen 80;
|
||
server_name web.1000phone.com;
|
||
location / {
|
||
root /1000phone/html;
|
||
index index.html index.htm;
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
```
|
||
|
||
2.创建网站发布目录,并且创建对应的网站
|
||
|
||
```shell
|
||
mkdir -p /1000phone.com/html
|
||
|
||
编辑文件写入主页展示的信息 vim /1000phone.com/html/index.html
|
||
|
||
或者直接echo写入
|
||
echo "test" > /1000phone.com/html/index.html
|
||
|
||
```
|
||
|
||
3.重新加载配置文件
|
||
|
||
nginx -s reload
|
||
|
||
4.客户端配置路由映射(本地域名解析)
|
||
|
||
```shell
|
||
vim /etc/hosts
|
||
|
||
192.168.59.160 web.testpm.com
|
||
|
||
192.168.59.160 web.1000phone.com
|
||
|
||
```
|
||
|
||
5.测试访问
|
||
|
||
curl 域名
|
||
|
||
```shell
|
||
curl web.testpm.com
|
||
curl web.1000phone.com
|
||
```
|
||
|
||
### 基于ip的虚拟主机
|
||
|
||
1.添加ip地址
|
||
|
||
图形化添加IP:nmtui
|
||
|
||
最小化添加IP:ifconfig ens33:1 192.168.59.180
|
||
|
||
2、配置通过ip区分的虚拟机
|
||
|
||
```shell
|
||
cat /etc/nginx/nginx.conf
|
||
|
||
user root;
|
||
worker_processes 4;
|
||
#error_log logs/error.log;
|
||
events {
|
||
worker_connections 1024;
|
||
}
|
||
|
||
http {
|
||
include 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"';
|
||
|
||
server {
|
||
listen 192.168.59.160:80;
|
||
server_name web.testpm.com;
|
||
location / {
|
||
root /var/www/nginx/;
|
||
index index.html index.htm;
|
||
limit_rate 2k;
|
||
}
|
||
|
||
location资源定位 root后面设定的是发布目录
|
||
server {
|
||
listen 192.168.59.180:80;
|
||
server_name www.testpm.com;
|
||
location / {
|
||
root /1000phone/html/;
|
||
index index.html index.htm;
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
|
||
```
|
||
|
||
3.重新加载配置文件
|
||
|
||
nginx -s reload
|
||
|
||
4.测试访问
|
||
|
||
浏览器访问ip
|
||
|
||
**如何解除刚刚绑定的IP?**
|
||
|
||
ifconfig ens33:1 192.168.59.180/24 down
|
||
|
||
重启nginx服务 把刚刚配置文件的ip删了
|
||
|
||
### 基于端口的虚拟主机
|
||
|
||
1.修改配置文件中不同server的端口
|
||
|
||
```shell
|
||
cat /etc/nginx/nginx.conf
|
||
|
||
user root;
|
||
worker_processes 4;
|
||
events {
|
||
worker_connections 1024;
|
||
}
|
||
|
||
http {
|
||
include 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"';
|
||
sendfile on;
|
||
keepalive_timeout 65;
|
||
|
||
server {
|
||
listen 80;
|
||
server_name web.testpm.com;
|
||
location / {
|
||
root /var/www/nginx/;
|
||
index index.html index.htm;
|
||
limit_rate 2k;
|
||
}
|
||
|
||
server {
|
||
listen 8080;
|
||
server_name www.testpm.com;
|
||
location / {
|
||
root /1000phone/html/;
|
||
index index.html index.htm;
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
|
||
```
|
||
|
||
2.重新加载配置文件:
|
||
|
||
nginx -s reload
|
||
|
||
3.测试访问:
|
||
浏览器输入:http://web.testpm.com/
|
||
浏览器输入:http://web.testpm.com:8080
|
||
|
||
## nginx特性
|
||
|
||
### web代理proxy
|
||
|
||
分类
|
||
|
||
nginx 只能做反向代理
|
||
|
||
squid
|
||
|
||
vanish
|
||
|
||
正向代理 客户端
|
||
|
||
透明代理 客户端
|
||
|
||
反向代理 服务器端
|
||
|
||
正向代理:代理的是客户端(属于一个网络),隐藏了真实的请求客户端,服务器不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替请求。
|
||
|
||
透明代理:客户机要访问网站,通过防火墙,进行端口转发到客户端附近的代理服务器3128端口,客户端察觉不到代理器的存在,根据代理服务器设置的规则判断是否能访问,达到内网用户上网行为控制的作用
|
||
|
||
反向代理:代理的是服务器端(属于一个网络),隐藏真是的服务器端,客户端不知道真正提供服务的是谁,不会将真实的ip暴露,反向代理服务器检测到垃圾请求转移到垃圾服务器上
|
||
|
||
CDN网站加速 熟悉阿里云CDN的价格配置
|
||
|
||
#### nginx反向代理实验
|
||
|
||
客户端->nginx代理服务器->后端web服务器
|
||
|
||
1.客户端访问nginx proxy:curl+ip
|
||
|
||
2.nginx proxy:
|
||
|
||
修改location里的proxy_pass参数
|
||
|
||
```shell
|
||
http {
|
||
server {
|
||
listen 80;
|
||
server_name localhost;
|
||
location / {
|
||
proxy_pass http://10.0.105.199:80; #nginx-1地址,真实后端服务器地址,可以是ip或域名
|
||
proxy_redirect default;
|
||
proxy_set_header Host $http_host;
|
||
proxy_set_header X-Real-IP $remote_addr;
|
||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||
|
||
proxy_connect_timeout 30;
|
||
proxy_send_timeout 60;
|
||
proxy_read_timeout 60;
|
||
}
|
||
}
|
||
}
|
||
|
||
```
|
||
|
||
3.web服务器:安装nginx或apache
|
||
|
||
排错:防火墙和selinux
|
||
|
||
### nginx负载均衡
|
||
|
||
随着网站、应用访问量的增加,一台服务器已经不能满足应用的需求,而需要多台服务器集群,这时就会用到负载均衡
|
||
|
||
#### 负载均衡配置upstream模块
|
||
|
||
upstream 配置的是一组被代理的服务器地址+负载均衡算法
|
||
|
||
```shell
|
||
upstream testapp {
|
||
ip_hash;
|
||
server 10.0.105.199:8081 weight=1;
|
||
server 10.0.105.202:8081 weight=2;
|
||
}
|
||
|
||
server {
|
||
....
|
||
location / {
|
||
proxy_pass http://testapp; #请求转向 testapp 定义的服务器列表
|
||
}
|
||
|
||
```
|
||
|
||
#### 负载均衡算法
|
||
|
||
upstream支持4种负载均衡调度算法
|
||
1、轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器; 加权轮询 轮叫
|
||
2、ip_hash:每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。
|
||
3、url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器。
|
||
4、fair:这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持 fair的,如果需要使用这种调度算法,必须下载Nginx的 upstream_fair模块。
|
||
|
||
#### nginx负载均衡实验
|
||
|
||
客户端->nignx proxy代理服务器->web01 realserver、web 02 realserver
|
||
|
||
大括号前面要空格
|
||
|
||
1.客户端:访问nginx proxy
|
||
|
||
2.nginx proxy:
|
||
|
||
```shell
|
||
修改配置文件 加入upstream模块
|
||
upstream mytest {
|
||
server 192.168.59.152;
|
||
server 192.168.59.161;
|
||
}
|
||
server {
|
||
proxy_pass http://mytest;
|
||
}
|
||
}
|
||
修改之后生效
|
||
```
|
||
|
||
3.web服务器:安装nginx或apache服务
|
||
|
||
可以在网页发布目录下修改网页内容
|
||
|
||
排错:防火墙和selinux
|
||
|
||
### nginx动静分离
|
||
|
||
#### 原理
|
||
|
||
一般来说,都需要将动态资源和静态资源分开,将静态资源部署在Nginx上,当一个请求来的时候,如果是静态资源的请求,就直接到nginx配置的静态资源目录下面获取资源,如果是动态资源的请求,nginx利用反向代理的原理,把请求转发给后台应用去处理,从而实现动静分离
|
||
|
||
#### 实验部署
|
||
|
||
一台客户端192.168.59.152
|
||
|
||
一台nginx proxy192.168.59.160
|
||
|
||
一台静态192.168.59.157
|
||
|
||
一台动态 php-fpm+nginx连接192.168.59.161
|
||
|
||
```bash
|
||
client->nginx proxy ->static
|
||
->php+nginx
|
||
```
|
||
|
||
##### 静态配置
|
||
|
||
```shell
|
||
server {
|
||
listen 80;
|
||
server_name localhost;
|
||
location ~ \.(html|jpg|png|js|css) {
|
||
root /home/www/nginx;
|
||
expires 1d; #为客户端设置静态资源缓存时间
|
||
}
|
||
location / {
|
||
root /usr/share/nginx/html;
|
||
index index.html index.htm;
|
||
}
|
||
|
||
}
|
||
|
||
```
|
||
|
||
expires 功能说明:为客户端设置缓存时间
|
||
|
||
为了减小对服务器请求的压力,提高用户浏览速度,我们可以通过设置nginx中的expires,让用户访问一次后,将图片缓存在用户的浏览器中,且时间比较长的缓存。
|
||
|
||
例如设置为:expires 10d; 那么用户在10天内请求的时候,都只会访问浏览器中的缓存,而不会去请求nginx。
|
||
|
||
需要注意的是,这种缓存方式只能在用户不对浏览器强制刷新的情况下生效,如果用户通过url来进行访问,是可以访问到缓存的。
|
||
|
||
##### 动态配置
|
||
|
||
安装php-fpm和nginx,动态服务器编辑nginx连接php,php不能发布网页 需要连接nginx
|
||
|
||
###### 安装php
|
||
|
||
```bash
|
||
**centos7步骤如下:**
|
||
|
||
yum 安装php7.1
|
||
[root@nginx-server ~] # rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm
|
||
[root@nginx-server ~] # rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
|
||
[root@nginx-server ~] # yum install php71w-xsl php71w php71w-ldap php71w-cli php71w-common php71w-devel php71w-gd php71w-pdo php71w-mysql php71w-mbstring php71w-bcmath php71w-mcrypt -y
|
||
[root@nginx-server ~]# yum install -y php71w-fpm
|
||
|
||
|
||
**centos-stream9因为软件比较新,无需使用第三方库,步骤如下:**
|
||
|
||
# yum install php-cli php-fpm php-gd php-mysqlnd php-mbstring php-opcache php-pdo -y
|
||
|
||
只需要修改/etc/php-fpm.d/www.conf配置文件中的apache用户和组为nginx即可启动服务
|
||
# vim /etc/php-fpm.d/www.conf
|
||
....
|
||
user = nginx #默认是apache
|
||
group = nginx
|
||
....
|
||
|
||
# systemctl start php-fpm
|
||
# systemctl enable php-fpm
|
||
socket方式启动 不用端口号
|
||
```
|
||
|
||
**php的两种运行方式:**
|
||
|
||
1.socket
|
||
|
||
2.9000端口
|
||
|
||
这里配置文件中默认是9000端口
|
||
|
||
启动systemctl start php-fpm
|
||
|
||
```bash
|
||
两种运行方式的区别:
|
||
socket 本地连接 客户端必须在本地 速度较快 高版本php-fpm默认
|
||
端口 远程连接 客户端可以在本地 也可以在远程 速度相对慢 低版本php-fpm默认
|
||
```
|
||
|
||
验证端口:lsof -i:9000
|
||
|
||
vim /etc/php-fpm.d/www.conf配置文件
|
||
|
||
user = nginx #默认是apache
|
||
group = nginx
|
||
|
||
验证:socket文件
|
||
|
||
/run/php-fpm/www.sock
|
||
|
||
如果打开php页面出现要下载的,说明页面没有解析
|
||
|
||
```bash
|
||
这里默认的运行方式是9000端口
|
||
发生错误:使用socket起不来
|
||
2024/05/30 19:26:01 [crit] 2515#2515: *15 connect() to unix:/run/php-fpm/www.sock failed (2: No such file or directory) while connecting to upstream, client: 192.168.59.161, server: localhost, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://unix:/run/php-fpm/www.sock:", host: "192.168.59.161"
|
||
解决:在php-fpm的配置文件里修改成listen的socket方式启动,这样可以更换连接方式
|
||
listen = /run/php-fpm/www.sock
|
||
```
|
||
|
||
###### nginx连接php
|
||
|
||
```shell
|
||
编辑nginx的配置文件:
|
||
server {
|
||
listen 80;
|
||
server_name localhost;
|
||
location ~ \.php$ {
|
||
root /home/nginx/html; #指定网站目录
|
||
#fastcgi_pass 127.0.0.1:9000; #开启fastcgi连接php地址,在centos8中yum默认为unix方式,使用下面的配置
|
||
fastcgi_pass unix:/run/php-fpm/www.sock;
|
||
fastcgi_index index.php; #指定默认文件
|
||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #站点根目录,取决于root配置项
|
||
include fastcgi_params; #包含fastcgi使用的常量
|
||
}
|
||
}
|
||
```
|
||
|
||
**编辑php测试页面**
|
||
|
||
```shell
|
||
cat /home/nginx/html/index.php
|
||
<?php
|
||
phpinfo();
|
||
?>
|
||
```
|
||
|
||
##### 代理配置
|
||
|
||
##### 配置nginx反向代理upstream,并实现服务器端缓存时间
|
||
|
||
```shell
|
||
upstream static {
|
||
server 10.0.105.196:80 weight=1 max_fails=1 fail_timeout=60s;
|
||
}
|
||
upstream php {
|
||
server 10.0.105.200:80 weight=1 max_fails=1 fail_timeout=60s;
|
||
}
|
||
|
||
proxy_cache_path /tmp/proxy_cache levels=1:2 keys_zone=proxy_cache:64m inactive=1d max_size=128m;//代理服务器缓存空间
|
||
|
||
server {
|
||
listen 80;
|
||
server_name localhost
|
||
#动态资源加载
|
||
location ~ \.(php|jsp)$ {
|
||
proxy_pass http://php;
|
||
proxy_set_header Host $host:$server_port;
|
||
proxy_set_header X-Real-IP $remote_addr;
|
||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||
}
|
||
#静态资源加载
|
||
location ~ .*\.(html|jpg|png|css|js)$ {
|
||
proxy_pass http://static;
|
||
proxy_set_header Host $host:$server_port;
|
||
proxy_set_header X-Real-IP $remote_addr;
|
||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||
proxy_cache proxy_cache; #配置设置的缓存空间名称
|
||
proxy_cache_valid 200 302 304 30d ; #根据响应码设置缓存时间,超过这个时间即使缓存文件中有缓存数据,nginx也会回源请求新数据。
|
||
proxy_cache_key $host$uri$is_args$args; #对不同用户的请求展示不同的内容
|
||
}
|
||
}
|
||
|
||
参数详解:
|
||
proxy_cache_path 缓存文件路径
|
||
levels 设置缓存文件目录层次;levels=1:2 表示两级目录
|
||
keys_zone 设置缓存名字和共享内存大小.【在使用的地方要使用缓存名】
|
||
inactive 在指定缓存时间内没人访问则被删除
|
||
max_size 最大缓存空间,如果缓存空间满,默认覆盖掉缓存时间最长的资源。
|
||
```
|
||
|
||
### location指令
|
||
|
||
Nginx 的 HTTP 配置主要包括三个区块,结构如下:
|
||
|
||
```shell
|
||
http { # 协议块
|
||
include mime.types;
|
||
default_type application/octet-stream;
|
||
keepalive_timeout 65;
|
||
gzip on;
|
||
server { # 服务块
|
||
listen 80;
|
||
server_name localhost;
|
||
location / { # 请求块
|
||
root html;
|
||
index index.html index.htm;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
浏览器-->地址栏-->URI -->http:// --> 主机:80 -->http协议块的配置 --> server --> location -->页面内容-->返回客户端浏览器
|
||
```
|
||
|
||
#### 1、location 区段
|
||
|
||
location 是在 server 块中配置,根据不同的 URI 使用不同的配置,来处理不同的请求。 - location 是有顺序的,会根据不同请求配置的优先级来匹配的location 处理。 基本语法如下: location [=|~|~*|^~|@] pattern{……}
|
||
|
||
#### 2、location 前缀含义
|
||
|
||
= 表示精确匹配,优先级也是最高的
|
||
|
||
^~ 表示uri以某个常规字符串开头,理解为匹配url路径即可
|
||
~ 表示区分大小写的正则匹配
|
||
~* 表示不区分大小写的正则匹配
|
||
|
||
!~ 表示区分大小写不匹配的正则
|
||
!~* 表示不区分大小写不匹配的正则
|
||
/ 通用匹配,任何请求都会匹配到
|
||
|
||
@ 内部服务跳转
|
||
|
||
**查找顺序和优先级**
|
||
= 大于 ^~ 大于 ~|~* 大于 !~|!~* 大于 /
|
||
多个location配置的情况下匹配顺序为:首先匹配 =,其次匹配^~, 其次是按正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。
|
||
Named Location (location @): 使用@符号定义的命名位置块不匹配URI前缀,而是根据具体的用途或配置定义来执行内部重定向。它们通常不与请求URI的前缀直接匹配,因此不涉及前缀匹配的优先级。
|
||
|
||
#### 3、location 配置示例
|
||
|
||
```sh
|
||
1、没有修饰符 表示:必须以指定模式开始
|
||
server {
|
||
listen 80;
|
||
server_name localhost;
|
||
|
||
location /abc {
|
||
root /home/www/nginx;
|
||
index 2.html;
|
||
}
|
||
|
||
那么,如下是对的:
|
||
http://192.168.1.9/abc
|
||
|
||
2、=表示:必须与指定的模式精确匹配
|
||
server {
|
||
listen 80;
|
||
server_name localhost;
|
||
access_log /var/log/nginx/http_access.log main;
|
||
|
||
location / {
|
||
root /usr/share/nginx/html;
|
||
index a.html index.htm;
|
||
}
|
||
location = / {
|
||
root /usr/share/nginx/html;
|
||
index b.html index.htm;
|
||
}
|
||
}
|
||
|
||
测试:
|
||
http://192.168.1.9
|
||
=/
|
||
http://192.168.1.9/a.html
|
||
/
|
||
|
||
```
|
||
|
||
```shell
|
||
3、~ 表示:指定的正则表达式要区分大小写
|
||
server {
|
||
server_name localhost;
|
||
location ~ /ab* {
|
||
root /home/www/nginx;
|
||
index 2.html index.html;
|
||
}
|
||
}
|
||
测试访问:
|
||
http://192.168.1.9/abc
|
||
不正确的
|
||
http://192.168.1.9/ABC
|
||
========================================
|
||
如果将配置文件修改为
|
||
location ~ /ABC {
|
||
root /home/www/nginx;
|
||
index 2.html index.html;
|
||
}
|
||
在创建目录和文件:
|
||
[root@ansible-server html]# cd /home/www/nginx/
|
||
[root@ansible-server nginx]# mkdir ABC
|
||
[root@ansible-server nginx]# vim ABC/2.html
|
||
访问:
|
||
http://192.168.1.9/ABC/
|
||
|
||
结论:~ 需要区分大小写。而且目录需要根据大小写定义。
|
||
```
|
||
|
||
```shell
|
||
4、^~和~*匹配案例
|
||
location ^~ /static/ {
|
||
root /usr/share/nginx/html;
|
||
index f.html;
|
||
}
|
||
|
||
location ~* .jpg$ {
|
||
root /usr/share/nginx/html; #上传图片到发布目录中
|
||
}
|
||
|
||
|
||
浏览器访问:
|
||
http://192.168.198.144/static/
|
||
http://192.168.198.144/test.jpg
|
||
|
||
location 区段匹配示例
|
||
|
||
location = / {
|
||
# 只匹配 / 的查询.
|
||
[ configuration A ]
|
||
}
|
||
location / {
|
||
# 匹配任何以 / 开始的查询,但是正则表达式与一些较长的字符串将被首先匹配。
|
||
[ configuration B ]
|
||
}
|
||
location ^~ /images/ {
|
||
# 匹配任何以 /images/ 开始的查询并且停止搜索,不检查正则表达式。
|
||
[ configuration C ]
|
||
}
|
||
location ~* \.(gif|jpg|jpeg)$ {
|
||
# 匹配任何以gif, jpg, or jpeg结尾的文件
|
||
[ configuration D ]
|
||
}
|
||
各请求的处理如下例:
|
||
/ → configuration A
|
||
/documents/document.html → configuration B
|
||
/images/1.gif → configuration C
|
||
/documents/1.jpg → configuration D
|
||
```
|
||
|
||
## nginx的rewrite功能
|
||
|
||
### 概念
|
||
|
||
Rewrite对称URL Rewrite,即URL重写,就是把传入Web的请求重定向到其他URL的过程
|
||
|
||
URL Rewrite最常见的应用是URL伪静态化,是将动态页面显示为静态页面方式的一种技术。比如http://www.123.com/news/index.php?id=123 使用URLRewrite 转换后可以显示为 http://www.123.com/news/123.html
|
||
|
||
实现网站地址跳转,例如用户访问360buy.com,将其跳转到jd.com。例如当用户访问tianyun.com的80端口时,将其跳转到443端口。
|
||
|
||
### Rewrite相关指令
|
||
|
||
相关指令有if、rewrite、set、return
|
||
|
||
#### if语句
|
||
|
||
if(条件){执行语句}
|
||
|
||
```shell
|
||
判断符号
|
||
~ 正则匹配 (区分大小写)
|
||
~* 正则匹配 (不区分大小写)
|
||
!~ 正则不匹配 (区分大小写)
|
||
!~* 正则不匹配 (不区分大小写)
|
||
-f 和!-f 用来判断是否存在文件
|
||
-d 和!-d 用来判断是否存在目录
|
||
-e 和!-e 用来判断是否存在文件或目录
|
||
-x 和!-x 用来判断文件是否可执行
|
||
```
|
||
|
||
#### 全局变量
|
||
|
||
在匹配过程中可以引用一些Nginx的全局变量
|
||
|
||
```bash
|
||
$args 请求中的参数;
|
||
$document_root 针对当前请求的根路径设置值;
|
||
$host 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名; http://www.qf.com
|
||
$limit_rate 对连接速率的限制;
|
||
$request_method 请求的方法,比如"GET"、"POST"等;
|
||
$remote_addr 客户端地址;
|
||
$remote_port 客户端端口号;
|
||
$remote_user 客户端用户名,认证用;
|
||
$request_filename 当前请求的文件路径名(带网站的主目录/usr/local/nginx/html/images /a.jpg)
|
||
$request_uri 当前请求的文件路径名(不带网站的主目录/images/a.jpg)
|
||
$query_string 与$args相同;
|
||
$scheme 用的协议,比如http或者是https
|
||
$server_protocol 请求的协议版本,"HTTP/1.0"或"HTTP/1.1";
|
||
$server_addr 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费);
|
||
$server_name 请求到达的服务器名;
|
||
$document_uri 与$uri一样,URI地址;
|
||
$server_port 请求到达的服务器端口号;
|
||
```
|
||
|
||
#### 使用案例
|
||
|
||
匹配访问的url地址是否是个目录
|
||
|
||
```shell
|
||
if (-d $request_filename){
|
||
...;
|
||
}
|
||
```
|
||
|
||
匹配访问的地址是否以www开头
|
||
|
||
```shell
|
||
if ($host ~* ^www){
|
||
...;
|
||
}
|
||
```
|
||
|
||
#### 实验:80转443端口
|
||
|
||
1.制作证书
|
||
|
||
2.nginx配置证书
|
||
|
||
3.rewrite端口转发
|
||
|
||
购买公网可用的受信任证书并进行测试
|
||
|
||
#### 制作CA证书
|
||
|
||
##### 证书制作
|
||
|
||
```shell
|
||
RHEL5、RHEL6 、RHEL7中在/etc/pki/tls/certs 目录有个脚本可以帮助我们简化证书生成的过程
|
||
cd /etc/pki/tls/certs
|
||
make server.key //生成私钥
|
||
openssl rsa -in server.key -out server.key //去除密码以便使用时不询问密码 注:rsa是一种采用非对称密钥的加密算法
|
||
make server.csr //生成证书颁发机构,用于颁发公钥
|
||
openssl x509 -in server.csr -req -signkey server.key -days 365 -out server.crt //颁发公钥 注:x509是一种非常通用的证书格式
|
||
```
|
||
|
||
##### nginx配置证书使用
|
||
|
||
由于我们并不是去 CA 证书中心申请的公钥,所以在使用的时候,客户端浏览器会跳出未受信任的警告。如果你 money 够多,请去 CA 申请。
|
||
|
||
```shell
|
||
server {
|
||
#listen 443;
|
||
listen 443 ssl;
|
||
server_name web.wing.com;
|
||
ssl_certificate /etc/nginx/server.crt;
|
||
ssl_certificate_key /etc/nginx/server.key;
|
||
ssl_session_timeout 5m;
|
||
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
|
||
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
|
||
ssl_prefer_server_ciphers on;
|
||
location / {
|
||
root /wing/html;
|
||
index index.html index.htm;}
|
||
}
|
||
```
|
||
|
||
#listen 443 ssl; 1.26版本以上使用此配置 并且取消下面ssl的开关行配置
|
||
|
||
ssl on; # 1.26 版本需要删除本行配置
|
||
|
||
**ssl_certificate /etc/pki/tls/certs/server.crt;**** ssl_certificate_key /etc/pki/tls/certs/server.key;** #指定证书所存放的路径
|
||
|
||
**ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;** # 密码指定为OpenSSL支持的格式,Nginx模板配置不可用,注意修改此行
|
||
|
||
##### 访问:
|
||
|
||
```shell
|
||
https://ip
|
||
```
|
||
|
||
## nginx访问控制
|
||
|
||
nginx -V可以查看有的功能模块
|
||
|
||
### nginx访问控制模块
|
||
|
||
1.基于ip的访问控制:http_access_module
|
||
|
||
2.基于用户的信任登录:http_auth_basic_module
|
||
|
||
### 基于ip的访问控制
|
||
|
||
#### 配置语法
|
||
|
||
```shell
|
||
Syntax:allow address | all;
|
||
default:默认无
|
||
Context:http,server,location
|
||
|
||
Syntax:deny address | all;
|
||
default:默认无
|
||
Context:http,server,location
|
||
===================================================
|
||
allow 允许 //ip或者网段
|
||
deny 拒绝 //ip或者网段
|
||
|
||
```
|
||
|
||
#### 配置测试
|
||
|
||
```shell
|
||
deny all;
|
||
allow all;
|
||
deny 192.168.59.157
|
||
allow 192.168.59.157
|
||
```
|
||
|
||
vim`/etc/nginx/conf.d/access_mod.conf`内容如下:
|
||
|
||
```shell
|
||
server {
|
||
listen 80;
|
||
server_name localhost;
|
||
location / {
|
||
root /usr/share/nginx/html;
|
||
index index.html index.hml;
|
||
deny 192.168.1.8;
|
||
allow all;
|
||
}
|
||
}
|
||
[root@192 ~]# nginx -t
|
||
[root@192 ~]# nginx -s reload
|
||
```
|
||
|
||
1.按顺序匹配,已经被匹配的ip或者网段,后面不再被匹配。
|
||
2.如果先允许所有ip访问,再定义拒绝访问。那么拒绝访问不生效。
|
||
3.默认为allow allcurl
|
||
|
||
### 基于用户的信任登录
|
||
|
||
http_auth_basic_module
|
||
|
||
网站的某些页面不希望公开,我们希望的是某些特定的客户端可以访问。那么我们可以在访问时要求进行身份认证。
|
||
|
||
#### 配置语法
|
||
|
||
```shell
|
||
Syntax:auth_basic string | off;
|
||
default:auth_basic off;
|
||
Context:http,server,location
|
||
|
||
Syntax:auth_basic_user_file file;
|
||
default:默认无
|
||
Context:http,server,location
|
||
file:存储用户名密码信息的文件。
|
||
```
|
||
|
||
#### 配置实例
|
||
|
||
编辑vim /etc/nginx/conf.d/auth_mod.conf
|
||
|
||
```shell
|
||
server {
|
||
listen 80;
|
||
server_name localhost;
|
||
location ~ /admin {
|
||
root /var/www/html;
|
||
index index.html index.hml;
|
||
auth_basic "Auth access test!";
|
||
auth_basic_user_file /etc/nginx/auth_conf;
|
||
}
|
||
}
|
||
```
|
||
|
||
重启服务 重新加载配置文件
|
||
|
||
创建相关目录 以及目录下的文件
|
||
|
||
`auth_basic`不为`off`,开启登录验证功能,`auth_basic_user_file`加载账号密码文件。
|
||
|
||
#### 建立口令文件
|
||
|
||
```shell
|
||
yum install -y httpd-tools //安装htoasswd,开源http服务器apache httpd的命令工具,用于生成基本认证的密码文件
|
||
htpasswd -cm /etc/nginx/auth_conf user10 //添加用户user10
|
||
htpasswd -m /etc/nginx/auth_conf user20 //添加用户user20
|
||
cat /etc/nginx/auth_conf 查看加密的密码文件
|
||
```
|
||
|
||
-c 创建解密文件,-m MD5加密(新版本的apache不用-m可默认加密)
|
||
|
||
#### 访问测试
|
||
|
||

|
||
|
||
## nginx监控****
|
||
|
||
nginx 提供了 ngx_http_stub_status_module.这个模块提供了基本的监控功能
|
||
|
||
### 监控的指标
|
||
|
||
Accepts(接受)、Handled(已处理)、Requests(请求数)是一直在增加的计数器
|
||
|
||
Active(活跃)、Waiting(等待)、Reading(读)、Writing(写)随着请求量而增减
|
||
|
||
Accepts:Nginx所接受的客户端连接数
|
||
|
||
Handled:成功的客户端连接数
|
||
|
||
每秒请求数 -- QPS:
|
||
|
||
通过持续的 QPS 监控,可以立刻发现是否被恶意攻击或对服务的可用性进行评估。虽然当问题发生时,通过 QPS 不能定位到确切问题的位置,但是他却可以在第一时间提醒你环境可能出问题了
|
||
|
||
请求处理时间:
|
||
|
||
请求处理时间也可以被记录在 access log 中,通过分析 access log,统计请求的平均响应时间,通过持续观察,可以发现上游服务器的问题
|
||
|
||
### 指标搜集
|
||
|
||
检查是否有安装模块
|
||
|
||
```shell
|
||
nginx -V
|
||
```
|
||
|
||
没有此模块 需要重新安装
|
||
|
||
```shell
|
||
./configure --with-http_stub_status_module
|
||
```
|
||
|
||
修改配置文件
|
||
|
||
```shell
|
||
vim /etc/nginx/conf.d/default.conf
|
||
server {
|
||
listen 80;
|
||
server_name localhost;
|
||
location /nginx-status {
|
||
stub_status on;
|
||
}
|
||
}
|
||
直接在配置文件里加一行stub_status on;
|
||
```
|
||
|
||
nginx状态查看
|
||
|
||
配置完成后在浏览器中输入http://ip/nginx-status 查看显示信息
|
||
|
||
参数解释
|
||
|
||
```shell
|
||
Active connections:2 #当前nginx处理请求的数目(活跃的连接数)
|
||
server accepts handled requests 26 26 48
|
||
nginx总共处理了26个连接,成功创建26次握手,也就是成功的连接数connection. 总共处理了48个请求
|
||
失败连接=(总连接数-成功连接数)(相等表示中间没有失败的),
|
||
Reading : nginx读取到客户端的Header信息数。请求头 -----速度快。
|
||
Writing :nginx返回给客户端的Header信息数。响应头
|
||
Waiting :开启keep-alive的情况下,意思就是Nginx说已经处理完正在等候下一次请求指令的驻留连接。
|
||
#可以nginx有多少的长连接。相当于空闲的。可以把超时时间改的短一点。 ---------监控的对象
|
||
通常,一个连接在同一时间只接受一个请求。在这种情况下,Active 连接的数目 == Waiting 的连接 + Reading 请求 + Writing
|
||
```
|
||
|
||

|
||
|
||
```shell
|
||
3个数值对应3个参数
|
||
active connection
|
||
server accepts
|
||
handled requests
|
||
```
|
||
|
||
# LVS负载均衡集群
|
||
|
||
## dr模式工作原理
|
||
|
||
数据链路层负载均衡是指在通信协议的数据链路层修改mac地址进行负载均衡。直接路由方式(DR)在数据分发过程中不修改ip地址,只修改目的mac地址,通过配置真实物理服务器集群所有机器虚拟IP和负载均衡服务器IP地址一致,从而达到不修改数据包的源地址和目的地址就可以进行数据分发的目的。
|
||
|
||
## dr实验
|
||
|
||
### 准备
|
||
|
||
client
|
||
dr 两块网卡
|
||
web01
|
||
web02
|
||
|
||
实验完之后,通过vip访问两个web
|
||
|
||
### 操作
|
||
|
||
1.两台web服务器,保证可以正常访问
|
||
|
||
2.dr上确定vip和dip
|
||
|
||
通过查看路由找到对应网卡 vip和dip
|
||
|
||
```shell
|
||
route -n //没有就安装net-tools
|
||
|
||
Kernel IP routing table
|
||
Destination Gateway Genmask Flags Metric Ref Use Iface
|
||
0.0.0.0 192.168.59.2 0.0.0.0 UG 100 0 0 ens33 //上面dip
|
||
0.0.0.0 192.168.59.2 0.0.0.0 UG 101 0 0 ens36 //下面vip
|
||
192.168.59.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
|
||
192.168.59.0 0.0.0.0 255.255.255.0 U 101 0 0 ens36
|
||
```
|
||
|
||
vip对外的 是客户端访问的ip
|
||
dip对rs的 使用用来给rs分发流量
|
||
|
||
3.两台web服务器
|
||
|
||
```shell
|
||
ifconfig lo:0 192.168.59.164/32
|
||
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
|
||
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
|
||
```
|
||
|
||
4.dr上
|
||
|
||
安装ipvsadm:lvs管理软件
|
||
|
||
```shell
|
||
ipvsadm -A -t 192.168.59.164:80 -s rr //服务器增加一条新的tcp虚拟服务记录 -s调度算法
|
||
ipvsadm -Ln //查看
|
||
ipvsadm -a -t 192.168.59.164:80 -r 192.168.59.166:80 -g
|
||
ipvsadm -a -t 192.168.59.164:80 -r 192.168.59.167:80 -g
|
||
ipvsadm -Ln
|
||
|
||
IP Virtual Server version 1.2.1 (size=4096)
|
||
Prot LocalAddress:Port Scheduler Flags
|
||
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
|
||
TCP 192.168.59.164:80 rr
|
||
-> 192.168.59.166:80 Route 1 0 0
|
||
-> 192.168.59.167:80 Route 1 0 1
|
||
```
|
||
|
||
5.测试
|
||
|
||
client访问vip出现网页内容即可
|
||
|
||
# 高可用Keepalived
|
||
|
||
## 简介
|
||
|
||
keepalived是保证集群高可用的服务软件,防止单点故障,一台坏了另一台可以接着用。
|
||
|
||
### 工作原理
|
||
|
||
keepalived是以VRRP协议为实现基础的,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。
|
||
|
||
**VRRP**全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
|
||
|
||
实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。优先级高的,就优先成为下一个master
|
||
|
||
vip在谁上,谁就是master,vip是可以漂移的资源
|
||
|
||
做成高可用集群后,客户端访问的是keepalived的vip
|
||
|
||
------
|
||
|
||
#### 脑裂
|
||
|
||
keepalived的脑裂:指在一个高可用(HA)系统中,当联系着的两个节点断开联系时,本来为一个整体的系统,分裂为两个独立节点,这时两个节点开始争抢共享资源,结果会导致系统混乱,数据损坏。===在一个高可用集群中,出现了多个vip,出现了多个master
|
||
|
||
脑裂的原因:对外网络正常,高可用集群内部master无法跟backup通讯,所以导致优先级高的backup成为master,但是原先的master不知道
|
||
|
||
解决方案:shoot the other in the head爆头,解决掉一个master
|
||
|
||
脑裂不一定影响服务:
|
||
|
||
对于无状态服务的HA,无所谓脑裂不脑裂;但对有状态服务(比如MySQL)的HA,必须要严格防止脑裂
|
||
|
||
究竟是有状态服务,还是无状态服务,其判断依据——两个来自相同发起者的请求在服务器端是否具备上下文关系
|
||
|
||
------
|
||
|
||
## lvs负载均衡高可用实验
|
||
|
||
主备两台dr,可以做到主坏了之后,还能继续转到备上进行访问
|
||
|
||
### 准备
|
||
|
||
客户端client
|
||
|
||
web1
|
||
|
||
web2
|
||
|
||
两台web服务器需要有对应的vip 在本地回环接口上
|
||
|
||
dr1
|
||
|
||
dr2
|
||
|
||
### 部署
|
||
|
||
#### 两台web服务器
|
||
|
||
选择一个没有被使用的ip地址:ping该地址,ping通则说明没人使用,可以使用
|
||
|
||
```bash
|
||
ifconfig lo:0 192.168.26.49/32 随便写,只要在同一个网段就可以
|
||
```
|
||
|
||
忽略arp广播
|
||
|
||
```bash
|
||
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
|
||
```
|
||
|
||
开启路由转发
|
||
|
||
```bash
|
||
echo 2 > /proc/sys/net/ipv4/ip_forword
|
||
```
|
||
|
||
开启精确的ip地址回包
|
||
|
||
```bash
|
||
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
|
||
```
|
||
|
||
------
|
||
|
||
#### lvs部署
|
||
|
||
**两台dr**
|
||
|
||
1.添加vip:在真实网卡上添加,新加一块网卡,或者将ip添加到一个网卡上
|
||
|
||
```bash
|
||
ip a a dev ens33 vip/32
|
||
```
|
||
|
||
2.添加lvs规则
|
||
|
||
安装ipvsadmin
|
||
|
||
```bash
|
||
yum -y install ipvsadmin
|
||
```
|
||
|
||
创建虚拟服务器,轮询算法
|
||
|
||
```bash
|
||
ipvsadm -A -t vip:80 -s rr
|
||
```
|
||
|
||
采用dr的方式
|
||
|
||
```bash
|
||
ipvsadm -a -t vip:80 -r web01:80 -g
|
||
ipvsadm -a -t vip:80 -r web02:80 -g
|
||
```
|
||
|
||
3.查看
|
||
|
||
```bash
|
||
ipvsadm -Ln
|
||
//测试
|
||
curl vip
|
||
```
|
||
|
||
------
|
||
|
||
#### 高可用部署
|
||
|
||
1.安装keepalived:master和backup
|
||
|
||
```bash
|
||
yum -y install keepalived
|
||
```
|
||
|
||
2.配置keepalived文件
|
||
|
||
vim /etc/keepalived/keepalived.conf
|
||
|
||
```bash
|
||
以master的配置文件为例
|
||
! Configuration File for keepalived
|
||
|
||
global_defs {
|
||
router_id lvs-keepalived-master #辅助改为lvs-backup
|
||
}
|
||
|
||
vrrp_instance VI_1 {
|
||
state MASTER
|
||
interface ens33 #VIP绑定接口
|
||
virtual_router_id 80 #VRID 同一组集群,主备一致
|
||
priority 100 #本节点优先级,辅助改为50
|
||
advert_int 1 #检查间隔,默认为1s
|
||
authentication { #认证
|
||
auth_type PASS
|
||
auth_pass 1111
|
||
}
|
||
virtual_ipaddress { #高可用的vip和lvs的vip子网掩码不一样
|
||
192.168.246.160/24
|
||
}
|
||
}
|
||
|
||
virtual_server 192.168.246.160 80 { #LVS配置
|
||
delay_loop 3
|
||
lb_algo rr #LVS调度算法
|
||
lb_kind DR #LVS集群模式(路由模式)
|
||
nat_mask 255.255.255.0
|
||
protocol TCP #健康检查使用的协议
|
||
real_server 192.168.246.162 80 {
|
||
weight 1
|
||
inhibit_on_failure #当该节点失败时,把权重设置为0,而不是从IPVS中删除
|
||
TCP_CHECK { #健康检查
|
||
connect_port 80 #检查的端口
|
||
connect_timeout 3 #连接超时的时间
|
||
}
|
||
}
|
||
real_server 192.168.246.163 80 {
|
||
weight 1
|
||
inhibit_on_failure
|
||
TCP_CHECK {
|
||
connect_timeout 3
|
||
connect_port 80
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
下面是backup的配置文件
|
||
|
||
```bash
|
||
! Configuration File for keepalived
|
||
|
||
global_defs {
|
||
router_id lvs-keepalived-backup #辅助改为lvs-backup
|
||
}
|
||
|
||
vrrp_instance VI_1 {
|
||
state BACKUP
|
||
interface ens33 #VIP绑定接口
|
||
virtual_router_id 80 #VRID 同一组集群,主备一致
|
||
priority 150 #本节点优先级,辅助改为50
|
||
advert_int 1 #检查间隔,默认为1s
|
||
authentication { #认证
|
||
auth_type PASS
|
||
auth_pass 1111
|
||
}
|
||
virtual_ipaddress { #高可用的vip和lvs的vip子网掩码不一样
|
||
192.168.59.111/24
|
||
}
|
||
}
|
||
|
||
virtual_server 192.168.59.111 80 { #LVS配置
|
||
delay_loop 3
|
||
lb_algo rr #LVS调度算法
|
||
lb_kind DR #LVS集群模式(路由模式)
|
||
nat_mask 255.255.255.0
|
||
protocol TCP #健康检查使用的协议
|
||
real_server 192.168.59.166 80 {
|
||
weight 1
|
||
inhibit_on_failure #当该节点失败时,把权重设置为0,而不是从IPVS中删除
|
||
TCP_CHECK { #健康检查
|
||
connect_port 80 #检查的端口
|
||
connect_timeout 3 #连接超时的时间
|
||
}
|
||
}
|
||
real_server 192.168.59.167 80 {
|
||
weight 1
|
||
inhibit_on_failure
|
||
TCP_CHECK {
|
||
connect_timeout 3
|
||
connect_port 80
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
3.开启master和backup的keepalived服务,查看ip
|
||
|
||
网卡ens33有三个ip,分别是自身dip,lvs的vip,高可用的vip(两个vip区别是子网掩码不一样)
|
||
|
||
停掉master的keepalived服务,查看ip,发现高可用的vip没了
|
||
|
||
这时就转移到了backup的keepalived服务,高可用的vip也出现在backup,通过客户端访问vip也可以访问到
|
||
|
||
------
|
||
|
||
## LVS+NGINX
|
||
|
||
```shell
|
||
1.准备好web-server(两台都要做)
|
||
web-server-1:10.0.0.42
|
||
web-server-2:10.0.0.141
|
||
安装nginx,并且保证nginx正常运行
|
||
分别要在web-server上创建一个测试界面
|
||
echo "web-server-1" > /usr/share/nginx/html/index.html
|
||
echo "web-server-2" > /usr/share/nginx/html/index.html
|
||
检测web-server是否正常被访问
|
||
|
||
2.负载均衡的部署(两台都要做)
|
||
master:10.0.0.154
|
||
backup:10.0.0.27
|
||
|
||
master和backup都要做以下操作:
|
||
vim /etc/nginx/nginx.conf 添加以下内容
|
||
upstream xingdian {
|
||
server 10.0.0.42:80;
|
||
server 10.0.0.141:80;
|
||
}
|
||
|
||
vim /etc/nginx/conf.d/default.conf 修改一下内容
|
||
|
||
location / {
|
||
proxy_pass http://xingdian;
|
||
proxy_redirect default;
|
||
proxy_set_header Host $http_host;
|
||
proxy_set_header X-Real-IP $remote_addr;
|
||
proxy_set_header REMOTE-HOST $remote_addr;
|
||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||
}
|
||
|
||
保证nginx的负载均衡可用,客户端可以访问测试:
|
||
|
||
Keepalived实现调度器HA(vip我们直接写在配置文件中)
|
||
|
||
1. 主/备调度器安装软件(安装keepalived)
|
||
[root@master ~]# yum install -y keepalived
|
||
[root@backup ~]# yum install -y keepalived
|
||
[root@master ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak (略)
|
||
[root@nginx-proxy-master ~]# vim /etc/keepalived/keepalived.conf
|
||
! Configuration File for keepalived
|
||
|
||
global_defs {
|
||
router_id director1 #辅助改为director2
|
||
}
|
||
|
||
vrrp_instance VI_1 {
|
||
state MASTER #定义主还是备
|
||
interface ens33 #VIP绑定接口
|
||
virtual_router_id 80 #整个集群的调度器一致
|
||
priority 100 #back改为50
|
||
advert_int 1
|
||
authentication {
|
||
auth_type PASS
|
||
auth_pass 1111
|
||
}
|
||
virtual_ipaddress {
|
||
10.0.0.110/24
|
||
}
|
||
}
|
||
|
||
[root@backup ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
|
||
[root@backup ~]# vim /etc/keepalived/keepalived.conf
|
||
! Configuration File for keepalived
|
||
|
||
global_defs {
|
||
router_id directory2
|
||
}
|
||
|
||
vrrp_instance VI_1 { #实例名称,两台要保持相同
|
||
state BACKUP #设置为backup
|
||
interface ens33 #心跳网卡
|
||
nopreempt #设置到back上面,不抢占资源
|
||
virtual_router_id 80 #虚拟路由编号,主备要保持一致
|
||
priority 50 #辅助改为50
|
||
advert_int 1 #检查间隔,单位秒
|
||
authentication { 秘钥认证
|
||
auth_type PASS
|
||
auth_pass 1111
|
||
}
|
||
virtual_ipaddress {
|
||
10.0.0.110/24
|
||
}
|
||
}
|
||
3. 启动KeepAlived(主备均启动)
|
||
[root@master ~]# systemctl enable keepalived
|
||
[root@master ~]# systemctl start keepalived
|
||
```
|
||
|
||
------
|
||
|
||
## 扩展实验-keepalived+mysql
|
||
|
||
mysql可以是以下3种情况
|
||
|
||
1、双主
|
||
|
||
2、mysql-cluster
|
||
|
||
3、gelara集群
|
||
|
||
**项目环境**
|
||
VIP 192.168.122.100
|
||
mysql1 192.168.122.10
|
||
mysql2 192.168.122.20
|
||
vip
|
||
主(keepalived) 主(keepalived)
|
||
|
||
------
|
||
|
||
实现过程概要
|
||
|
||
一、mysql 主主同步
|
||
二、在两台mysql上安装keepalived
|
||
三、keepalived 主备配置文件
|
||
四、mysql状态检测脚本/root/bin/keepalived_check_mysql.sh
|
||
五、测试及诊断
|
||
注 keepalived之间使用vrrp组播方式通信使用的IP地址是224.0.0.18
|
||
**实施步骤**
|
||
|
||
------
|
||
|
||
##### **一、mysql 主主同步 <略>**
|
||
|
||
##### **二、安装keepalived**
|
||
|
||
```bash
|
||
两台
|
||
# yum install keepalived -y
|
||
```
|
||
|
||
------
|
||
|
||
##### **三、keepalived 主备配置文件**
|
||
|
||
主备置文件不同处有 state priority
|
||
|
||
------
|
||
|
||
Master配置
|
||
|
||
```bash
|
||
# vim /etc/keepalived/keepalived.conf
|
||
```
|
||
|
||
```
|
||
! Configuration File for keepalived
|
||
|
||
global_defs {
|
||
router_id mysql1 //两边一样
|
||
}
|
||
|
||
vrrp_script check_run { //定义配置健康检查脚本的配置名称check_run
|
||
script "/root/keepalived_check_mysql.sh"
|
||
interval 5 //执行健康检查的时间间隔 单位s
|
||
}
|
||
|
||
vrrp_instance VI_1 {
|
||
state MASTER
|
||
interface eth0(改 route -n)
|
||
virtual_router_id 88
|
||
priority 100(改)
|
||
advert_int 1 //检查keepalived本身服务的时间间隔
|
||
authentication {
|
||
auth_type PASS
|
||
auth_pass 1111
|
||
}
|
||
|
||
track_script {
|
||
check_run //名字必须和上面的脚本配置名称一致
|
||
}
|
||
|
||
virtual_ipaddress {
|
||
192.168.122.100 dev eth0
|
||
}
|
||
}
|
||
```
|
||
|
||
|
||
|
||
------
|
||
|
||
Slave配置
|
||
|
||
```bash
|
||
# vim /etc/keepalived/keepalived.conf
|
||
```
|
||
|
||
```
|
||
! Configuration File for keepalived
|
||
|
||
global_defs {
|
||
router_id mysql1
|
||
}
|
||
|
||
vrrp_script check_run {
|
||
script "/root/keepalived_check_mysql.sh"
|
||
interval 5
|
||
}
|
||
|
||
vrrp_instance VI_1 {
|
||
state BACKUP
|
||
interface eth0(改 route -n)
|
||
virtual_router_id 88
|
||
priority 90
|
||
advert_int 1
|
||
authentication {
|
||
auth_type PASS
|
||
auth_pass 1111
|
||
}
|
||
|
||
track_script {
|
||
check_run
|
||
}
|
||
|
||
virtual_ipaddress {
|
||
192.168.122.100
|
||
}
|
||
```
|
||
|
||
------
|
||
|
||
##### **四、mysql状态检测脚本**
|
||
|
||
/root/keepalived_check_mysql.sh(两台MySQL同样的脚本)
|
||
|
||
```bash
|
||
版本一:简单使用:
|
||
#!/bin/bash
|
||
/usr/bin/mysql -h ip -uroot -p123 -e "show status;" &>/dev/null
|
||
if [ $? -ne 0 ] ;then
|
||
systemctl stop keepalived
|
||
fi
|
||
# 此处的ip是本地ip
|
||
|
||
版本二:检查多次
|
||
# vim /root/keepalived_check_mysql.sh
|
||
#!/bin/bash
|
||
MYSQL=/usr/local/mysql/bin/mysql
|
||
MYSQL_HOST=localhost
|
||
MYSQL_USER=root
|
||
MYSQL_PASSWORD=1111
|
||
CHECK_TIME=3
|
||
|
||
#mysql is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0
|
||
MYSQL_OK=1
|
||
|
||
check_mysql_helth (){
|
||
$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p${MYSQL_PASSWORD} -e "show status;" &>/dev/null
|
||
if [ $? -eq 0 ] ;then
|
||
MYSQL_OK=1
|
||
else
|
||
MYSQL_OK=0
|
||
fi
|
||
return $MYSQL_OK
|
||
}
|
||
|
||
while [ $CHECK_TIME -ne 0 ]
|
||
do
|
||
check_mysql_helth
|
||
if [ $MYSQL_OK -eq 1 ] ; then
|
||
exit 0
|
||
fi
|
||
|
||
if [ $MYSQL_OK -eq 0 ] && [ $CHECK_TIME -eq 1 ];then
|
||
/etc/init.d/keepalived stop
|
||
exit 1
|
||
fi
|
||
let CHECK_TIME--
|
||
sleep 1
|
||
done
|
||
|
||
版本三:检查多次
|
||
# vim /root/keepalived_check_mysql.sh
|
||
#!/bin/bash
|
||
MYSQL=/usr/local/mysql/bin/mysql
|
||
MYSQL_HOST=localhost
|
||
MYSQL_USER=root
|
||
MYSQL_PASSWORD=1111
|
||
CHECK_TIME=3
|
||
|
||
#mysql is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0
|
||
MYSQL_OK=1
|
||
|
||
check_mysql_helth (){
|
||
$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p${MYSQL_PASSWORD} -e "show status;" &>/dev/null
|
||
if [ $? -eq 0 ] ;then
|
||
MYSQL_OK=1
|
||
else
|
||
MYSQL_OK=0
|
||
fi
|
||
return $MYSQL_OK
|
||
}
|
||
|
||
while [ $CHECK_TIME -ne 0 ]
|
||
do
|
||
check_mysql_helth
|
||
if [ $MYSQL_OK -eq 1 ] ; then
|
||
exit 0
|
||
fi
|
||
|
||
let CHECK_TIME--
|
||
sleep 1
|
||
done
|
||
/etc/init.d/keepalived stop
|
||
exit 1
|
||
|
||
# chmod 755 /root/keepalived_check_mysql.sh
|
||
|
||
两边均启动keepalived
|
||
|
||
日志查看脚本是否被执行
|
||
# tail -f /var/log/messages
|
||
Jun 19 15:20:19 xen1 Keepalived_vrrp[6341]: Using LinkWatch kernel netlink reflector...
|
||
Jun 19 15:20:19 xen1 Keepalived_vrrp[6341]: VRRP sockpool: [ifindex(2), proto(112), fd(11,12)]
|
||
Jun 19 15:20:19 xen1 Keepalived_vrrp[6341]: VRRP_Script(check_run) succeeded
|
||
```
|
||
|
||
------
|
||
|
||
# ANSIBLE自动化运维
|
||
|
||
|
||
|