# 防火墙 ## 企业级防火墙技术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 ![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地址 图形化添加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 ``` ##### 代理配置 ##### 配置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可默认加密) #### 访问测试 ![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(写)随着请求量而增减  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 ``` ![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和多个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自动化运维