JC/基础/三阶段.md
2024-12-26 10:22:14 +08:00

2125 lines
57 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 防火墙
## 企业级防火墙技术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项目 构建软件 mavenjdk+maven+tomact运维Linux构建 jdk+mavenmvn
开发:开发环境分支 生产环境分支
前端:不能直接使用 构建vue3 node.js开发windows构建 idea + node.js插件 运维Linux构建 node.jsnpm
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
![da570f62-901f-460c-8bfb-9e7fe70cf74f](file:///C:/Users/12566/Pictures/Typedown/da570f62-901f-460c-8bfb-9e7fe70cf74f.png)
# 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地址
图形化添加IPnmtui
最小化添加IPifconfig 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 proxycurl+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连接phpphp不能发布网页 需要连接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
Syntaxallow address | all;
default默认无
Contexthttpserverlocation
Syntaxdeny address | all;
default默认无
Contexthttpserverlocation
===================================================
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
Syntaxauth_basic string | off;
defaultauth_basic off;
Contexthttpserverlocation
Syntaxauth_basic_user_file file;
default默认无
Contexthttpserverlocation
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可默认加密
#### 访问测试
![38381625-5ee2-4199-a63a-0d1eb585875c](file:///C:/Users/12566/Pictures/Typedown/38381625-5ee2-4199-a63a-0d1eb585875c.png)
## nginx监控****
nginx 提供了 ngx_http_stub_status_module.这个模块提供了基本的监控功能
### 监控的指标
 Accepts接受、Handled已处理、Requests请求数是一直在增加的计数器
 Active活跃、Waiting等待、Reading、Writing随着请求量而增减
 AcceptsNginx所接受的客户端连接数
 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
```
![833f4c0d-2594-4bd8-af45-66ea40db4fa2](file:///C:/Users/12566/Pictures/Typedown/833f4c0d-2594-4bd8-af45-66ea40db4fa2.png)
```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和多个backupmaster上面有一个对外提供服务的vip该路由器所在局域网内其他机器的默认路由为该vipmaster会发组播当backup收不到vrrp包时就认为master宕掉了这时就需要根据VRRP的优先级来选举一个backup当master。优先级高的就优先成为下一个master
vip在谁上谁就是mastervip是可以漂移的资源
做成高可用集群后客户端访问的是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.安装keepalivedmaster和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分别是自身diplvs的vip高可用的vip两个vip区别是子网掩码不一样
停掉master的keepalived服务查看ip发现高可用的vip没了
这时就转移到了backup的keepalived服务高可用的vip也出现在backup通过客户端访问vip也可以访问到
------
## LVS+NGINX
```shell
1.准备好web-server两台都要做
web-server-110.0.0.42
web-server-210.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.负载均衡的部署(两台都要做)
master10.0.0.154
backup10.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实现调度器HAvip我们直接写在配置文件中
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自动化运维