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

57 KiB
Raw Blame History

防火墙

企业级防火墙技术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.安装

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安装包到虚拟机上解压即安装自定义安装目录

下载:
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得到相关目录下才能启动配置环境变量让他能启动

启动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

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

#!/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网站发布目录下的数据清空

rm -rf /opt/tomcat/webapps/*

下载源码包解压 将项目ROOT目录放到网站发布目录下

cp -r ROOT/ /opt/local/tomcat/webapps/

将数据库文件传到Mysql数据库服务器上

scp DB/jspgou.sql 192.168.59.152:jspgou.sql 
scp 源文件位置 目的ip目的位置

编辑安装目录下的jdbc文件进行数据库连接

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文件导入创建的数据库

create databse jspgou default charset=utf8;
grant all on jspgou.* to 'shangyuxian'@'192.168.59.153' identified by 'QianFeng@123';

修改数据库配置文件

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文件导入创建的数据库

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传输下载安装

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文件


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

nginx

安装

准备关闭防火墙和selinux

1.yum install yum-utils

2.创建文件 vim /etc/yum.repos.d/nginx.repo

[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加到一个配置文件里

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

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.创建网站发布目录,并且创建对应的网站

mkdir -p  /1000phone.com/html 

编辑文件写入主页展示的信息 vim /1000phone.com/html/index.html

或者直接echo写入
echo "test" > /1000phone.com/html/index.html

3.重新加载配置文件

nginx -s reload

4.客户端配置路由映射(本地域名解析)

vim /etc/hosts

192.168.59.160 web.testpm.com

192.168.59.160 web.1000phone.com

5.测试访问

curl 域名

curl web.testpm.com
curl web.1000phone.com

基于ip的虚拟主机

1.添加ip地址

图形化添加IPnmtui

最小化添加IPifconfig ens33:1 192.168.59.180

2、配置通过ip区分的虚拟机

 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的端口

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参数

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 配置的是一组被代理的服务器地址+负载均衡算法

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

修改配置文件 加入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

client->nginx proxy ->static
                    ->php+nginx
静态配置
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
**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

两种运行方式的区别:
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页面出现要下载的说明页面没有解析

这里默认的运行方式是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
编辑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测试页面

cat /home/nginx/html/index.php 
<?php
phpinfo();
?>
代理配置
配置nginx反向代理upstream并实现服务器端缓存时间
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 配置主要包括三个区块,结构如下:

 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 配置示例

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
    /

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/

     结论:~ 需要区分大小写。而且目录需要根据大小写定义。
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(条件){执行语句}

判断符号
~                         正则匹配 (区分大小写)
~*                         正则匹配 (不区分大小写)
!~                      正则不匹配 (区分大小写)
!~*                        正则不匹配  (不区分大小写)
-f 和!-f                 用来判断是否存在文件
-d 和!-d                 用来判断是否存在目录
-e 和!-e                 用来判断是否存在文件或目录
-x 和!-x                 用来判断文件是否可执行

全局变量

在匹配过程中可以引用一些Nginx的全局变量

$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地址是否是个目录

if (-d $request_filename){
    ...;
}

匹配访问的地址是否以www开头

if ($host ~* ^www){
    ...;
}

实验80转443端口

1.制作证书

2.nginx配置证书

3.rewrite端口转发

购买公网可用的受信任证书并进行测试

制作CA证书

证书制作
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 申请。

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模板配置不可用注意修改此行

访问:
https://ip

nginx访问控制

nginx -V可以查看有的功能模块

nginx访问控制模块

1.基于ip的访问控制http_access_module

2.基于用户的信任登录http_auth_basic_module

基于ip的访问控制

配置语法

Syntaxallow address | all;
default默认无
Contexthttpserverlocation

Syntaxdeny address | all;
default默认无
Contexthttpserverlocation
===================================================
allow    允许     //ip或者网段
deny     拒绝     //ip或者网段

配置测试

deny all;
allow all;
deny 192.168.59.157
allow 192.168.59.157

vim/etc/nginx/conf.d/access_mod.conf内容如下:

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

网站的某些页面不希望公开,我们希望的是某些特定的客户端可以访问。那么我们可以在访问时要求进行身份认证。

配置语法

Syntaxauth_basic string | off;
defaultauth_basic off;
Contexthttpserverlocation

Syntaxauth_basic_user_file file;
default默认无
Contexthttpserverlocation
file存储用户名密码信息的文件。

配置实例

编辑vim /etc/nginx/conf.d/auth_mod.conf

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加载账号密码文件。

建立口令文件

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

nginx监控****

nginx 提供了 ngx_http_stub_status_module.这个模块提供了基本的监控功能

监控的指标

 Accepts接受、Handled已处理、Requests请求数是一直在增加的计数器

 Active活跃、Waiting等待、Reading、Writing随着请求量而增减

 AcceptsNginx所接受的客户端连接数

 Handled成功的客户端连接数

每秒请求数 -- QPS

 通过持续的 QPS 监控,可以立刻发现是否被恶意攻击或对服务的可用性进行评估。虽然当问题发生时,通过 QPS 不能定位到确切问题的位置,但是他却可以在第一时间提醒你环境可能出问题了

请求处理时间:

 请求处理时间也可以被记录在 access log 中,通过分析 access log统计请求的平均响应时间通过持续观察可以发现上游服务器的问题

指标搜集

检查是否有安装模块

nginx -V

没有此模块 需要重新安装

./configure --with-http_stub_status_module

修改配置文件

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 查看显示信息

参数解释

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

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

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服务器

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管理软件

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通则说明没人使用可以使用

ifconfig lo:0 192.168.26.49/32 随便写,只要在同一个网段就可以

忽略arp广播

 echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

开启路由转发

 echo 2 > /proc/sys/net/ipv4/ip_forword

开启精确的ip地址回包

 echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

lvs部署

两台dr

1.添加vip在真实网卡上添加新加一块网卡或者将ip添加到一个网卡上

ip a a dev ens33 vip/32

2.添加lvs规则

安装ipvsadmin

yum -y install ipvsadmin

创建虚拟服务器,轮询算法

ipvsadm -A -t vip:80 -s rr

采用dr的方式

ipvsadm -a -t vip:80 -r web01:80 -g
ipvsadm -a -t vip:80 -r web02:80 -g

3.查看

ipvsadm -Ln
//测试 
curl vip

高可用部署

1.安装keepalivedmaster和backup

yum -y install keepalived

2.配置keepalived文件

vim /etc/keepalived/keepalived.conf

以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的配置文件

! 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

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
两台
# yum install keepalived -y

三、keepalived 主备配置文件

主备置文件不同处有 state priority


Master配置

# 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配置

# 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同样的脚本

版本一:简单使用:
#!/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自动化运维