【Nginx】

学习记录

Nginx

一、Nginx是什么?

Nginx (engine x) 是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的Web和反向代理服务器。第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。Nginx 是一个很强大的高性能 Web 和反向代理服务器,它具有很多非常优越的特性:在连接高并发的情况下,Nginx 是 Apache 服务不错的替代品。

1、 Nginx (“engine x”) 是一个高性能的静态HTTP和反向代理服务器,也是一个 IMAP/POP3/SMTP代理服务器。
2、 第一个公开版本0.1.0发布于2004年10月4日。
3、 其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
4、 官方测试nginx能够支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定。
5、 2011年6月1日,nginx 1.0.4发布。
6、 事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:新浪、网易、腾讯、阿里、土豆网、唯品会、京东、360、优酷等。

二、为什么学习Nginx?

2.1 现实生活中的案例

在这里插入图片描述

2.2 web系统架构变迁中遇到的问题

单体服务架构:
在这里插入图片描述

应用服务集群架构:
在这里插入图片描述

微服务架构
在这里插入图片描述

2.3 如何解决这些问题?

解决的技术方案如下:
1 购买硬件负载均衡服务器,问题是需要花钱,价格不菲。
2 LVS(OSI 七层模型第四层“传输层“),配置LVS复杂,使用难度高。
3 Nginx可以有效解决高并发的问题,那么什么是Nginx呢?

三、Nginx作用

搭建虚拟主机
服务的反向代理
在反向代理中配置集群的负载均衡
在反向代理中配置集群的动静分离

代理服务器根据其代理对象的不同,可以分为正向代理服务器与反向代理服务器。这里的“正”与“反”均是站在客户端角度来说的。

3.1 正向代理

正向代理是对客户端的代理。客户端 C 想要从服务端 S 获取资源,但由于某些原因不能直接访问服务端,而是通过另外一台主机 P 向服务端发送请求。当服务端处理完毕请求后,将响应发送给主机 P,主机 P 在接收到来自服务端的响应后,将响应又转给了客户端 C。此时的主机 P,就称为客户端 C 的正向代理服务器。

客户端在使用正向代理服务器时是知道其要访问的目标服务器的地址等信息的。正向代理服务器是为服务用户(客户端)而架设的主机,与服务端无关,对服务器端透明。
在这里插入图片描述

###示例:温岭朝阳康复医院,nginx正向代理配置
#(前置机)客户端 C 的ip:192.168.2.198 通外网的能访问互联网。
#目标服务器 S 的ip:192.168.2.88 客户端 C 与目标服务器 S 内网相通。
#nginx部署在(前置机)客户端 C。
#java下的tomcat、war包项目部署应用在ip:192.168.2.88(目标服务器S)
#(前置机)客户端 C 百度搜索公网固定ip,地址是不会变的,财政的服务是要设置白名单的。
#百度ip地址:115.201.73.222 找张晓宇颜士森,加白名单。

#前置机192.168.2.198部署nginx,修改nginx-1.16.1\conf\conf.d\tomcat.conf配置文件如下
server {
    listen 9000;
    server_name 192.168.2.198;
	location /eBillHisServer/ {
        proxy_pass http://112.124.241.105:8080/eBillHisServer/;
    }
	location /eBillProvider/ {
        proxy_pass http://223.4.64.54:9000/eBillProvider/;
    }
}

在这里插入图片描述
在这里插入图片描述

3.2 反向代理

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
在这里插入图片描述
在这里插入图片描述

3.3 反向代理之负载均衡

单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,负载分发到不同的版务器,也就是我们所说的负载均衡。
在这里插入图片描述
在这里插入图片描述

3.4 反向代理之动静分离

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
在这里插入图片描述
在这里插入图片描述

四、Nginx下载与安装

4.1 Nginx下载

官网下载Nginx软件http://nginx.org

点击右侧的“download”:
在这里插入图片描述

网址:http://nginx.org/en/download.html
在这里插入图片描述
Nginx 官方提供了三个类型的版本:
Mainline Version:主线版,是最新版,但未经过过多的生产测试。
Stable Version:稳定版,生产环境使用版本。
Legacy Version:老版本。

我们需要下载的是Stable Version稳定版。其中又分为两种版本:
Linux 版与 Windows 版。开发时这两个版本我们都下载。Linux 版用于生产环境,而 Windows 版用于开发测试,选择需要的版本进行下载。

提供nginx百度网盘下载链接:
链接:https://pan.baidu.com/s/15PmoH8-ujtx5JTstmziQbw
提取码:qwer
链接:https://pan.baidu.com/s/15PmoH8-ujtx5JTstmziQbw
提取码:qwer

4.2 Nginx 的源码安装

nginx安装为源码安装,将nignx安装在192.168.164.101 node1虚拟机上。

4.2.1 首先安装Nginx依赖

nginx是C语言开发,建议在linux上运行,本文档使用CentOS7.9作为安装环境。
不安装依赖直接执行./configure后会报错:如何解决?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.gcc

安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gcc。安装编译命令make。安装自动编译命令automake。
yum install -y gcc make automake在这里插入图片描述

2.pcre 正则表达式库

PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 Perl 兼容的正则表达式库。nginx的http模块使用Pcre来解析正则表达式,所以需要在linux上安装Pcre库。
注:pcre-devel是使用pcre开发的一个二次开发库。nginx也需要此库。
yum install -y pcre pcre-devel
在这里插入图片描述

3.zlib 压缩和解压缩

zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库。
yum -y install zlib zlib-devel
在这里插入图片描述

4.Openssl

OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码
算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应
用程序供测试或其它目的使用。
https
nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库。

yum -y install openssl openssl-devel
在这里插入图片描述

5.统一安装依赖环境命令(命令执行后一次性安装所有依赖)

yum -y install gcc make automake pcre pcre-devel zlib zlib-devel openssl openssl-devel
在这里插入图片描述

4.2.2 源码安装Nginx
1.创建存放源文件的文件夹:

首先在目录/opt下创建apps目录,用于存放源文件以及解压后的文件
在这里插入图片描述

2.上传Nginx到步骤/opt/apps创建的目录下

安装lrzsz文件传输上传下载命令:yum -y lrzsz
rz命令把nginx从windows系统下载传输到linux系统:
rz
在这里插入图片描述
补充:
或者直接执行命令下载nginx源码:
sudo curl -0 http://nginx.org/download/nginx-1.20.1.tar.gz

3.解压Nginx

解压nginx,解压到当前目录并查看:
cd /opt/apps
tar -xvf nginx-1.20.1.tar.gz
在这里插入图片描述
在这里插入图片描述

4.nginx解压目录下目录结构与目录文件作用:

进入解压目录查看nginx的目录结构:
在这里插入图片描述
各个目录中存放的文件作用为:
auto:存放 Nginx 自动安装的相关文件
conf:存放 Nginx 服务器配置文件
configure:命令,用于对即将安装的软件的配置,完成makefile 编译文件的生成
contrib:存放由其他机构贡献的文档材料
html:存放 Nginx 欢迎页面
man:manual,手册,存放 Nginx 帮助文档
src:存放 Nginx 源码

5.生成makefile报错处理

进入nginx-1.20.1解压目录,在 Nginx 解压目录下运行 make 命令,用于完成编译。
但此时会给出提示:没有指定目标,并且没有发现编译文件makefile。
在这里插入图片描述
怎么办?如何处理?(配置configure文件参数,生产makefile文件)
编译命令 make 需要根据编译文件 makefile 进行编译,所以在编译之前需要先生成编译文件 makefile。使用 configure 命令可以生成该文件。
那么,configure 命令需要配置些什么参数呢?
使用./configure --help 可以查看到可以使用的参数说明。这些参数可以分为三类:

使用./configure --help 查看使用configure命令需要配置的参数说明:
第一类:基本信息的配置
在这里插入图片描述
–prefix:Nginx 安装目录。注意:安装目录与解压目录不一样
–sbin-path:Nginx 命令文件
–modules-path:Nginx 模块存放路径
–conf-prefix:Nginx 配置文件存放路径
–pid-path:Nginx 的进程 id 文件
–error-log-path:错误日志文件
–http-log-path:http访问日志文件
第二类:默认没有安装,可以指定安装的模块,使用–with开头。Nginx的高扩展性就体现在这里。
在这里插入图片描述
–with_http_ssl_module:https 访问协议需要安装 Http安全连接协议模块 SSL(Secure SocketsLayer,安全套接层)。
注意:在执行过 configure 命令后并不会立即生成安装目录,也不会马上开始安装指定的模块,而仅仅是将命令中指定的参数及默认配置写入到即将要生成的 Makefile文件中。
第三类:默认已经安装,可以指定卸载的模块,使用–without开头。
在这里插入图片描述

6.配置./configure执行命令文件参数,并执行命令

下面是简单配置的命令执行。命令中每一行的最后添加了反斜杠\表示当前命令并未结束,回车不会执行该命令。执行成功后,会给出配置报告。
配置成功后,再次查看 Nginx 解压目录,发现其中多出了一个文件 Makefile。后面的编译就是依靠该文件进行的。

注意:
手动创建client目录:mkdir -p /var/temp/nginx/client
在这里插入图片描述

输入以下内容后在nginx-1.20.1解压目录下回车:

./configure \
--prefix=/usr/local/nginx \
--pid-path=/usr/local/nginx/logs/nginx.pid \
--error-log-path=/usr/local/nginx/logs/error.log \
--http-log-path=/usr/local/nginx/logs/access.log \
--with-http_ssl_module \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi

在这里插入图片描述

7.make编译,make install安装

这是两个命令,make 为编译命令,make install 为安装命
令,可以分别执行。这里使用&&将两个命令连接执行,会在前面命
令执行成功的前提下才会执行第二个命令。

编译与安装:make && make install
在这里插入图片描述

4.3 Nginx目录介绍

安装目录配置由–prefix=/usr/local/nginx
进入到nginx安装目录:cd /usr/local/nginx
查看目录结构:ll
在这里插入图片描述

4.3.1 conf目录

Nginx所有配置文件的目录,极其重要。在该目录中包含一个nginx.conf配置文件。
在这里插入图片描述

4.3.2 html目录

Nginx的默认站点目录。
在这里插入图片描述

4.3.3 logs目录

存放Nginx的日志文件。 access.log error.log nginx.pid

刚安装完nginx,从未启动过nginx的话logs目录下什么都没有。
在这里插入图片描述
只有执行./sbin/nginx启动nginx后,才会出现以下三个文件:
在这里插入图片描述

logs目录下的日志各代表是什么?(作用)
access.log 是:记录正常访问的日志
error.log 是:错误日志
nginx.pid 是:nginx进程id(83325是当前启动nginx的master进程的id)
在这里插入图片描述
linux的ps aux |grep 命令
查看nginx进程状态:ps aux|grep nginx
使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过多的资源等。ps是显示当前状态处于running的进程,grep表示正则化搜索搜索,而ps aux是显示所有进程和其状态

4.3.4 sbin目录

Nginx命令的目录,如Nginx的启动和关闭,都是运行sbin目录下的nginx命令。
在这里插入图片描述在这里插入图片描述

4.4 Nginx启动

4.4.1 关闭防火墙,系统重启后还会启动防火墙,不可以启动nginx

关闭防火墙:systemctl stop firewalld
查看防火墙状态:systemctl status firewalld
在这里插入图片描述

4.4.2 禁用防火墙,系统重启后不会启动防火墙,可以启动nginx

禁用防火墙:systemctl disable firewalld
重启防火墙(1.才会生效):firewall-cmd --reload
禁用防火墙后重启虚拟机(2.才会生效):reboot
查看firewalld是否加入开机自启动:systemctl list-unit-files |grep firewalld
在这里插入图片描述
查看是否加入开机自启动项:systemctl list-unit-files |grep xxx

4.4.3 启动Nginx:运行sbin目录下的nginx命令

nginx启动必须进入到/usr/local/nginx/sbin目录下才能启动:
cd /usr/local/nginx/sbin
启动nginx:./nginx
查看nginx进程状态:ps aux|grep nginx
在这里插入图片描述

4.4.4 测试启动Nginx是否成功

浏览器访问http://192.168.164.101,welcome to nginx说明启动成功。
在这里插入图片描述

4.5 Nginx关闭

如何关闭nginx?有几种方式?

(1).立即停止服务:./nginx -s stop

这种方法比较强硬,无论进程是否在工作,都直接停止进程。
在这里插入图片描述

(2).从容停止服务:./nginx -s quit

这种方法较stop相比就比较温和一些了,需要进程完成当前工作后再停止。
在这里插入图片描述

(3).killall方法杀死进程:killall nginx

直接杀死进程,在上面无效的情况下使用,态度强硬,简单粗暴!

执行killall命令时提示:-bash: killall: command not found
没有killall命令的解决方法,执行如下命令安装就行:yum -y install psmisc
psmisc软件包包含三个帮助管理/proc目录的程序,包含下列程序:
fuser、 killall、pstree和pstree.x11( 到pstree的链接 )
fuser 显示使用指定文件或者文件系统的进程的PID
killall 杀死某个名字的进程,它向运行指定命令的所有进程发出信号
pstree 树型显示当前运行的进程
pstree.x11 与pstree功能相同,只是在退出前需要确认

在这里插入图片描述
在这里插入图片描述

五、Nginx设置成系统开机自启动服务

5.1 nginx在linux系统下设置成开机自启服务

为什么?
nginx必须进入到/usr/local/nginx/sbin目录下才能启动和停止,使用上面的方法启停nginx,每次都要进入安装目录输入命令,尤其是在系统意外重启的时候,让它自动启动的话还得登录它的控制台上,执行可执行文件非常麻烦,非常不方便,可以把nginx安装成脚本。
配置一下systemctl。
systemctl是systemd对应的进程管理命令。
可以在任意位置使用systemctl启动、停止nginx。
systemd是Linux系统最新的初始化系统(init),作用是提高系统的启动速度,尽可能启动较少的进程,尽可能更多进程并发启动。

(1)进到linux系统的服务添加路径

进到linux系统的服务添加路径/usr/lib/systemd/system/下:
cd /usr/lib/systemd/system/

/usr/lib/systemd/system目录自动存放启动文件的配置位置,里面一般包含有XXXXX.service,调用XXXXX.service该文件即可启动该服务。
在这里插入图片描述

(2)建立服务文件nginx.service

在系统服务路径/usr/lib/systemd/system/下新建nginx.service配置文件:
vim nginx.service

编辑配置文件:
注意nginx.service服务配置文件里的配置必须与nginx的安装路径保持一样: /usr/local/nginx/

[Unit]
Description=nginx - high performance web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target

[Unit]Unit区块,服务的说明:
定义与Unit类型无关的通用选项;用于提供unit的描述信息、unit行为及依赖关系等。所以Unit这个板块负责启动顺序与依赖关系。
常用选项:
Description:服务的简单描述;意义性描述;
After:依赖,仅当依赖的服务启动之后再启动自定义的服务单元。定义unit的启动次序;表示当前unit应该晚于哪些unit启动;其功能与Before相反;
[Service]Service区块,定义如何启动当前服务:
service段的常用选项:
服务运行参数的设置
Type=forking是后台运行的形式。由ExecStart所启动的进程生成的一个子进程为主,父进程退出。
ExecStart为服务的具体运行命令。指明启动unit要运行命令或脚本。
ExecReload为重启服务时执行的命令
ExecStop为停止服务时执行的命令
注意:启动、重启、停止命令全部要求使用绝对路径
[Install]区块,服务安装的相关设置,可设置为多用户。定义如何安装这个配置文件,即怎样做到开机启动。
WantedBy字段:表示该服务所在的 Target。
Target的含义是服务组,表示一组服务。WantedBy=multi-user.target指的是,nginx所在的 Target 是multi-user.target。这个设置非常重要,因为执行systemctl enable nginx.service命令时,nginx.service的一个符号链接,就会放在/etc/systemd/system目录下面的multi-user.target.wants子目录之中。
默认的启动 Target 是multi-user.target。在这个组里的所有服务,都将开机启动。这就是为什么systemctl enable命令能设置开机启动的原因。

[Unit]
Description=nginx - high performance web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
在这里插入图片描述

(3)添加执行权限

在系统服务路径/usr/lib/systemd/system下以755的权限保存在/usr/lib/systemd/system目录:
chmod +x nginx.service
在这里插入图片描述

(4)设置nginx开机自启动

查看nginx服务当前状态:systemctl status nginx
Active: inactive (dead),说明nginx服务是关闭的
查看nginx是否设置开机自启动服务:
systemctl list-unit-files|grep nginx
nginx.service disabled,说明nginx没有设置成开机自启服务
在这里插入图片描述
设置开机自启动(在任意目录下执行启动nginx):systemctl enable nginx
查看nginx是否设置开机自启动服务:
systemctl list-unit-files|grep nginx
此时enable,说明nginx已经开启开机自启服务
查看nginx服务当前状态:
systemctl status nginx
dead说明nginx服务是关闭的,此时还没有开启nginx服务
在这里插入图片描述

(5)启动nginx服务

启动nginx服务: systemctl start nginx
查看服务当前状态: systemctl status nginx
Active: active (running),说明nginx服务已经启动
在这里插入图片描述
浏览器访问http://192.168.164.101,welcome to nginx说明nginx服务启动成功。
在这里插入图片描述

(6)重新启动nginx服务

重新启动nginx服务:systemctl restart nginx
在这里插入图片描述

(7)关闭nginx服务

关闭nginx服务:systemctl stop nginx
查看服务当前状态: systemctl status nginx
Active: inactive (dead),说明nginx服务已经关闭
在这里插入图片描述
浏览器访问http://192.168.164.101,无法访问说明nginx已关闭。
在这里插入图片描述

(8)关闭nginx开机自启动

关闭nginx开机自启动:systemctl disable nginx
查看nginx服务当前状态:systemctl status nginx
查看nginx是否设置开机自启动服务:systemctl list-unit-files|grep nginx
nginx.service disabled,说明关闭nginx开机自启服务
在这里插入图片描述

(9)查看所有已启动的服务

查看所有已启动的服务: systemctl list-units --type=service

(10)卸载nginx服务并删除nginx
  1. 关闭nginx服务:systemctl stop nginx
  2. 关闭nginx开机自启动:systemctl disable nginx
    查看nginx服务当前状态:systemctl status nginx
    查看nginx是否设置开机自启动服务:systemctl list-unit-files|grep nginx
    nginx.service disabled,说明关闭nginx开机自启服务
  3. 删除创建client目录:rm -rf /var/temp/nginx/client

补充

5.2 nginx在windows系统下设置成开机自启服务

为什么?
windows下想启动nginx是很简单的,双击nginx.exe,会看到一个黑色的弹窗一闪而过,启动完成。
比如生产环境一家医院的windows系统实际部署用到nginx过程中,会有windows机器死机或者医院停电电脑重启的情况,一但windows死机或windows电脑重启nginx服务就没了。如果服务是你在维护重启电脑后nginx服务会挂掉医院就会找你,你需要手动重新打开?
不存在的,有那时间我去摸摸鱼不香么!
所以思路就是给这台windows服务器的nginx设置成开机自启动的系统服务,然后随windows系统启动。

(1)Nginx在windows64位系统下的开机自启服务

windows下nginx安装非常简单,这里主要讲一下怎么把nginx设置成windows的系统服务。
windows服务器的nginx设置成开机自启动的系统服务随windows系统启动。需要借助“Windows Service Wrapper”这个小工具将nginx做成windows系统服务实现开机启动。
windows有32位和64位,这里以64位为例介绍。

(2)下载文件服务启动执行文件WinSW-x64.exe,并重命名为nginx-service.exe

下载地址https://github.com/winsw/winsw/releases
在这里插入图片描述
(windows64位)WinSW-x64.exe
链接:https://pan.baidu.com/s/1_5SZ5se3Jd_1sHoMWqWc8w
提取码:qwer
链接:https://pan.baidu.com/s/1_5SZ5se3Jd_1sHoMWqWc8w
提取码:qwer

(windows32位)WinSW-x86.exe
链接:https://pan.baidu.com/s/1kmO_N0QZFG2eJsqFuGWQ9g
提取码:qwer
链接:https://pan.baidu.com/s/1kmO_N0QZFG2eJsqFuGWQ9g
提取码:qwer

下载下来后将其复制到nginx根目录,并重命名为nginx-service.exe
在这里插入图片描述

(3)创建配置文件:nginx-service.xml

nginx根目录下,右击“新建”->点击“文本文档”->双击打开”文本文档”复制粘贴nginx-service.xml内容如下:

<service>
	<!-- 服务名 -->
	<id>nginx</id>
	<!-- 显示名称 -->
	<name>Nginx Service</name>
	<!-- 描述 -->
	<description>High Performance Nginx Service</description>
	<logpath>D:\nginx-1.16.1\service-logs\</logpath>
	<log mode="roll-by-size">
		<sizeThreshold>10240</sizeThreshold>
		<keepFiles>8</keepFiles>
	</log>
	<executable>D:\nginx-1.16.1\nginx.exe</executable>
	<startarguments>-p D:\nginx-1.16.1</startarguments>
	<stopexecutable>D:\nginx-1.16.1\nginx.exe</stopexecutable>
	<stoparguments>-p D:\nginx-1.16.1 -s stop</stoparguments>
</service>

在这里插入图片描述
Ctrl + s保存->右击“文本文档”->重命名” nginx-service.xml”

服务日志位置D:\nginx-1.16.1\service-logs</logpath>

在nginx目录下新建一个service-logs文件夹,也就是说nginx-service.xml文件产生的日志放到了service-logs

service-logs文件夹,这是一个服务相关的核心文件,指明了服务名称、显示名称、描述信息、参数信息等。(大家记得把上面的路径换成自己的)

nginx-service.xml
链接:https://pan.baidu.com/s/1mJvBRKDpgoYma-3vrqHPIg
提取码:qwer
链接:https://pan.baidu.com/s/1mJvBRKDpgoYma-3vrqHPIg
提取码:qwer

(4)创建配置文件: nginx-service.exe.config

nginx根目录下,右击“新建”->点击“文本文档”->双击打开”文本文档”复制粘贴nginx-service.exe.config内容如下:

<configuration>  
    <startup>    
        <supportedRuntime version="v2.0.50727" />    
        <supportedRuntime version="v4.0" />  
    </startup>  
    <runtime>    
        <generatePublisherEvidence enabled="false"/>   
    </runtime>
</configuration>

Ctrl + s保存->右击“文本文档”->重命名” nginx-service.exe.config”
在这里插入图片描述
这个文件是为支持NET 4.0 runtime,默认只支持NET 2.0 runtime。

nginx-service.exe.config
链接:https://pan.baidu.com/s/1UfERLq2ILVMD1J9mWs7H4Q
提取码:qwer
链接:https://pan.baidu.com/s/1UfERLq2ILVMD1J9mWs7H4Q
提取码:qwer

(5)完成之后的nginx整体的目录结构

在这里插入图片描述

(6)注册windows64系统下的nginx为系统服务

Win+R cmd ctrl+shift+enter管理员权限打开cmd,cd C:\nginx-1.16.1进入nginx根路径,然后执行命令,
注册系统服务:nginx-service.exe install
如图:
在这里插入图片描述
(注意:以管理员身份运行cmd命令 service.exe install才能安装为系统服务)

(7)查看nginx已安装windows系统服务,启动nginx服务

按Win+R 输入services.msc 回车 启动服务在这里插入图片描述

(8)卸载windows系统下安装的nginx系统服务

卸载删除已注册的系统服务:nginx-service.exe uninstall
在这里插入图片描述

(9)相关命令

注册系统服务:nginx-service.exe install
卸载删除已注册的系统服务:nginx-service.exe uninstall
停止系统服务:nginx-service.exe stop
启动系统服务:nginx-service.exe start
重启系统服务:nginx-service.exe restart

设置开机自启的同时reload将无法使用,只能执行ln-stop.bat关闭服务

既然已经注册为服务了,除了可以手动开启关闭也可以使用dos命令来操作。
启动nginx服务:net start nginx
关闭nginx服务:net stop nginx

六、Nginx配置文件

进入到nginx安装目录下配置文件的所在位置:cd /usr/local/nginx/conf
nginx配置文件为/usr/local/nginx/conf下的nginx.conf文件
在这里插入图片描述

6.1 nginx配置文件的组成部分:

第一部分:全局块
全局块:从配置文件开始到 events 块之间的内容
第二部分:events块
events块:涉及的指令主要影响nginx服务器与用户的网络连接。
工作模式及连接数上限,每个work process可以同时支持的最大连接数等。
这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。
第三部分:http块
http块又包括:http全局块和server块
http全局块
http 全局块配蛋的指今包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等
http server又包括server全局块和location块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
1、server块
最常见的配置是本虚拟机主机的监听配置和本点拟主机的名称或 IP 配置。
2、location 块
一个 server 块可以配置多个 location 块。
这块的主要作用是基于 Nginx 服房器接收到的请求字符串(例如 server_name/uri-string),对虚以主机名称(也可以是 IP 别名)之外的字符用(例如 前面的 /uri-string )进行匹配,对特定的请求进行处理,地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

6.2 第一部分:全局块

全局块:从配置文件开始到 events 块之间的内容
设置nginx整体运行的配置指令:
(1)服务器的用户和用户组
(2)允许生的 worker pocess 数:这是 Nginx 服务器并发处理服务的关键配置worker process值越大,可以支持的并发处理量也就越多,但是会受到硬件软件等设备的制约。
(3)日志存放路径和类型
(4)进程pid存放路径

#全局块

#指定可以运行nginx服务的用户和用户组,只能在全局块配置
#user  nobody;
#nginx进程,一般数值为cpu核数。
worker_processes  1;

#错误日志存放目录
#error_log  logs/error.log; #warn error
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#进程pid存放位置
#pid        logs/nginx.pid;

在这里插入图片描述

6.3 第二部分:events块

#events块

#工作模式及连接数上限
events {
	#单个后台worker process进程的最大并发连接数=1024
    worker_connections  1024;
}

6.4 第三部分:http块

http全局块:
http块是Nginx服务器配置中的重要部分,代理、缓存和日志定义等绝大多数的功能和第三方模块的配置都可以放在这个模块中。

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"';
	
	#nginx访问日志
    #access_log  logs/access.log  main;
	
	#开启高效传输模式
    sendfile        on;
	#激活tcp_nopush参数可以允许把httpresponse header和文件的开始放在一个文件里发布,
	#积极的作用是减少网络报文段的数量
    #tcp_nopush     on;

	#连接超时时间,单位是秒
    #keepalive_timeout  0;
    keepalive_timeout  65;

	#开启gzip压缩功能
    #gzip  on;  
6.4.1 http server全局块
#server块
#server块和“虚拟主机”的概念有密切联系。一个Server就是一个虚拟主机
server {
	#监听端口
    listen       80;
    server_name  localhost;
	
	#编码识别
    #charset koi8-r;

	#日志格式及日志存放路径 /usr/local/nginx/
    #access_log  logs/host.access.log  main;
6.4.2 http location块
    location / {
		#站点根目录,即网站程序存放目录/usr/local/nginx/html
        root   html;
		#首页排序
        index  index.html index.htm;
    }

	#错误页面
    #error_page  404              /404.html;

	#将服务器错误页面重定向到静态页面/50x.html
    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }

	#代理PHP脚本到Apache上监听127.0.0.1:80
    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

	#将PHP脚本传递到正在监听127.0.0.1:9000的FastCGI服务器
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
	#如果Apache的文档根目录与nginx的根目录一致,则拒绝访问.htaccess文件
    #location ~ /\.ht {
    #    deny  all;
    #}
}

七、配置虚拟主机

7.1、虚拟主机介绍

1、什么是虚拟主机???

虚拟主机是一种特殊的软硬件技术,它可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供www服务,这样就可以实现一台主机对外提供多个web服务,每个虚拟主机之间是独立的,互不影响的。

虚拟主机技术是互联网服务器采用的节省服务器硬件成本的技术,虚拟主机技术主要应用于HTTP(Hypertext TransferProtocol,超文本传输协议)服务,将一台服务器的某项或者全部服务内容逻辑划分为多个服务单位,对外表现为多个服务器,从而充分利用服务器硬件资源。

2、Nginx支持三种类型的虚拟主机配置

1 基于IP的虚拟主机
2 基于端口的虚拟主机
3 基于域名的虚拟主机

7.2、基于IP的虚拟主机配置方式

1、需求准备和实现效果
  1. 需求准备:
    一台Linux服务器192.168.164.101
    绑定两个ip:192.168.164.101、192.168.164.102
    访问不同的ip请求不同的html目录,即:
    访问http://192.168.164.101将访问nginx的“html101”目录下html网页
    访问http://192.168.164.102将访问nginx的“html102”目录下html网页
    Linux绑定多IP:Linux操作系统允许绑定多IP。是在一块物理网卡上可以绑定多个lP地址。这样就能够在使用单一网卡的同一个服务器上运行多个基于IP的虚拟主机。但是在绑定多IP时需要将动态的IP分配方式修改为静态的指定IP。

  2. 访问过程流程分析及实现效果图:
    在这里插入图片描述

2、将动态IP修改为静态IP

如何将动态IP修改为静态IP???
进入/etc/sysconfig/network-scripts目录使用network-scripts网络配置:cd /etc/sysconfig/network-scripts
编辑网卡配置文件配置网卡:vim ifcfg-ens33
vim /etc/sysconfig/network-scripts/ifcfg-ens33

在这里插入图片描述

#网络类型
TYPE=“Ethernet”
PROXY_METHOD=“none”
BROWSER_ONLY=“no”
#IP地址获取方式(DHCP|static|none)
BOOTPROTO=“static”
DEFROUTE=“yes”
IPV4_FAILURE_FATAL=“no”
IPV6INIT=“yes”
IPV6_AUTOCONF=“yes”
IPV6_DEFROUTE=“yes”
IPV6_FAILURE_FATAL=“no”
IPV6_ADDR_GEN_MODE=“stable-privacy”
NAME=“ens33”
#网卡名称
DEVICE=“ens33”
#开机启动网卡
ONBOOT=“yes”
#IP地址
IPADDR=192.168.164.101
#子网掩码
NETMAST=255.255.255.0
#网关
GATEWAY=192.168.164.2
#本网卡使用的DNS
DNS1=114.114.114.114
DNS2=8.8.8.8

修改之后:
#IP地址
IPADDR0=192.168.164.101
IPADDR1=192.168.164.102
在这里插入图片描述
Centos7配置完网卡要重启网卡服务:
systemctl restart network

CentOS8重启网卡服务:nmcli c reload ens33

重启Linux(各种发行版都是可以的):reboot

修改Nginx的配置文件完成基于IP的虚拟主机配置

3、Nginx的配置文件nginx.conf主要由6个部分组成:

main:用于进行nginx全局信息的配置
events:用于nginx工作模式的配置
http:用于进行http协议信息的一些配置
server:用于进行服务器访问信息的配置
location:用于进行访问路由的配置
upstream:用于进行负载均衡的配置

4、修改nginx配置文件nginx.conf完成基于IP的虚拟主机配置方式

在这里插入图片描述

5、创建需要的目录和html页面:

进入nginx目录下:cd /usr/local/nginx/
将html目录及其目录下的所有内容拷贝到html128新建目录下:
cp -r html/ html101
cp -r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件
在这里插入图片描述
编辑html101下的index.html页面:vim html101/index.html
修改为Welcome to nginx192.168.164.101!
在这里插入图片描述
将html目录及其目录下的所有内容拷贝到html102新建目录下:
cp -r html/ html102
在这里插入图片描述
编辑html102下的index.html页面:vim html102/index.html
修改为Welcome to nginx192.168.164.102!
在这里插入图片描述

6、重启Nginx服务,测试

重启nginx服务:systemctl restart nginx
在这里插入图片描述

  • 测试:
    1.浏览器访问http://192.168.164.101
    将访问“html101”目录下的html网页,出现:Welcome to nginx192.168.164.101!说明基于IP的虚拟主机配置方式成功。
    在这里插入图片描述
    2.浏览器访问http://192.168.164.102
    将访问“html102”目录下的html网页,出现:Welcome to nginx192.168.164.102!说明基于IP的虚拟主机配置方式成功。
    在这里插入图片描述

7.3、基于端口的虚拟主机配置方式

1、需求准备和实现效果
  1. 需求准备:
    一台Linux服务器192.168.164.101绑定一个ip:192.168.164.101。
    Nginx对提供8888与9999两个端口的监听服务
    请求8888端口则访问html8888目录下的index.html
    请求9999端口则访问html9999目录下的index.html
    访问http://192.168.164.101将访问nginx的“html101”目录下html网页
    访问http://192.168.164.102将访问nginx的“html102”目录下html网页

  2. 访问过程流程分析及实现效果图:
    在这里插入图片描述

2、还原ip设置/etc/sysconfig/network-scripts/ifcfg-ens33

还原IP地址为192.168.164.101:
vim /etc/sysconfig/network-scripts/ifcfg-ens33
在这里插入图片描述
将:
IPADDR0=192.168.164.101
IPADDR1=192.168.164.102
改为
IPADDR=192.168.164.101
在这里插入图片描述
重启网络服务:systemctl restart network

3、修改Nginx的配置文件nginx.conf完成基于端口的虚拟主机配置

修改Nginx的配置文件,修改后的内容如下:
vim /usr/local/nginx/conf/nginx.conf

#一个Server就是一个虚拟主机 基于端口
server {
listen 8888;
#为虚拟机指定IP或者是域名
server_name 192.168.164.101;
#主要配置路由访问信息
location / {
#用于指定访问根目录时,访问虚拟主机的web目录
root html8888;
#在不指定访问具体资源时,默认的展示资源的列表
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#一个Server就是一个虚拟主机
server {
listen 9999;
#为虚拟机指定IP或者是域名
server_name 192.168.164.101;
#主要配置路由访问信息
location / {
#用于指定访问根目录时,访问虚拟主机的web目录
root html9999;
#在不指定访问具体资源时,默认的展示资源的列表
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
在这里插入图片描述

4、创建需要的目录和html页面:

进入nginx目录下:cd /usr/local/nginx/
将html目录及其目录下的所有内容拷贝到html8888新建目录下:cp -r html/ html8888
cp -r /usr/local/nginx/html /usr/local/nginx/html8888
在这里插入图片描述
编辑html8888下的index.html页面:vim html8888/index.html
修改为Welcome to nginx192.168.164.101:8888!
在这里插入图片描述
将html目录及其目录下的所有内容拷贝到html9999新建目录下:
cp -r /usr/local/nginx/html /usr/local/nginx/html9999
编辑html9999下的index.html页面:vim html9999/index.html
修改为Welcome to nginx192.168.164.101:9999!
在这里插入图片描述

5、重启Nginx服务,测试

重启nginx服务:systemctl restart nginx
在这里插入图片描述

  • 测试:
    1.浏览器访问http://192.168.164.101:8888
    将访问“html8888”目录下的html网页,
    出现:Welcome to nginx192.168.164.101:8888!
    说明基于端口的虚拟主机配置方式成功。
    在这里插入图片描述
    2.浏览器访问http://192.168.164.101:9999
    将访问“html8888”目录下的html网页,
    出现:Welcome to nginx192.168.164.101:9999!
    说明基于端口的虚拟主机配置方式成功。
    在这里插入图片描述

7.4、基于域名的虚拟主机配置方式

1、需求准备和实现效果
  1. 需求准备:
    一台Linux服务器192.168.164.101,绑定一个ip:192.168.164.101。
    域名规划:(准备两个域名)
    域名1:www.bjsxt1.cn
    域名2:www.baizhan1.cn
    Nginx配置文件的两个server块分别配置两个域名:
    www.bjsxt1.cn和www.baizhan1.cn
    当访问不同的域名请求不同的html目录,
    即:
    两个域名指向同一个nginx服务器,用户访问不同的域名时显示不同的内容。

  2. 访问过程流程分析及实现效果图:
    在这里插入图片描述

2、修改windows的hosts文件配置域名与ip的映射

文件路径:C:\Windows\System32\drivers\etc\hosts
在这里插入图片描述
hosts文件添加如下内容:
192.168.164.101 node1 www.bjsxt1.cn www.baizhan1.cn
在这里插入图片描述
node1为linux的主机名
如果主机名不是node1修改主机名为node1命令:
sudo hostnamectl set-hostname node1
查看主机名命令:
hostnamectl
hostname
在这里插入图片描述

3、修改Nginx的配置文件nginx.conf完成基于域名的虚拟主机配置方式

修改Nginx的配置文件,修改后的内容如下:
vim /usr/local/nginx/conf/nginx.conf

server {
listen 80;
#为虚拟机指定IP或者是域名
server_name www.bjsxt1.cn;
#主要配置路由访问信息
location / {
#用于指定访问根目录时,访问虚拟主机的web目录
root bjsxt1;
#在不指定访问具体资源时,默认的展示资源的列表
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#一个Server就是一个虚拟主机
server {
listen 80;
#为虚拟机指定IP或者是域名
server_name www.baizhan1.cn;
#主要配置路由访问信息
location / {
#用于指定访问根目录时,访问虚拟主机的web目录
root baizhan1;
#在不指定访问具体资源时,默认的展示资源的列表
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
在这里插入图片描述

4、创建需要的目录和html页面:

1.进入nginx目录下:cd /usr/local/nginx/
将html及其目录下的所有内容拷贝到bjsxt新建目录下:
cp -r html/ bjsxt
cp -r /usr/local/nginx/html /usr/local/nginx/bjsxt1
在这里插入图片描述
编辑bjsxt下的index.html页面:vim bjsxt1/index.html
修改为Welcome to nginx bjsxt1!
在这里插入图片描述
2.将html目录及其目录下的所有内容拷贝到baizhan新建目录下:
cp -r html/ baizhan1
cp -r /usr/local/nginx/html /usr/local/nginx/baizhan1
ll
在这里插入图片描述
编辑baizhan1下的index.html页面:
vim baizhan1/index.html
修改为Welcome to nginx baizhan1!
在这里插入图片描述

5、重启Nginx服务,测试

重启nginx服务:systemctl restart nginx
在这里插入图片描述

  • 测试:
  1. 浏览器访问www.bjsxt1.cn则访问bjsxt1目录下的index.html
    出现:Welcome to nginx bjsxt1!说明基于域名的虚拟主机配置方式成功。
    在这里插入图片描述
  2. 浏览器访问www.baizhan1.cn则访问baizhan1目录下的index.html
    出现:Welcome to nginx baizhan1!说明基于域名的虚拟主机配置方式成功。
    在这里插入图片描述

7.5、(待补充)增加nginx虚拟主机配置文件(conf.d)

1、Linux系统下:nginx配置多个conf文件

配置多个conf文件
我的nginx.conf路径:/etc/nginx/nginx.conf

在 /etc/nginx/下创建 conf.d/,用来存 自定义conf文件

在 nginx.conf 加入神秘代码

有时候我们安装了nginx后发现配置文件只有一个,/etc/nginx/nginx.conf

所有的配置包括虚拟目录也在此文件中配置, 这样当虚拟主机多了管理就有些不方便了,

这是需要我们把配置文件拆分开来,在/etc/nginx/conf.d/ 文件建立对应的域名配置文件,比如 /etc/nginx/conf.d/123.com.conf

怎么配置呢?

只需要在原来文件/etc/nginx/nginx.conf 的http 块下加一句话就可以了:
include /etc/nginx/conf.d/*.conf;
/etc/nginx/nginx.conf完整的代码:
之后就可以把虚拟主机的配置文件写在/etc/nginx/conf.d/目录下了,如123.com.conf

https

https://www.cnblogs.com/ambition26/p/14077773.html

2、Windows系统下:nginx配置多个conf文件

7.6、配置ssl证书,http变为https

(待补充)
现在的网站支持Https几乎是标配功能,Nginx能很好的支持Https功能。Nginx后台需要自动将Http请求转成Https的方式,这样就又能支持Http,又能保证通信安全。

1、前置条件:

在配置https之前请确保下面的步骤已经完成:
(1)服务器已经安装nginx并且通过http可以正常访问。
(2)拥有ssl证书,没有的可以去阿里购买或者免费申请一年。

2、安装Nginx的ssl模块:

(待补充)

八、配置nginx服务的反向代理

8.1 需求准备和实现效果

  1. 需求准备:
    需要使用两台虚拟机:
    192.168.164.101 node1
    192.168.164.102 node2
    Tomcat安装到192.168.164.102环境中,Tomcat服务端口为8080和9090,Nginx安装在192.168.164.101环境中,通过192.168.164.101主机的Nginx反向代理。

  2. 访问过程流程分析及实现效果:
    在这里插入图片描述

8.2 反向代理前提:安装服务环境

反向代理需要安装tomcat,tomcat运行必须要java的jdk环境。
所以先在linux系统IP为192.168.164.102的node2主机安装jdk,再安装tomcat修改端口号。

1.上传JDK和Tomcat软件安装包

rz命令把nginx从windows系统下载传输到linux系统:rz
在这里插入图片描述

链接

jdk
下面给出以.rpm包结尾的jdk-8u221-linux-x64.rpm百度网盘下载链接:
链接:https://pan.baidu.com/s/10khhroDXNoj7tcWajYzHxA
提取码:qwer
链接:https://pan.baidu.com/s/10khhroDXNoj7tcWajYzHxA
提取码:qwer

tomcat
下面给出apache-tomcat-8.5.88.tar.gz下载百度网盘链接:
(如需版本不一致自己去下载所需版本)
链接:https://pan.baidu.com/s/14PQR5GoJiYhCiSGXENGynw
提取码:qwer
链接:https://pan.baidu.com/s/14PQR5GoJiYhCiSGXENGynw
提取码:qwer

2.安装JDK

查看是否安装JDK
java -version 如果显示jdk版本号证明已经安装,不显示,则没有安装

(1)将jdk压缩包传输到linux的/opt/目录下

打开xshell,安装上传下载命令:yum -y install lrzsz
进入到opt目录下:cd /opt/
rz命令上将jdk的rpm包传到linux:rz
在这里插入图片描述
在这里插入图片描述

(2)rpm命令安装当前目录下的jdk

rpm命令安装当前目录下的jdk-8u221-linux-x64.rpm:
rpm -ivh jdk-8u221-linux-x64.rpm
在这里插入图片描述
安装完之后,安装在哪个目录下了???
搜索java安装在了什么目录下:find / -name java
安装后目录在/usr/java/jdk1.8.0_221-amd64/bin/java
在这里插入图片描述
进入到jdk安装目录/usr/java/jdk1.8.0_221-amd64并查看目录结构:
cd /usr/java/jdk1.8.0_221-amd64
ll
在这里插入图片描述
此时查看jdk是否安装成功:java -version
在这里插入图片描述
-bash: /usr/local/java_jdk/jdk1.8.0_131/bin/java: 没有那个文件或目录:没有安装成功!!!

(3)配置环境变量

编辑配置文件/etc/profile:vim /etc/profile
添加以下jdk环境变量:

#自己安装的jdk环境变量配置
#jdk安装路径在/usr/java/jdk1.8.0_221-amd64
export JAVA_HOME=/usr/java/jdk1.8.0_221-amd64
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

在这里插入图片描述
让配置文件生效:source /etc/profile
在这里插入图片描述

(4)查看是否配置成功

查看jdk版本是否安装成功,显示jdk版本号证明已经安装成功:java -version
出现1.8.0_131说明jdk安装成功
输入jps查看当前用户正在运行java虚拟机的pid进程:jps
在这里插入图片描述
javac是java语言编程编译器:javac
在这里插入图片描述
到此,我们已经成功jdk。

3.安装Tomcat
(1)安装tomcat8080,并修改端口号为8080

将opt目录下的apache-tomcat-8.5.88解压到apps目录下并将apache-tomcat-8.5.88重命名为tomcat8080
解压tomcat至apps目录:
tar -zxvf apache-tomcat-8.5.88.tar.gz -C /opt/apps
在这里插入图片描述
将apache-tomcat-8.5.88重命名为tomcat8080:
cd /opt/apps
mv apache-tomcat-8.5.88 tomcat8080
在这里插入图片描述

(2)启动tomcat

进入到tomcat8080的bin目录下:
cd tomcat8080/bin
启动tomcat:./startup.sh
在这里插入图片描述
浏览器访问http://192.168.164.102:8080,出现Apache Tomcat/8.5.88猫说明启动成功。
在这里插入图片描述

(3)修改index.jsp主页为:192.168.164.102:8080

进入到/opt/apps/tomcat8080/webapps/ROOT目录下:
cd /opt/apps/tomcat8080/webapps/ROOT
编辑index.jsp:vim index.jsp
在这里插入图片描述
Apache Tomcat/8.5.88修改为192.168.164.102:8080
将第47行的h1一级标题的内容改为:192.168.164.102:8080
在这里插入图片描述
vim index.jsp修改后,保存退出,进入tomcat的bin目录下执行./shutdown.sh关闭tomcat,./startup.sh重启tomcat
再次浏览器访问http://192.168.164.102:8080,出现192.168.164.102:8080猫说明tomcat配置反向代理之前的准备工作修改成功。
在这里插入图片描述

(4)安装tomcat9090,并修改端口号为9090

将opt目录下的apache-tomcat-8.5.88解压到apps目录下并将apache-tomcat-8.5.88重命名为tomcat9090
解压tomcat至apps目录:
tar -zxvf apache-tomcat-8.5.88.tar.gz -C /opt/apps
在这里插入图片描述
将apache-tomcat-8.5.88重命名为tomcat9090:
cd /opt/apps
mv apache-tomcat-8.5.88 tomcat9090
在这里插入图片描述
进入tomcat9090/conf目录下,编辑server.xml文件,
cd /opt/apps/tomcat9090/conf
vim server.xml
Server port=“8005”,8005端口改为9095端口,不改的话同时启动两个tomcat抛出异常
Connector port="8080"端口改为9090端口
在这里插入图片描述
在这里插入图片描述

(5)启动tomcat

在opt/apps下进入到tomcat9090的bin目录下:
cd tomcat9090/bin
启动tomcat:./startup.sh
在这里插入图片描述
浏览器访问http://192.168.164.102:9090,出现Apache Tomcat/8.5.88猫说明启动成功。
在这里插入图片描述

(6)修改index.jsp主页为:192.168.164.102:9090

进入到/opt/apps/tomcat9090/webapps/ROOT目录下:
cd /opt/apps/tomcat9090/webapps/ROOT
编辑index.jsp:vim index.jsp
在这里插入图片描述
Apache Tomcat/8.5.88修改为192.168.164.102:9090
将第47行的h1一级标题的内容改为:192.168.164.102:9090
在这里插入图片描述
vim index.jsp修改后,保存退出,进入tomcat的bin目录下
cd /opt/apps/tomcat9090/bin
执行关闭tomcat:./shutdown.sh
重启tomcat:./startup.sh
再次浏览器访问http://192.168.164.102:9090,出现192.168.164.102:9090猫说明tomcat配置反向代理之前的准备工作修改成功。
在这里插入图片描述

8.3 配置Nginx实现服务的反向代理

1.修改nginx.conf配置文件:

在安装nginx那台虚拟机192.168.164.101 node1上
修改nginx.conf配置文件:
cd /usr/local/nginx/conf
vim nginx.conf
在这里插入图片描述
修改成如下配置:

http {
    include       mime.types;
    default_type application/octet-stream;
    sendfile       on;
    keepalive_timeout 0;
    upstream tomcat.server1{
    server 192.168.164.102:8080;
   }
    upstream tomcat.server2{
    server 192.168.164.102:9090;
   }  
    server {
        listen       80;
    #为虚拟机指定IP或者是域名
        server_name www.tomcat1.com;
    #主要配置路由访问信息
        location / {
        #用于指定访问根目录时,访问虚拟主机的web目录
            proxy_pass  http://tomcat.server1;
        #在不指定访问具体资源时,默认的展示资源的列表
            index  index.html index.htm;
       }    
        error_page   500 502 503 504 /50x.html;
        location = /50x.html {
            root   html;
       }
   }
    #一个Server就是一个虚拟主机
    server {
        listen       80;
    #为虚拟机指定IP或者是域名
        server_name www.tomcat2.com;
    #主要配置路由访问信息
        location / {
        #用于指定访问根目录时,访问虚拟主机的web目录
            proxy_pass  http://tomcat.server2;
        #在不指定访问具体资源时,默认的展示资源的列表
            index  index.html index.htm;
       }    
        error_page   500 502 503 504 /50x.html;
        location = /50x.html {
            root   html;
       }
   }
}

在这里插入图片描述
浏览器访问的是server块下server_name中的nginx服务名称。

2 修改windows的hosts文件配置域名与ip的映射

文件路径:C:\Windows\System32\drivers\etc\hosts
在这里插入图片描述
hosts文件添加如下内容:
192.168.164.101 node1 www.bjsxt1.cn
www.baizhan1.cn www.tomcat1.com www.tomcat2.com
在这里插入图片描述

node1为linux的192.168.164.101主机名
在这里插入图片描述

3 分别访问,进行测试(反向代理)

重启nginx服务:systemctl restart nginx
两个tomcat必须同时启动,tomcat8080/bin目录下启动./startup.sh,tomcat9090/bin目录下启动./startup.sh

  1. 浏览器访问:的是server块下server_name中的nginx服务名称
    打开浏览器,在windows浏览器地址栏输入地址www.tomcat1.com,跳转到linux192.168.164.102系统tomcat8080主页面中,说明反向代理配置成功。
    在这里插入图片描述
  2. 浏览器访问:的是server块下server_name中的nginx服务名称
    打开浏览器,在windows浏览器地址栏输入地址www.tomcat2.com,跳转到linux192.168.164.102系统tomcat9090主页面中,说明反向代理配置成功。
    在这里插入图片描述

九、配置nginx服务的负载均衡

9.1 什么是负载均衡?

负载均衡,英文名称为Load Balance,是高可用网络基础架构的关键组件,通常用于将工作负载分布到多个服务器来提高网站、应用、数据库或其他服务的性能和可靠性。对于 Web工程中的负载均衡,就是将相同的 Web 应用部署到多个不同的Web 服务器上,形成多个 Web 应用服务器。当请求到来时,由负载均衡服务器负责将请求按照事先设定好的比例向 Web 应用服务器进行分发,从而增加系统的整体吞吐量。

9.2 如何实现负载均衡?

负载均衡可以通过硬件负载均衡器实现,也可通过负载均衡软件实现。

  • 硬件负载均衡
    硬件负载均衡器的性能稳定,且有生产厂商作为专业的服务团队。但其成本很高,一台硬件负载均衡器的价格一般都在十几万到几十万,甚至上百万。知名的负载均衡器有 F5、Array、深信服、梭子鱼等。
  • 软件负载均衡
    软件负载均衡成本几乎为零,基本都是开源软件。
    例如:LVS、HAProxy、Nginx 等。

9.3 Nginx负载均衡3种策略

1.轮询(默认)
每个请求按时间的先后顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2.指定权重
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。权重值越大被访问的几率就越大。

upstream backserver {
 server 192.168.20.101;
 server 192.168.20.102 weight=2;
}

3.IP绑定 ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstream backserver {
    ip_hash;
    server 192.168.20.101;
    server 192.168.20.102;
}

9.4 负载均衡配置

1 需求准备和实现效果
  1. 需求准备:
    (1)该机群包含一台 Nginx 服务器:192.168.164.101 node1,
    (2)两个 Web服务器:192.168.164.102 node2(一台虚拟机node2上通过两个端口启动两个tomcat)
    Tomcat安装到192.168.164.102环境中,Tomcat服务端口为8080和9090,Nginx安装在192.168.164.101环境中,通过192.168.164.101主机的Nginx反向代理.

  2. 访问过程流程分析及实现效果:
    在这里插入图片描述

2 修改nginx.conf配置文件:

在安装nginx那台虚拟机192.168.164.101 node1上
修改nginx.conf配置文件:
vim /usr/local/nginx/conf/nginx.conf
添加配置内容如下:

upstream rss{
    server 192.168.164.102:8080;
    server 192.168.164.102:9090 weight=2;
}
server {
    listen       80;
    server_name  www.bjsxt1.cn;
    location / {
        proxy_pass http://rss/;
    }
}

在这里插入图片描述

#自定义日志格式
#nginx日志日志格式是默认的,先使用默认的记录下来。
log_format  myfmt '$remote_addr - $remote_user
[$time_local] "$request" ';
upstream rss{
 server 192.168.164.102:8080;
 server 192.168.164.102:9090 weight=2;
}
server {
   listen 80;
   server_name www.bjsxt1.cn;
   #为server指定使用myfmt日志格式以及将日志保存
logs/myfmt.log文件中
   access_log   logs/myfmt.log myfmt;
   location / {
   proxy_pass http://rss/;
   }
}
3 访问测试(负载均衡)

重启nginx服务:systemctl restart nginx
两个tomcat必须同时启动,tomcat8080/bin目录下启动./startup.sh,tomcat9090/bin目录下启动./startup.sh

  • 浏览器访问:的是server块下server_name中的nginx服务名称
    打开浏览器,在windows浏览器地址栏输入地址www.bjsxt1.cn,跳转到linux192.168.164.102系统tomcat8080主页面中,浏览器刷新访问地址,跳转到linux192.168.164.102系统tomcat9090主页面中weight=2请求2次,发现已经实现了负载均衡。规律为一次8080两次9090。说明负载均衡配置成功。

中小企业一般使用该方式,优点是配置简单,缺点是如果添加新的后台服务,需要修改Nginx配置文件并且还需重启Nginx。如果后台服务变动比较频繁,而且不希望重启Nginx,可以使用Http动态负载均衡,如何实现Http动态负载均衡,后续会讲到。

9.5 自定义日志格式

1 默认日志配置及路径

默认日志配置
在这里插入图片描述
进入http下请求日志的路径nginx/logs/access.log:
cd /usr/local/nginx/logs/
查看日志:tail -f access.log
浏览器访问server块下server_name中的nginx服务名称www.bjsxt1.cn,
每请求1次就会在/usr/local/nginx/logs/access.log记录一条日志。
在这里插入图片描述

2 如何配置日志

nginx日志格式是默认的,先使用默认的记录下来。然后可以自己设置成不是默认,自定义日志格式

  1. 默认日志格式
    在这里插入图片描述

  2. 自定义日志格式:如何配置日志为myfmt.log???
    #修改日志格式,nginx/logs下的模板文件名为myfmt,只记录这四条日志信息。
    将日志注释掉,只在日志记录四个信息:
    log_format myfmt '$remote_addr - r e m o t e u s e r [ remote_user[ remoteuser[time_local] “$request” ';
    在这里插入图片描述

  3. 如何使用自定义的日志???
    要想使用自定义的日志模板myfmt,在http块把日志配置好之后,必须在server块中把日志放开。
    server块中配置:把访问nginx服务日志的access.logs放在logs/myfmt.log文件中,并把文件模板原来的main改为myfmt。
    在这里插入图片描述
    重启nginx服务,就会在nginx/logs下多出myfmt.log文件。
    查看监控日志myfmt.log:tail -f logs/myfmt.log
    此时浏览器访问www.bjsxt1.cn,就会出现日志
    在这里插入图片描述

  4. 日志干什么用?
    日志可以作为大数据日志服务器,将来需要什么记录什么,不需要的不用记录。

十、Location配置(重点)

1 Location配置参考网址

参考阿里淘宝对外公开的nginx内核优化封装后起名tengine对外开源网址:http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_core_module.html
http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_core_module.html
打开这个网址,找到location。

2 location是用来干什么?

location配置是什么?是当有请求进入nginx时,什么情况下,往哪里转,怎么出去!!!

3 location语法规则

在这里插入图片描述
让我们用一个例子解释上面的说法:
www.bjsxt1.cn
location = / {
[ configuration A ]
}
等号斜杠= /精确匹配
location / {
[ configuration B ]
}
斜杠/最大前缀匹配
location /documents/ {
[ configuration C ]
}
斜杠/加具体内容看谁匹配的多
location ^~ /images/ {
[ configuration D ]
}
上肩号波浪线表示如果它能匹配上,就不走正则
location ~* .(gif|jpg|jpeg)$ {
[ configuration E ]
}
波浪线星号正则的比最大前缀优先级高
#请求“/”匹配配置A,
#请求“/index.html”匹配配置B,
#请求“/documents/document.html”匹配配置C,
#请求“/images/1.gif”匹配配置D,
#请求“/documents/1.jpg”匹配配置E。

4 location配置解析

  • location映射(ngx_http_core_module)
    location [ = | ~ | ~* | ^ ~ ] uri(…)
    location URI{}:对当前路径及子路径下的所有对象都生效
    location = URI{}:注意URI最好为具体路径。精确匹配指定的路径,不包括子路径,因此,只对当前资源生效。
    location ~ URI {}:
    location ~ * URI {}:模式匹配URI,此处的URI可使用正则表达式,~ 区分字符大小写,~ * 不区分字符大小写
    location ^~ URI {}:不使用正则表达式
    优先级: = > ^~ > |* > /|/dir/
    /loghaha.html
    /logheihei.html
    ^/log.*html$
    在这里插入图片描述

5 location配置规则

  • 1.location的执行逻辑跟location的编辑顺序无关。
    矫正:这句话不全对,“ 普通 location ” 的匹配规则是“最大前缀”,因此“普通 location”的确与 location 编辑顺序无关;
  • 2.但是 “正则 location” 的匹配规则是 “顺序匹配,且只要匹配到第一个就停止后面的匹配” ;
  • 3.“普通location”与“正则 location”之间的匹配顺序是? 先匹配普通 location,再“考虑”匹配正则 location。
  • 4.注这里的“考虑”是“可能”的态思,也就是说匹配完 “普通 location” 后,有的时候需要继续匹配 “正则location“ ,有的时候则不需要继续匹配 “正则 location” 。
    不需要继续匹配正则 location,有两种情况下:
    (1)当普通 location 前面指定了 “ ^~ ” (上肩号波浪线表示如果它能匹配上,就不走正则),特别告诉 Nginx 本条普通 location 一旦匹配上,则不需要继续正则匹配。
    (2)当 普通loxation 恰好严格匹配上,不是最大前缀匹配,则不再继续匹配正则。

6 nginx 的 location 总结

(1)nginx 收到请求头: 判定ip,port,hosts决定server
(2)nginx location 匹配:用客户端的uri匹配location的uri

  • 先普通
    -* 顺序无关
    -* 最大前缀
    -* 匹配规则简单
  • 打断:
    -* ^ ~
    -* 完全匹配
  • 再正则
    -* 不完全匹配
    -* 正则特殊性:一条URI可以和多条location匹配上
    -* 有顺序的
    -* 先匹配,先应用,即时退出匹配

(3)请求头

  • host: 决策server负责处理
  • uri: 决策location走哪出去
  • 反向代理: proxy_pass ip:port[uri]

7 nginx负载均衡下的location配置

(1)修改nginx.conf配置文件

在安装nginx那台虚拟机192.168.164.101 node1上
修改nginx.conf配置文件:
vim /usr/local/nginx/conf/nginx.conf
添加配置内容如下:

server {
   listen 80;
   server_name www.bjsxt1.cn;
   access_log  logs/myfmt.log myfmt;
   location / {
       #请求进来往mnt目录下走
       root /mnt;
       autoindex on;
   }
   location /aabb {
      #带上 / 访问该url对应的首页
      proxy_pass http://192.168.164.102:8080/;
      #不带 / 访问的是/opt/apps/tomcat8080/webapps/ROOT下的页面
      #proxy_pass http://192.168.20.102:8080/aabb
   }
}

在这里插入图片描述

(2)重启nginx

重启nginx服务:systemctl restart nginx
node2下的tomcat服务必须是启动状态

(3)访问测试1
  • 访问测试1
    在windows浏览器地址栏访问server块下server_name中的nginx服务名称:www.bjsxt1.cn,此时会跳转到linux192.168.164.101node1的根/路径mnt目录下
    在这里插入图片描述
    发现没有东西。
(4)访问测试2
  • 访问测试2
    此时,将/opt/apps/jdk-8u221-linux-x64.rpm拷贝到/根路径下的mnt目录
    cd /usr/local/nginx
    cp /opt/apps/jdk-8u221-linux-x64.rpm /mnt/
    再次访问:
    在windows浏览器地址栏访问server块下server_name中的nginx服务名称:www.bjsxt1.cn,此时会跳转到linux192.168.164.101node1的根/路径mnt目录下,出现jdk-8u221-linux-x64.rpm并且点击可以下载。
    在这里插入图片描述
    用途:可以做一个简易的下载网站
    将dev下的sr0挂载到mnt下:mount /dev/sr0 /mnt/
    在这里插入图片描述
    取消挂载报错:查看umount后提示信息,目标忙。
    解决:
    yum 安装 fuser:yum install -y psmisc
    查看挂载进程号:fuser -mv /dev/sr0
    杀掉进程:kill -9 16004
    umount取消挂载:umount /dev/sr0
    查看/mnt/目录:**ls -R /mnt/**没有了说明已经取消挂载
    在这里插入图片描述
    将dev下的sr0挂载到mnt/cdrom目录下:
    mkdir -p /mnt/cdrom
    mount /dev/sr0 /mnt/cdrom/
    在这里插入图片描述
    再次访问:
    在windows浏览器地址栏访问server块下server_name中的nginx服务名称:www.bjsxt1.cn,此时会跳转到linux192.168.164.101node1的根/路径mnt目录下,出现cdrom和jdk-8u221-linux-x64.rpm并且cdrom下的packages包,点击可以下载。
    cdrom的packages下有很多rpm包可以下载
    在这里插入图片描述
    在这里插入图片描述
(5)访问测试3
  • 访问测试3
  • 根据nginx,conf下http中server块location配置,浏览器访问http://www.bjsxt1.cn/50x.html,如果程序出现500错误,就会默认跳转到错误提示页面
# error_page   500 502 503 504  /50x.html;
  location = /50x.html {
      root   html;
  }

在这里插入图片描述
浏览器访问http://www.bjsxt1.cn/50x.html,默认跳转到错误提示页面在这里插入图片描述

(6)访问测试4:location下proxy_pass 端口最后带/斜杠
  • 访问测试4:带上 /斜杠 访问该url对应的首页
    新打开一个复制192.168.164.101xshell,监控myfmt.log请求日志信息:
    tail -f /usr/local/nginx/logs/myfmt.log
    浏览器访问:http://www.bjsxt1.cn/aabb,根据nginx,conf下http中server块location配置,带上 /斜杠 访问该url对应的首页,跳转到192.168.164.102:8080/下aabb首页
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
(7)访问测试5:location下proxy_pass 最后不带/斜杠
  • 访问测试5
    新打开一个复制192.168.164.101xshell,监控myfmt.log请求日志信息:
    tail -f /usr/local/nginx/logs/myfmt.log
    在这里插入图片描述
    此时,浏览器访问:http://www.bjsxt1.cn/aabb,根据nginx,conf下http中server块location配置,浏览器访问http://www.bjsxt1.cn/aabb,不带 / 斜杠访问会把/aabb拼接到proxy_pass后,不带 / 访问的是/opt/apps/tomcat8080/webapps/ROOT下的页面。
    会报错404错误。因为/opt/apps/tomcat8080/webapps/ROOT路径下没有aabb。
    在这里插入图片描述
  • 访问测试
    在192.168.164.102node2下的/opt/apps/tomcat8080/webapps/ROOT目录新建aabb文件输入内容aabb page。
    cd /opt/apps/tomcat8080/webapps/ROOT
    vim aabb
    在这里插入图片描述
    浏览器再次访问:http://www.bjsxt1.cn/aabb,根据nginx,conf下http中server块location配置,不带 / 斜杠访问会把/aabb拼接到proxy_pass后,访问的是/opt/apps/tomcat8080/webapps/ROOT下的aabb页面。
    出现aabb page说明location配置成功。
    在这里插入图片描述
(8)访问测试6:location如何配置转到百度?
  • 访问测试6
    新打开一个复制192.168.164.101xshell,监控myfmt.log请求日志信息:
    tail -f /usr/local/nginx/logs/myfmt.log
    修改nginx.conf配置文件如下:
    在这里插入图片描述
    重启nginx服务:systemctl restart nginx
    浏览器访问:http://www.bjsxt1.cn/baidu地址进行测试,根据nginx,conf下http中server块location配置,带上/斜杠访问该url:https://www.baidu.com/对应的首页。
    此时,回车后跳转到百度地址变为:https://www.baidu.com,虽然访问到了百度,但是却是通过重定向的方式,以后发生的事情和我们的服务器就没有半毛钱关系了。
    在这里插入图片描述
    在这里插入图片描述
  • 回车后地址跳转到百度,我们地址不想让它跳走也访问百度怎么办?
    尽量在服务器端跳转,不要在客户端跳转
    修改nginx.conf,将location /baidu下的proxy_pass后面的http改为https,修改后配置如下:
    在这里插入图片描述
    重启nginx服务:systemctl restart nginx
    浏览器访问:http://www.bjsxt1.cn/baidu进行测试,此时,回车后地址跳转到百度,而地址依然是www.bjsxt1.cn/baidu。地址栏没有重定向。
    在这里插入图片描述
    此时,我们的日志监听就变得有意义,将来看通过这个网站搜索百度的人都喜欢干什么,可以分析产生价值。
    在这里插入图片描述
  • 此时再次测试,地址栏没有重定向,但是当我们查询(比如:ssd)时出现404?如何修改配置
    浏览器访问:www.bjsxt1.cn/baidu进行测试,此时,回车后地址跳转到百度,而地址依然是www.bjsxt1.cn/baidu。
    但是当我们搜索框输入ssd,回车后,报错404
    在这里插入图片描述
    在这里插入图片描述
    修改Nginx配置文件如下:
    ~*不区分大小写s.*是查询开头是s的内容
    proxy_pass https://www.baidu.com最后不带斜杠,因为要把/s.*拼接到后面。
    在这里插入图片描述
    重启nginx服务:systemctl restart nginx
    浏览器访问:www.bjsxt1.cn/baidu进行测试,搜索框输入ssd,回车后,正常无报错。
    在这里插入图片描述
    在这里插入图片描述
    但是现在百度也做了相应的设置,就是不想让别人收集它的日志。有时搜索一些关键词的时候就给你跳走了

十一、配置nginx服务的动静分离

1 什么是动静分离?

Nginx动静分离简单来说就是把动态和静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求静态请求分开,可以理解成使用Nginx处理静态请求Tomcat处理动态请求
在这里插入图片描述

  • 动静分离从目前实现方式大致分为两种:
    • 一是纯粹的把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案。
    • 二是动态和静态文件混合在一起发布,通过nginx分开。通过location指定不同的后缀名实现不同的请求转发。

2 如何实现动静分离?动静分离配置

(1)需求准备和实现效果
  1. 需求准备:
    (1)一台 Nginx 服务器:192.168.164.101 node1
    (2)一台 Nginx 服务器:192.168.164.105 node5
    (3)两个 Web服务器:192.168.164.102 node2(一台虚拟机node2上通过两个端口启动两个tomcat)
    Tomcat安装到192.168.164.102环境中,Tomcat服务端口为8080和9090,Nginx安装在192.168.164.101环境中,通过192.168.164.101主机的Nginx动静分离。

  2. 访问过程流程分析及实现效果:
    在这里插入图片描述

(2)修改Tomcat的index.jsp页面
  1. 编辑tomcat8080,进入/opt/apps/tomcat8080/webapps/ROOT/index.jsp页面,修改成如下:
<link rel="stylesheet" type="text/css"
href="/css/index.css">
<img src="/image/logo.jpg" ><br/>
<font class="myfont">from 192.168.164.102:8080</font>

dG删除全部后添加上面的内容,保存并退出。
vim /opt/apps/tomcat8080/webapps/ROOT/index.jsp
在这里插入图片描述
2. 编辑tomcat9090,进入/opt/apps/tomcat9090/webapps/ROOT/index.jsp页面,修改成如下:

<link rel="stylesheet" type="text/css"
href="/css/index.css">
<img src="/image/logo.jpg" ><br/>
<font class="myfont">from 192.168.164.102:9090</font>

vim /opt/apps/tomcat9090/webapps/ROOT/index.jsp
在这里插入图片描述

(3)需要一台新的nginx服务192.168.164.105 node5
  1. 克隆node5并连接
    192.168.164.101关机:init 0
    拍摄快照,克隆一台新的192.168.164.105
    xshell连接后,把新克隆的虚拟机
    添加映射:
    vim /etc/hosts
    ip设置为192.168.164.105:
    vim /etc/sysconfig/network-scripts/ifcfg-ens33
    主机名设置为node5:
    sudo hostnamectl set-hostname node5
    重启虚拟机:
    reboot
    在这里插入图片描述
    xshell连接192.168.164.105 node5。
    因为是克隆的101,所以有nginx服务,不用再安装,直接使用。
  2. node5创建目录并上传静态图片
    在node5服务器上创建目录 /data/image和/data/css,然后将logo.jpg和index.css上传到对应的目录
    在node5服务器上创建目录/data/image和/data/css:
    mkdir -p /data/image /data/css
    然后将logo.jpg和index.css上传到对应的目录。上传logo.jpg到image目录下,上传index.css到css目录:
    cd /data/image
    rz
    cd /data/css
    rz
    查看data目录下的内容:
    ls -R …/data
    在这里插入图片描述
(4)修改192.168.164.105 node5的nginx.conf配置文件:

把静态文件独立成单独的域名,放在独立的服务器node5上
修改虚拟机192.168.164.105 node5上nginx.conf配置文件:
vim /usr/local/nginx/conf/nginx.conf

添加配置内容如下:

server {
   listen  80;
   server_name 192.168.164.105;
   location /image {
   root /data;
   }
   location /css {
   root /data;
   }
}

在这里插入图片描述
重启nginx服务:systemctl restart nginx

(5)修改192.168.164.101 node1的nginx.conf配置文件:

修改虚拟机192.168.164.101 node1上nginx.conf配置文件:
vim /usr/local/nginx/conf/nginx.conf

添加配置内容如下:

upstream rss{
    server 192.168.164.102:8080;
    server 192.168.164.102:9090 weight=2;
    }
server {
   listen 80;
   server_name www.bjsxt1.cn;
   location / {
       proxy_pass http://rss/;
   }
   location /image/ {
       proxy_pass http://192.168.164.105;
   }
   location /css/ {
       proxy_pass http://192.168.164.105;
   }
}

在这里插入图片描述
重启nginx服务:systemctl restart nginx
重启nginx报错:
Job for nginx.service failed because the control process exited with error code. See “systemctl status nginx.service” and “journalctl -xe” for details.
解决:nginx.conf有问题,重新编辑nginx.conf文件,看少了或多了什么东西。
在这里插入图片描述

(6)访问测试(动静分离)

浏览器访问server块下server_name中的nginx服务名称进行测试:浏览器访问www.bjsxt1.cn测试,跳转到linux192.168.164.102系统tomcat8080主页面中,浏览器刷新访问地址,跳转到linux192.168.164.102系统tomcat9090主页面中weight=2请求2次,发现已经实现了负载均衡。规律为一次8080两次9090。说明负载均衡配置成功。

十二、Http动态负载均衡

1、什么是动态负载均衡

在使用的过程中,提供服务的服务器需要添加新的节点时,需要添加新的server配置,然后还需要重启Nginx。

upstream rss{
   server 192.168.164.102:8080;
   server 192.168.164.102:9090 weight=2;
   #添加新的server配置,然后还需要重启Nginx
} 

为什么要动态负载均衡?动态负载均衡有什么优点?
传统的负载均衡,如果Upstream参数发生变化,每次都需要重新加载nginx.conf文件,因此扩展性不是很高,所以我们可以采用动态负载均衡,实现Upstream可配置化、动态化,无需人工重新加载nginx.conf,这类似分布式的配置中心。
在这里插入图片描述
注册中心存放IP地址和端口号,IP区分主机、port区别进程。

2、常用服务注册与发现框架

常见服务发现框架 Consul、Eureka、 ZooKeeper、Etcd ,ZooKeeper是这种类型的项目中历史最悠久的之一,它起源于Hadoop。它非常成熟、可靠,被许多大公司(YouTube、eBay、雅虎等)使用。

Consul是一款开源的分布式服务注册与发现系统,通过HTTP、API可以使得服务注册、发现实现起来非常简单,它支持如下特性:

  • 1 服务注册:服务实现者可以通过HTTP API或DNS方式,将服务注册到Consul。
  • 2 服务发现:服务消费者可以通过HTTP API或DNS方式,从Consul获取服务的IP和PORT。
  • 3 故障检测:支持如TCP、HTTP等方式的健康检查机制,从而当服务有故障时自动摘除。
  • 4 K/V存储:使用K/V存储实现动态配置中心,其使用HTTP长轮询实现变更触发和配置更改。
  • 5 多数据中心:支持多数据中心,可以按照数据中心注册和发现服务,即支持只消费本地机房服务,使用多数据中心集群还可以避免单数据中心的单点故障。
  • 6 Raft算法:Consul使用Raft算法实现集群数据一致性。

3、动态负载均衡实现方案

  • 1 Consul+Consul-template 每次发现配置更改需要raload nginx,重启Nginx。
  • 2 Consul+OpenResty 实现无需raload动态负载均衡 (lua语言,配置文件放字典里面,每隔时间读取)
  • 3 Consul+upsync+Nginx 实现无需raload动态负载均衡 (原理同上) 搭建ConsulServer专门存放负载均衡注册配置信息。nginx间隔时间动态获取最新的ConsulServer配置信息
    在这里插入图片描述
    这里选择第三种Consul+upsync+Nginx动态负载均衡实现方案

4、Consul环境搭建

注意:一定要使用nginx 1.9以上版本!
在这里插入图片描述
Consul是一个网络工具,提供了一个功能齐全的service-mesh控制层,服务发现,配置,和分区。

(1)下载consul_0.7.5_linux_amd64.zip

进入/opt/apps目录:cd /opt/apps/
wget命令下载:
wget https://releases.hashicorp.com/consul/0.7.5/consul_0.7.5_linux_amd64.zip

如果下载太慢,网盘链接下载下来上传到linux,链接地址为:
链接:https://pan.baidu.com/s/1yD6mSF74tfnFsANVZ8dYiw
提取码:qwer
链接:https://pan.baidu.com/s/1yD6mSF74tfnFsANVZ8dYiw
提取码:qwer

(2)安装unzip解压命令

安装unzip解压命令:yum -y install unzip

(3)解压consul_0.7.5_linux_amd64.zip

上传consul_0.7.5_linux_amd64.zip到/opt/apps目录下:rz
在这里插入图片描述
解压consul_0.7.5_linux_amd64.zip:
unzip consul_0.7.5_linux_amd64.zip
在这里插入图片描述
解压后的consul移动到/opt/目录下:mv consul /opt/
进入opt目录:cd /opt/
查看:ll
在这里插入图片描述

(4)测试consul是否可以正常使用

测试consul是否可以正常使用:./consul
在这里插入图片描述

(5)consul启动

consul启动:
./consul agent -dev -ui -node=consul-dev -client=192.168.164.101
在这里插入图片描述

(6)访问测试consul

浏览器访问consul服务:http://192.168.164.101:8500/ui/#/dc1/services,出现以下页面说明consul安装并启动成功
在这里插入图片描述
目前还没有相关服务,还没有往里面加。怎么加?

(7)consul关闭

concul是一个脚本文件
consul关闭:ctrl+c
执行ctrl+c之后,会出现
http: Shutting down http server (192.168.164.101:8500)
在这里插入图片描述
consul关闭:
查出consul启动的进程后,杀死进程:
ps aux|grep consul
kill -9 4677
在这里插入图片描述
浏览器访问:http://192.168.164.101:8500/ui/#/dc1/services,此时是访问不到的。
在这里插入图片描述

(8)方法2:安装consul放在root/bin下任意目录下可以启动consul

上面几步concul是安装在/opt目录下,只能进入到安装目录/opt/下启动concul。如果安装consul放到环境变量root/bin下任意目录下可以启动consul。
查看环境变量:echo $PATH
在这里插入图片描述
/root/目录下创建bin目录:mkdir -p /root/bin
解压consul_0.7.5_linux_amd64.zip:
unzip consul_0.7.5_linux_amd64.zip
解压的consul移动到/root/bin目录下:mv concul /root/bin
在这里插入图片描述
或者把consul移动到/root/bin目录下:mv /opt/consul /root/bin
root/bin下启动concul命令:
consul agent -dev -ui -node=consul-dev -client=192.168.164.101
优点:安装consul放到环境变量root/bin下任意目录下可以启动consul
在这里插入图片描述

5、使用PostMan注册接口

(1)为什么使用PostMan?

浏览器访问consul服务地址传参不方便:http://192.168.164.101:8500/ui/#/dc1/services,打开一个PostMan,通过postman来提交注册consul服务。

(2)PostMan下载

PostMan百度网盘下载链接:
链接:https://pan.baidu.com/s/1RypuPgRqfqGEIF4GiGxq1g
提取码:qwer
链接:https://pan.baidu.com/s/1RypuPgRqfqGEIF4GiGxq1g
提取码:qwer

(3)使用PostMan注册接口

使用PostMan注册接口:http://192.168.164.101:8500/v1/catalog/register
在这里插入图片描述
在这里插入图片描述

(4)postman以json格式注册concul服务
  • 1 postman安装到windows,打开postman,输入账号qq1454413324密码qq123258,点击+加号,选则POST后面输入注册地址:http://192.168.164.101:8500/v1/catalog/register,选择body,row,json格式数据,输入json格式的数据参数1,参数1内容如下:
    #参数1
    {“Datacenter”: “dc1”,“Node”:“tomcat”,
    “Address”:“192.168.164.102”,“Service”:
    {“Id” :“192.168.164.102:8080”, “Service”:
    “toov5”,“tags”: [“dev”], “Port”: 8080}}
{"Datacenter": "dc1","Node":"tomcat",
"Address":"192.168.164.102","Service":
{"Id" :"192.168.164.102:8080", "Service":
"toov5","tags": ["dev"], "Port": 8080}}

点击send发送,返还结果true,说明操作成功
在这里插入图片描述

  • 2 打开postman,点击+加号,选则POST后面输入注册地址:http://192.168.164.101:8500/v1/catalog/register,选择body,row,json格式数据,输入json格式的数据参数2,参数2内容如下:
    参数2
    {“Datacenter”: “dc1”, “Node”:“tomcat”,
    “Address”:“192.168.164.102”,“Service”:
    {“Id” :“192.168.164.102:9090”, “Service”:
    “toov5”,“tags”: [“dev”], “Port”: 9090}}
参数2
{"Datacenter": "dc1", "Node":"tomcat",
"Address":"192.168.164.102","Service":
{"Id" :"192.168.164.102:9090", "Service":
"toov5","tags": ["dev"], "Port": 9090}}

在这里插入图片描述

(5)json格式参数说明:
  • Datacenter指定数据中心
  • Address指定服务IP
  • Service.Id指定服务唯一标识
  • Service.Service指定服务分组
  • Service.tags指定服务标签(如开发环境、测试环境、生产环境等)
  • Service.Port指定服务端口
(6)检查服务是否被注册上:
  1. 检查192.168.164.102:8080服务是否被注册上:
    浏览器访问consul服务:http://192.168.164.101:8500/ui/#/dc1/services,出现toov5,IP地址192.168.164.102,端口8080,说明注册成功。
    在这里插入图片描述
  2. 检查192.168.164.102:9090服务是否被注册上:
    浏览器访问consul服务:http://192.168.164.101:8500/ui/#/dc1/services,出现toov5,IP地址192.168.164.102,端口9090,说明注册成功。
    在这里插入图片描述
    此时concul服务关了之后,服务列表就没了,因为添加的两个tomcat服务没有nginx本地持久化。
(7)PostMan删除注册服务

打开postman,点击+加号,选则DELETE后面输入注册地址:http://192.168.164.101:8500/v1/catalog/register,选择body,row,json格式数据,输入要删除的json格式数据参数
在这里插入图片描述

6、nginx-upsync-module简介

在这里插入图片描述
Upsync是新浪微博开源的基于Nginx实现动态配置的第三方模块。Nginx-Upsync-Module的功能是拉取Consul的后端server的列表,并动态更新Nginx的路由信息。此模块不依赖于任何第三方模块。Consul作为Nginx的DB,利用Consul的KV服务,每个Nginx Work进程独立的去拉取各个upstream的配置,并更新各自的路由。

  • 流程
  • 通过用PostMan工具在consul server添加了两个tomcat服务192.168.164.128:8080和192.168.164.128.9090,如何获取添加的这两个tomcat服务,那就需要upsync定时获取服务信息。
  • 需要提前安装nginx-upsync-module模块,让nginx使用到这个模块,知道这个模块的具体位置。
  • 然后把nginx启动起来,在添加上相关配置,通过upsync从concul server里面拉取服务的列表。

7、nginx-upsync-module安装

Nginx-Upsync-Module的功能是拉取Consul的后端server的列表,并动态更新Nginx的路由信息。

(1)nginx-upsync-module下载

下载nginx-upsync-module命令:
wget https://github.com/weibocom/nginx-upsync-module/archive/master.zip

nginx-upsync-module百度网盘下载链接:
链接:https://pan.baidu.com/s/1D6yvkcKQ6QitQ3spuOwRJQ
提取码:qwer
链接:https://pan.baidu.com/s/1D6yvkcKQ6QitQ3spuOwRJQ
提取码:qwer

(2)nginx-upsync-module解压

nginx和nginx-upsync-module-master必须放在同一台虚拟机服务器上。nginx安装在192.168.164.101,nginx-upsync-module-master也必须安装在192.168.164.101

将nginx-upsync-module下载(或上传)到opt/apps目录下,解压:
unzip master.zip
在这里插入图片描述
在这里插入图片描述

(3)nginx-upsync-module安装

在/opt/下创建upsync目录:mkdir /opt/upsync
将解压后/opt/apps/下的nginx-upsync-module-master移动到/opt/upsync目录下:
mv /opt/apps/nginx-upsync-module-master /opt/upsync
在这里插入图片描述

8、重新配置安装Nginx

重新配置安装Nginx:
1.需要删除之前安装的nginx,删除前做一下文件备份。
2.解压之前需要做配置,创建nginx用户组,创建nginx用户和目录,因为有些插件是需要存放在这些目录的。
3.然后在重新源码解压安装nginx。

(1)彻底删除之前安装的Nginx
先关闭和禁用Nginx服务

关闭nginx服务:systemctl stop nginx
关闭nginx开机自启动:systemctl disable nginx
查看nginx服务当前状态:systemctl status nginx
查看nginx是否设置开机自启动服务:systemctl list-unit-files|grep nginx
在这里插入图片描述

删除之前安装的nginx

#先删除之前创建的/var/temp/nginx/client/目录:rm -rf /var/temp/nginx/

#先将之前安装nginx打包备份,压缩为.tar.gz:
cd /usr/local
tar -zcvf nginx_backup_upsync_pre.tar.gz nginx/

#然后删除安装目录/usr/local/nginx:rm -rf /usr/local/nginx
在这里插入图片描述
#最后删除/opt/apps下nginx-1.20.1.tar.gz的解压目录nginx-1.20.1:
cd /opt/apps/
rm -rf /usr/local/nginx
(因为这个nginx源码解压下的makefile是按以前代码参数配置的要删掉)
在这里插入图片描述

(2)Nginx重新解压、安装、配置
添加nginx用户、用户组、并且设置为伪用户

#添加nginx用户组:groupadd nginx

#添加nginx用户(用户组指定为刚刚创建的用户组nginx,nginx用户并且设置为伪用户):
useradd -g nginx -s /sbin/nologin nginx
-g nginx指定用户组为nginx
-s /sbin/nologin nginx指定nginx用户为伪用户

#查看刚刚添加的用户的信息:id nginx
uid=1004(nginx) gid=10001(nginx) 组=10001(nginx)
在这里插入图片描述

创建/var/temp/nginx/client/目录

#创建/var/temp/nginx/client/目录:mkdir -p /var/temp/nginx/client/
#创建/usr/local/nginx目录:mkdir /usr/local/nginx
在这里插入图片描述

Nginx重新解压

#Nginx重新解压:
cd /opt/apps
tar -zxvf nginx-1.20.1.tar.gz
在这里插入图片描述

Nginx重新配置

#进入解压后的nginx-1.20.1目录重新进行参数预置的配置
cd /opt/apps/nginx-1.20.1
输入以下内容后在nginx-1.20.1解压目录下回车:
./configure
–prefix=/usr/local/nginx
–user=nginx
–group=nginx
–with-http_ssl_module
–with-http_flv_module
–with-http_stub_status_module
–with-http_gzip_static_module
–with-http_realip_module
–http-client-body-temp-path=/var/temp/nginx/client/
–http-proxy-temp-path=/var/temp/nginx/proxy/
–http-fastcgi-temp-path=/var/temp/nginx/fcgi/
–http-uwsgi-temp-path=/var/temp/nginx/uwsgi
–http-scgi-temp-path=/var/temp/nginx/scgi
–with-pcre
–add-module=/opt/upsync/nginx-upsync-module-master

–add-module=/opt/upsync/nginx-upsync-module-master #一定是upsync的解压目录
在这里插入图片描述
配置configure文件参数,回车设置完之后,会生成一个makefile文件

编译与安装

#编译与安装:make&&make install
在这里插入图片描述

启动Nginx开机自启服务,启动Nginx

#启用nginx开机自启动:systemctl enable nginx
#查看nginx是否设置开机自启动服务:systemctl list-unit-files|grep nginx

#启动nginx服务(立即生效):systemctl start nginx
#查看nginx服务当前状态:systemctl status nginx
在这里插入图片描述

测试Nginx是否安装启动成功

浏览器访问http://192.168.164.101/,显示Nginx欢迎页,说明重新安装成功了。
在这里插入图片描述

9、配置Nginx动态负载均衡:

此时重装nginx,已经有了upsync配置,还没有实现动态负载均衡这个功能,要修改nginx配置文件nginx.conf后才可以。

(1)修改nginx配置文件nginx.conf

进入nginx安装目录编辑nginx.conf配置文件:
cd /usr/local/nginx/
vim conf/nginx.conf
在这里插入图片描述
dG,加上两个大括号
Esc,w先保存一下
Esc,:.,$-2d,从光标位置删除到倒数第二行,最后两个大括号留着

uppstream toov5{

}
server {
    listen       80;
    server_name  localhost;
    location / {
        proxy_pass http://toov5;
        index  index.html index.htm;
    }

在这里插入图片描述
怎么通过upstream反向代理配置toov5,实现动态的负载均衡???

upstream{}花括号中里的内容先在notepad++编辑器里面缩进好,内容如下:
#自己虚拟出的 作为监听用的 端口号 固定死的
server 127.0.0.1:11111;
#连接consul server动态获取upstream配置负载均衡信息
#使用192.168.164.101:8500 原生的 他自己虚拟出来的 不要乱改!读取的是toov5 这个分组的!!!
upsync 192.168.164.101:8500/v1/kv/upstreams/toov5
#配置从consul拉取上游服务器配置的超时时间
upsync_timeout=6m
#配置从consul拉取上游服务器配置的间隔时间0.5秒
upsync_interval=500ms
#指定使用consul配置服务器
upsync_type=consul
#配置nginx在启动时是否强制依赖配置服务器,如果配置为on,则拉取配置失败时nginx启动同样失败。
strong_dependency=off;
#动态拉取consulServer相关负载均衡配置信息持久化到硬盘上的指定文件中
upsync_dump_path /usr/local/nginx/conf/servers/servers_test.conf;
在这里插入图片描述
:set paste 然后再输入i,粘贴复制的内容,如果缩进不对其,输入u撤销,多试几次
在这里插入图片描述

(2)创建upsync_dump_path路径下的本地持久化目录

创建/usr/local/nginx/conf/servers/目录,该目录是:由upsync_dump_path路径控制,动态拉取consulServer上游服务器相关负载均衡配置信息持久化到硬盘上指定文件的位置,这样即使consul服务器出问题了,本地还有一个备份。
创建/usr/local/nginx/conf/servers/目录:
mkdir /usr/local/nginx/conf/servers/
在这里插入图片描述

(3)然后启动consul :
  1. 进入/opt/下执行启动consul命令:
    cd /opt/
    ./consul agent -dev -ui -node=consul-dev -client=192.168.164.101
  2. 启动consul报错解决:
    如果在该目录下执行启动consul报错:Starting Consul agent…
    ==> Error starting agent: Failed to start Consul server: Failed to start RPC layer: listen tcp 127.0.0.1:8300: bind: address already in use
    说明consul启动被占用consul正在运行,如果想要重启consul,那就找到该consul进程,杀死该进程,执行启动consul命令即可:
    找到该consul进程:ps aux|grep consul
    杀死该进程:kill -9 4677
    执行启动consul命令:./consul agent -dev -ui -node=consul-dev -client=192.168.164.101
[root@node1 opt]# ./consul agent -dev -ui -node=consul-dev -client=192.168.164.101
==> Starting Consul agent...
==> Error starting agent: Failed to start Consul server: Failed to start RPC layer: listen tcp 127.0.0.1:8300: bind: address already in use
[root@node1 opt]# ps aux|grep consul
root       4677  0.0  1.0  25292 10260 pts/1    Tl   19:50   0:00 ./consul agent -dev -ui -node=consul-dev -client=192.168.164.101
root       4690  0.0  0.0 112824   988 pts/1    R+   19:51   0:00 grep --color=auto consul
[root@node1 opt]# kill -9 4677
[root@node1 opt]# ps aux|grep consul
root       4692  0.0  0.0 112824   988 pts/1    R+   19:51   0:00 grep --color=auto consul
[1]+  已杀死               ./consul agent -dev -ui -node=consul-dev -client=192.168.164.101
[root@node1 opt]# ./consul agent -dev -ui -node=consul-dev -client=192.168.164.101
==> Starting Consul agent...
==> Starting Consul agent RPC...
==> Consul agent running!
           Version: 'v0.7.5'
           Node ID: '83d94d56-0857-2b32-7bea-8e610037c92c'
         Node name: 'consul-dev'

在这里插入图片描述

(4)重启nginx:
  1. nginx.conf配置文件配置完后,重启nginx:
    systemctl restart nginx
    在这里插入图片描述
  2. 重启nginx报错解决:
    如果重启nginx有报错:Job for nginx.service failed because the control process exited with error code. See “systemctl status nginx.service” and “journalctl -xe” for details.
    在这里插入图片描述
    网上找原因说的乱七八糟也没找到,其实就是你刚才配置的配置文件有问题,少了标点分号或多了花括号。怎么办?实在找不到就删了nginx.conf在重新下载一个nginx.conf进行配置就好了。
  3. 重启nginx并访问地址http://192.168.164.101/测试
    新建复制一个xshell192.168.164.101, 此时如果虚拟机192.168.164.102 node2主机的tomcat8080和tomcat9090服务没有开启,浏览器访问http://192.168.164.101/是报错的!!!现在访问Nginx,出现502提示。
    在这里插入图片描述
  4. 启动虚拟机192.168.164.102 node2主机的tomcat8080和tomcat9090服务
    分别修改tomcat8080和tomcat9090的index.jsp页面为FROM 192.168.164.102:8080和FROM 192.168.164.102:9090,然后启动tomcat
    cd /opt/apps/tomcat8080/bin
    ./startup.sh
    cd /opt/apps/tomcat9090/bin
    ./startup.sh
    在这里插入图片描述
    此时,所有准备工作已经好了,下面做动态负载均衡的配置。
(5)动态负载均衡添加

添加nginx Upstream服务开始:

1、方式1:使用linux命令方式发送put请求,添加
  1. 添加192.168.164.102:8080
    在机192.168.164.101 node1主机上,使用linux命令方式发送put请求 添加这个192.168.164.102:8080 到上游服务192.168.164.101:8500consul的toov5上,
    输入命令:
    curl -X PUT http://192.168.164.101:8500/v1/kv/upstreams/toov5/192.168.164.102:8080
    执行后如显示结果true,表示成功。
    在这里插入图片描述
    刷新consul页面:http://192.168.164.101:8500/ui/#/dc1/services,点击KEY/VALUE–>upstream–>toov5–>192.168.164.102:8080。
    此时192.168.164.102:9090服务添加上了。
    点击 DELETE KEY就删除了添加的服务。
    在这里插入图片描述
  2. 添加192.168.164.102:9090
    在机192.168.164.101 node1主机上,使用linux命令方式发送put请求 添加这个192.168.164.102:9090 到上游服务192.168.164.101:8500consul的toov5上,
    输入命令:
    curl -X PUT http://192.168.164.101:8500/v1/kv/upstreams/toov5/192.168.164.102:9090
    执行后如显示结果true,表示成功。
    在这里插入图片描述
    刷新consul页面:http://192.168.164.101:8500/ui/#/dc1/services,点击KEY/VALUE–>upstream–>toov5–>192.168.164.102:9090。此时就添加上了。点击 DELETE KEY就删除了添加的服务
    在这里插入图片描述
2、方式2:使用PostMan添加服务
  1. 使用PostMan添加192.168.164.102:8080服务
    打开postman,输入账号qq1454413324密码qq123258,
    点击+加号,
    选则PUT,
    后面输入注册地址:http://192.168.164.101:8500/v1/kv/upstreams/toov5/192.168.164.102:8080
    点击send,执行后出现ture说明添加成功。
    在这里插入图片描述
  2. 使用PostMan添加192.168.164.102:9090服务
    打开postman,
    点击+加号,
    选则PUT,
    后面输入注册地址:http://192.168.164.101:8500/v1/kv/upstreams/toov5/192.168.164.102:9090
    点击send,执行后出现ture说明添加成功。
    在这里插入图片描述
3、192.168.164.102:9090增加权重配置

如何给192.168.164.102:9090添加权重配置???让http://192.168.164.102:9090对应的服务性能是http://192.
168.164.102:8080对应服务性能的2倍???

访问consul页面:http://192.168.164.101:8500/ui/#/dc1/services,点击KEY/VALUE–>upstream–>toov5–>192.168.164.102:9090。
添加如下内容:
{“weight”:2, “max_fails”:2, “fail_timeout”:10,“down”:0}
添加后点击UPDATE
在这里插入图片描述

4、访问测试:动态负载均衡

服务器中请求192.168.164.101进行测试,刷新浏览器,1次8080,2次9090,发现在两个服务之间来回切换了。说明配置成功。
在这里插入图片描述

10、Nginx动态负载均衡本地持久化文件

动态拉取consulServer上游服务器相关负载均衡配置信息持久化到硬盘上指定文件的位置,这样即使consul服务器出问题了,本地还有一个备份。
192.168.164.101安装nginx的主机上,打开配置文件查看:
cd /usr/local/nginx/conf/servers/
vim /usr/local/nginx/conf/servers/servers_test.conf
在这里插入图片描述

十三、Nginx限流

1、生活中的 “限流”?

限流在生活中亦无处不在,下面例举:
(1)博物馆:限制每天参观总人数以保护文物
(2)高铁安检:有若干安检口,旅客依次排队,工作人员根据安检快慢决定是否放人进去。遇到节
假日,可以增加安检口来提高处理能力(横向拓展),同时增加排队等待区长度(缓存待处理任务)。
(3)办理银行业务:所有人先领号,各窗口叫号处理。每个窗口处理速度根据客户具体业务而定,
所有人排队等待叫号即可。若快下班时,告知客户明日再来(拒绝流量)。
(4)水坝泄洪:水坝可以通过闸门控制泄洪速度(控制处理速度)。
以上"限流"例子,可以让服务提供者稳定的服务客户。

2、为什么需要限流?

系统设计时一般会预估负载,当系统暴露在公网中时,恶意攻击或正常突发流量等都可能导致系统被压垮,而限流就是保护措施之一。限流即控制流量

  • Nginx 的二种限流设置
    • 一是控制速率
    • 二是控制并发连接数

3、如何限流之控制速率

正常限流
ngx_http_limit_req_module 模块提供限制请求处理速率能力,使用了漏桶算法(leaky bucket)。
此模块在哪???
cd /opt/apps/nginx-1.20.1
./configure --help|grep http_limit_req_module
在这里插入图片描述
–without-http_limit_req_module disable ngx_http_limit_req_module
ngx_http_limit_req_module模块默认是安装的,如果不需要,在通过./configure预置的时候给他加上,加上之后就不装了。这个模块提前已经安装过了

3.1 如何限制单个IP的请求处理速率

使用 nginx limit_req_zone 和 limit_req 两个指令,限制单个IP的请求处理速率。
在 nginx.conf http 中添加限流配置,格式:limit_req_zone key zone rate

http {
 limit_req_zone $binary_remote_addr 
 zone=myRateLimit:10m rate=10r/s;
}

配置 server,使用 limit_req 指令应用限流。

server {
   location / {
       limit_req zone=myRateLimit;
       proxy_pass http://my_upstream;
   }
}

limit_req_zone key zone rate 解释:
key:定义限流对象,binary_remote_addr 是一种key,表示基于 remote_addr(客户端IP) 来做限流,binary_ 的目的是压缩内存占用量。
zone:定义共享内存区来存储访问信息, myRateLimit:10m表示一个大小为10M,名字为myRateLimit的内存区域。1M能存储 16000 IP地址的访问信息,10M可以存储16W IP地址访问信息。
rate:用于设置最大访问速率,rate=10r/s 表示每秒最多处理10个请求。Nginx 实际上以毫秒为粒度来跟踪请求信息,因此 10r/s实际上是限制:每100毫秒处理一个请求。这意味着,自上一个请求处理完后,若后续100毫秒内又有请求到达,将拒绝处理该请求。

3.2 处理突发流量 burst、nodelay

上面例子限制 10r/s,如果有时正常流量突然增大,超出的请求将被拒绝,无法处理突发流量,可以结合 burst 参数使用来解决该问题。

server {
    location / {
        limit_req zone=myRateLimit burst=20;
        proxy_pass http://my_upstream;
   }
}

burst 译为突发、爆发,表示在超过设定的处理速率后能额外处理的请求数。当 rate=10r/s 时,将1s拆成10份,即每100ms可处理1个请求。

此处,burst=20 ,若同时有21个请求到达,Nginx 会处理第一个请求,剩余20个请求将放入队列,然后每隔100ms从队列中获取一个请求进行处理。若请求数大于21,将拒绝处理多余的请求,直接返回503。

不过,单独使用 burst 参数并不实用。假设 burst=50 ,rate依然为10r/s,排队中的50个请求虽然每100ms会处理一个,但第50个请求却需要等待 50 *100ms即 5s,这么长的处理时间自然难以接受。因此,burst 往往结合 nodelay 一起使用。

server {
    location / {
        limit_req zone=myRateLimit burst=20 nodelay;
        proxy_pass http://my_upstream;
    }
}

nodelay 针对的是 burst 参数,burst=20 nodelay 表示这20个请求立马处理,不能延迟,相当于特事特办。不过,即使这20个突发请求立马处理结束,后续来了请求也不会立马处理。burst=20 相当于缓存队列中占了20个坑,即使请求被处理了,这20个位置这只能按 100ms一个来释放。这就达到了速率稳定,但突然流量也能正常处理的效果。

4、如何限流之限制连接数

ngx_http_limit_conn_module 模块提供了限制连接数的能力,利用 limit_conn_zone 和 limit_conn 两个指令即可。
此模块在哪???
cd /opt/apps/nginx-1.20.1
./configure --help|grep http http_limit_conn_module
在这里插入图片描述
–without-http_limit_conn_module disable ngx_http_limit_conn_module
http_limit_conn_module模块默认是安装的,如果不需要,在通过./configure预置的时候给他加上,加上之后就不装了。这个模块提前已经安装过了

下面是 Nginx 官方例子:

limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server {
    ...
    limit_conn perip 10;
    limit_conn perserver 100;
}

limit_conn perip 10 作用的 key 是 $binary_remote_addr,表示限制单个IP同时最多能持有10个连接。

limit_conn perserver 100 作用的 key 是 $server_name,表示虚拟主机(server) 同时能处理并发连接的总数。

需要注意的是:只有当 request header 被后端server处理后,这个连接才进行计数。

5、设置白名单

限流主要针对外部访问,内网访问相对安全,可以不做限流,通过设置白名单即可。利用 Nginx ngx_http_geo_module 和ngx_http_map_module 两个工具模块即可搞定。
ngx_http_geo_module和ngx_http_map_module这两个模块默认已经安装:
在这里插入图片描述

在 nginx.conf 的 http 部分中配置白名单:

geo $limit {
    default 1;
   39.100.243.125 0;
   192.168.0.0/24 0;
   172.20.0.35 0;
}
map limit limit_key {
    0 "";
    1 $binary_remote_addr;
}
limit_req_zone $limit_key zone=myRateLimit:10m rate=10r/s;

geo:对于白名单(子网或IP都可以) 将返回0,其他IP将返回1。
map:将limit转换为 limit_key,如果是 $limit 是0(白名单),则返回空字符串;如果是1,则返回客户端实际IP。
limit_req_zone 限流的key不再使用 binary_remote_addr,而是limit_key 来动态获取值。如果是白名单,limit_req_zone 的限流key则为空字符串,将不会限流;若不是白名单,将会对客户端真实IP进行限流。

限制数据传输速度的能力(下载速度):
除限流外,ngx_http_core_module 还提供了限制数据传输速度的能力(即常说的下载速度)。例如:

location /flv/ {
    flv;
    limit_rate_after 20m;
    limit_rate       100k;
}

这个限制是针对每个请求的,表示客户端下载前20M时不限速,后续限制100kB/s。

十四、Nginx原理:Master-Worker

1、Master-Worker模式

  1. Nginx 在启动后,会有一个 master 进程和多个相互独立的 worker 进程。
  2. Master接收来自外界的信号,向各worker进程发送信号,每个进程都有可能来处理这个连接。
  3. Master进程能监控Worker进程的运行状态,当 worker 进程退出后(异常情况下),会自动启动新的 worker 进程。

worker进程在配置文件中体现:vim /usr/local/nginx/conf/nginx.conf
在这里插入图片描述
查看nginx进程:ps aux|grep nginx
在这里插入图片描述
查看nginx进程树master进程和worker进程什么关系:pstree -p
master进程是work进程的父进程在这里插入图片描述

2、accept_mutex

由于所有子进程都继承了父进程的sockfd,那么当连接进来时,所有子进程都将收到通知并“争着”与它建立连接,这就叫“惊群现象”。大量的进程被激活又挂起,只有一个进程可以accept() 到这个连接,这当然会消耗系统资源。Nginx 提供了一个accept_mutex加在accept上的一把共享锁。即每个worker进程在执行accept之前都需要先获取锁,获取不到就放弃执行accept()。有了这把锁之后,同一时刻,就只会有一个进程去accpet(),这样就不会有惊群问题了。

当一个worker进程在accept()这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,完成一个完整的请求。一个请求,完全由worker进程来处理,而且只能在一个worker进程中处理。

3、为什么使用进程不使用线程?

  1. 节省锁带来的开销。每个worker进程都是独立的进程,不共享资源,不需要加锁。同时在编程以及问题查上时,也会方便很多。
  2. 独立进程,减少风险。采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快重新启动新的worker进程。当然,worker进程的也能发生意外退出。

4、如何处理并发请求?

每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发request,并等待请求返回。那么,这个处理的worker不会这么傻等着,他会在发送完请求后,注册一个事件:“如果upstream返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有request 进来,他就可以很快再按这种方式处理。而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。由于web server的工作性质决定了每个request的大部份生命都是在网络传输中,实际上花费在server机器上的时间片不多,这就是几个进程就能解决高并发的秘密所在。

5、一个master和多个worker有什么好处

(1)可以使用 nginx -s reload 热部署,利用nginx进行热部署操作。
(2)每个worker是独立的进程,如果有其中一个worker出现问题,其他worker独立的继续进行争抢,实现请求过程,不会造成服务中断。

十五、Nginx调优:worker_processes、worker_cpu_affinity

1、worker_processes 的设置

1.1 修改worker_processes值

打开 nginx.conf 配置文件,可以看到 worker_processes 的默认值为 1。
vim /usr/local/nginx/conf/nginx.conf
在这里插入图片描述
将worker_processes 1改成2。保存。
在这里插入图片描述
查看nginx进程(1个master进程1个worker进程):
ps aux|grep nginx
在这里插入图片描述
重启nginx之后,查看nginx进程(1个master进程2个worker进程):
systemctl restart nginx
ps aux|grep nginx
在这里插入图片描述

1.2 如何设置worker_processes的值???

worker_processes,工作进程,用于指定 Nginx 的工作进程数量。该值应该设置为多少合适呢?其数值一般设置为 CPU 内核数量,或内核数量的整数倍。注意,现代的 CPU 一般都是多核的,即一块 CPU 中包含多个内核。若当前系统具有 2 块 CPU,而每块 CPU 中包含 2 个内核,那么,worker_processes 的值一般可以设置为 4 或 8。当然,也可以设置为 2。
(一般cpu核数要给操作系统预留一个,cpu核数给Master预留一个)

不过需要注意,该值不仅仅取决于 CPU 内核数量,还与硬盘数
量及负载均衡模式相关。在不确定时可以指定其值为 auto。

2、worker_cpu_affinity 的设置

为了进一步提高系统性能,我们会将 worker 进程与具体的内核进行绑定。该绑定操作是通过 worker_cpu_affinity 属性进行设置的affinity,密切关系。
不过,若指定 worker_processes 的值为auto,则无法设置 worker_cpu_affinity。

该设置是通过二进制进行的。每个内核使用一个二进制位表示,0 代表内核关闭,1 代表内核开启。也就是说,有几个内核,就需要使用几个二进制位。下面通过几个例子来增进对 worker_processes 与 worker_cpu_affinity 的理解。
在这里插入图片描述

worker_processes     4;
worker_cpu_affinity 0001 0010 0100 1000;

十六、Nginx高可用:用keepalived实现

keepalived实现Nginx高可用

1、为什么要学习Keepalived?

如果nginx宕机单点故障,无法为用户提供响应,整个服务器用不了了。
在这里插入图片描述
升级架构:
在这里插入图片描述

2、Keepalived概述

keepalived是集群管理中保证集群高可用的服务软件。
Keepalived的作用是检测服务器的状态,如果有一台服务器宕机或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器(如果是计算机硬件:硬盘、网卡坏了需要人工修复)。

Keepalived 原理:
VRRP协议(虚拟路由冗余协议) - Virtual Router
Redundancy Protocol
在这里插入图片描述

  • keepalived工作在TCP/IP协议栈的IP层,TCP层,及应用层,工作原理基于VRRP协议。
    • 网络层:Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包,(既我们平时用的ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器集群中剔除。
    • 传输层:Keepalived以TCP端口的状态来决定服务器工作正常与否,如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器集群中剔除。
    • 应用层:只要针对应用上的一些探测方式,如URL的get请求,或者对nginx脚本检测等;可以根据用户自定义添加脚本针对特定的服务进行状态检测,当检测结果与用户设定不一致,则把这台服务器从服务器群中剔除。

3、VRRP协议的工作原理和VRRP选举机制

3.1 VRRP协议的工作原理

在这里插入图片描述
VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议是一种容错的主备模式的协议,当网络设备发生故障时,可以不影响主机之间通信情况下进行设备切换,并且相对用户时切换过程时透明的。
一个VRRP路由器有唯一的标识:VRID,范围为0—255。该路由器对外表现为唯一的虚拟MAC地址,地址的格式为00-00-5E-00-01-[VRID]。

同一台路由器可以加入多个备份组,在不同备份组中有不同的优先级,使得该路由器可以在一个备份组中作为主用路由器,在其他的备份组中作为备用路由器。提供了两种安全认证措施:明文认证和IP头认证。

3.2 VRRP选举机制(怎么配置主、备、虚拟IP)
  • 虚拟IP拥有者:如果某台路由器的IP地址与虚拟路由器的VIP地址一致,那么这台就会被选为主路由器。
  • 优先级较高者:如果没有虚拟IP拥有者,优先级数值大的路由器会被选举出,优先级范围0~255。
  • IP地址较大者:如果优先级一样高,IP地址数值大的路由器会被选举出。
    192.168.20.101 192.168.20.105 MASTER

4、keepalived实现Nginx高可用:安装keepalived前的工作

(1)安装前准备
  1. 需求准备:
    1)两台Linux服务器192.168.164.101 node1、192.168.164.105 node5作为负载均衡服务器。
    2)一台Linux服务器192.168.164.102 node2上的tomcat8080和tomcat9090还是RS真实服务器。
    3)修改node2的tomcat8080和tomcat9090上的index.jps,去掉样式和图片,去掉动静分离的干扰。
    vim /opt/apps/tomcat8080/webapps/ROOT/index.jsp
    from 192.168.164.102:8080 tomcat8080
    在这里插入图片描述
    vim /opt/apps/tomcat9090/webapps/ROOT/index.jsp
    from 192.168.164.102:9090 tomcat9090
    在这里插入图片描述
  2. 访问过程流程分析及实现效果图:
(2)分别备份node1、node5主机上nginx的配置文件

因为我们要修改node1和node5主机上nginx的配置文件,修改之前先把配置文件备份一下。

  1. 备份192.168.164.101 node1上nginx的配置文件:
    cp nginx.conf nginx.conf_keepalived_pre
    在这里插入图片描述
  2. 备份192.168.164.105 node5上nginx的配置文件:
    cp nginx.conf nginx.conf_keepalived_pre
    在这里插入图片描述
(3)修改node1上的nginx.conf配置文件
upstream rss {
    server 192.168.164.102:8080;
    server 192.168.164.102:9090 weight=2;
}
server { # check_nginx.sh脚本执行时使用
    listen       80;
    server_name localhost;
    location / {
        root html;
    }
}
server {
    listen       80;
    #虚拟VIP:192.168.164.200
    server_name 192.168.164.200;
    location / {
        proxy_pass http://rss/;
    }
}

在这里插入图片描述

(4)将node1上的nginx.conf配置文件远程拷贝到node5上

备份node5的配置文件nginx.conf。
将node1上上一步(2)修改后的配置文件远程拷贝到node5上。

进入node1的/usr/local/nginx/conf/目录下:
cd /usr/local/nginx/conf/
scp远程拷贝node1的nginx.conf配置文件到node5的当前目录:
scp nginx.conf 192.168.164.105:`pwd`
在这里插入图片描述

(5)在node1的/home/目录下编写check_nginx.sh脚本

进入home目录:
cd /home/
编写check_nginx.sh脚本:
vim check_nginx.sh
check_nginx.sh脚本内容如下:

#!/bin/bash
#要在/usr/local/nginx/html目录下创建check.html
#check.html页面写入:check nginx
#通过访问check.html页面来检查nginx是否宕机

#url访问本机的check.html
url="http://127.0.0.1/check.html"

#通过curl访问url返回一个http_code码
code=`curl -s -o /dev/null -w %{http_code} $url` 

#通过判断相应编码是否是200来确定nginx宕机
#如果code码不等于200,休眠1秒,再次通过curl访问url返回一个http_code码
if [ $code -ne 200 ];then
  sleep 1
  code=`curl -s -o /dev/null -w %{http_code} $url`
  #如果code码还不等于200,说明nginx宕机,直接关闭本机的keepalived
  if [ $code -ne 200 ];then
   #确定nginx是宕机,关闭本机的keepalived
   systemctl stop keepalived
  fi
fi

在这里插入图片描述

给check_nginx.sh脚本添加执行权限:
chmod +x /home/check_nginx.sh
在这里插入图片描述

(6)将node1上的check_nginx.sh脚本远程拷贝到node5上

然后将node1上的/home/check_nginx.sh脚本拷贝到node5上:
scp /home/check_nginx.sh node5:/home/
在这里插入图片描述

(7)分别在node1、node5上/usr/local/nginx/html目录下创建check.html:check nginx
  1. 在node1上的/usr/local/nginx/html目录创建一个check.html,check.html页面内容写入check nginx。
    [root@node1 home]# cd /usr/local/nginx/html
    [root@node1 html]# vim check.html
    check nginx
    在这里插入图片描述
  2. 在node5上的/usr/local/nginx/html目录创建一个check.html,check.html页面内容写入check nginx。
    [root@node1 home]# cd /usr/local/nginx/html
    [root@node1 html]# vim check.html
    check nginx
    在这里插入图片描述
(8)测试check_nginx.sh脚本页面是否可以正常使用
  1. 192.168.164.101 node1主机上,测试check_nginx.sh脚本页面是否可以正常使用
    重启nginx服务:
    systemctl restart nginx
    查看nginx进程:
    ps aux|grep nginx
    检查check_nginx.sh脚本程序的运行:
    sh -x /home/check_nginx.sh
    在这里插入图片描述
    以上提示表示nginx正常提供服务。
    停止nginx服务:
    systemctl stop nginx
    检查check_nginx.sh脚本程序的运行:
    sh -x /home/check_nginx.sh
    在这里插入图片描述
    当停止nginx服务后,脚本运行出现停止keepalived,说明没有问题。因为此时还没有安装keepalived服务,下一步安装keepalived服务。
    + systemctl stop keepalived
    Failed to stop keepalived.service: Unit keepalived.service not loaded.

  2. 192.168.164.105 node5主机上,测试check_nginx.sh脚本页面是否可以正常使用
    重启nginx服务:
    systemctl restart nginx
    查看nginx进程:
    ps aux|grep nginx
    检查check_nginx.sh脚本程序的运行:
    sh -x /home/check_nginx.sh
    在这里插入图片描述
    停止nginx服务:
    systemctl stop nginx
    检查check_nginx.sh脚本程序的运行:
    sh -x /home/check_nginx.sh
    在这里插入图片描述
    当停止nginx服务后,脚本运行出现停止keepalived,说明没有问题。因为此时还没有安装keepalived服务,下一步安装keepalived服务。
    + systemctl stop keepalived
    Failed to stop keepalived.service: Unit keepalived.service not loaded.

5、keepalived实现Nginx高可用:安装keepalived

分别在node1和node5上通过yum安装keepalived服务

(1)node1主机安装keepalived:

[root@node1 html]# yum - y install keepalived
在这里插入图片描述
安装完之后,Linux系统中就会多一个keepalived服务。
查看keepalived是否设置开机自启动服务:
systemctl list-unit-files|grep keepalived
在这里插入图片描述
keepalived.service disabled,说明keepalived没有设置成开机自启服务。

(2)node5主机安装keepalived:

[root@node5 html]# yum -y install keepalived
在这里插入图片描述

(3)安装之后的keepalived.conf配置文件在哪?

查找keepalived.conf配置文件位置:
[root@node1 html]# find / -name keepalived.conf
/etc/keepalived/keepalived.conf
[root@node1 html]#
配置文件在/etc/keepalived/keepalived.conf。
在这里插入图片描述

(4)如何卸载keepalived?

卸载keepalived:yum -y remove keepalived
在这里插入图片描述
查找keepalived服务:find / -name keepalived
在这里插入图片描述

6、keepalived实现Nginx高可用:配置keepalived

分别在node1和node5上配置keepalived服务

(1)node1主机配置keepalived服务

查找keepalived.conf配置文件位置:
[root@node1 html]# find / -name keepalived.conf
/etc/keepalived/keepalived.conf

编辑keepalived.conf配置文件:
[root@node1 ~]# vim /etc/keepalived/keepalived.conf
在这里插入图片描述
keepalived.conf文件内容如下:

! Configuration File for keepalived

global_defs {
   #配置接收邮件的邮箱地址,指定keepalived的backup在发生切换为master时, 需要发送email的邮箱地址,配置的时候一行一个邮箱。
   notification_email {
     qq1454413324@163.com
   }
   
   #指定发件人的邮箱。此邮箱提前就有的。
   notification_email_from 1454413324@qq.com
   #指定发件smtp服务器的ip地址
   smtp_server 192.168.164.1
   #指定当前节点连接smtp服务器的超时时间
   smtp_connect_timeout 30
   #运行keepalived机器的一个标识(此处用node1来标识)
   router_id node1
}

#手动定义一个检查机制(这个机制就是调用我们下面写好的chk_nginx)
vrrp_script chk_nginx { #chk_nginx名称必须与下面配置检查机制中的chk_nginx名称一致。
    #指定检查的脚本文件
    script "/home/check_nginx.sh"
    #每隔2秒检查一次
    interval 2 
    #可以降低权重(原来优先级值为100降低20)
    weight -20
}

vrrp_instance VI_1 {
    #指定实例的初始化状态,两台路由器都启动后,马上会发生竞选。priority优先级高的被选为Master。
    #这里的MASTER并不能代表当前实例一直为MASTER。
    state MASTER
    #当前实例绑定的网卡设备ens33
    interface ens33
    #VRID的标记(0-255)这里id是101
    virtual_router_id 101
    #优先级 该值高的实例优先竞选为MASTER,低的为BACKUP。(此处设置为100)
    priority 100
    #检查间隔,默认为1s
    advert_int 1
    authentication {
        #认证的方式 PASS 或AH
        auth_type PASS
        #认证的密码 1111
        auth_pass 1111
    }
    #指定虚拟ip地址,也是VIP
    virtual_ipaddress {
        #VIP为192.168.164.200/24,指定dev网卡设备ens33,起一个label标记ens33:3
        192.168.164.200/24 dev ens33 label ens33:3
        #192.168.200.17
    }
    #配置检查机制
    track_script {
        #调用上面定义的好的检查机制(VI_1)
        chk_nginx
    }
}
(2)node5主机配置keepalived服务
  1. 将node1上/etc/keepalived/keepalived.conf已经配置好的配置文件,以root身份,拷贝到node5主机的/etc/keepalived/目录下:
    [root@node1 ~]# scp /etc/keepalived/keepalived.conf root@192.168.164.105:/etc/keepalived
    在这里插入图片描述
    登录node5主机的/etc/keepalived/目录查看keepalived.conf 配置文件:
    cat /etc/keepalived/keepalived.conf
    在这里插入图片描述
  2. 修改node5主机/etc/keepalived/keepalived.conf配置文件
    修改node5上keepalived.conf配置文件:
    vim /etc/keepalived/keepalived.conf
    在这里插入图片描述
    修改keepalived.conf的内容如下:
   #运行keepalived机器的一个标识(此处用node1来标识)
   router_id node5
   
   ......
   
    #这里的MASTER并不能代表当前实例一直为MASTER。
    state BACKUP
    #当前实例绑定的网卡设备ens33
    interface ens33
    #VRID的标记(0-255)这里id是101
    virtual_router_id 105
    #优先级 该值高的实例优先竞选为MASTER,低的为BACKUP。(此处设置为100)
    priority 90

7、keepalived实现Nginx高可用:测试keepalived

(1)node2上启动tomcat服务
  1. 启动node2上的两台tomcat服务:tomcat8080和tomcat9090。
    启动tomcat8080服务:
    [root@node2 bin]# cd /opt/apps/tomcat8080/bin
    [root@node2 bin]# ./startup.sh
    启动tomcat9090服务:
    [root@node2 bin]# cd /opt/apps/tomcat9090/bin
    [root@node2 bin]# ./startup.sh
    在这里插入图片描述
(2)node1上启动nginx服务

node1上启动nginx服务
启动nginx服务:systemctl start nginx
查看nginx服务状态:systemctl status nginx
在这里插入图片描述

(3)node1上启动keepalived服务、测试
  1. 启动node1上keepalived
    启动keepalived服务:systemctl start keepalived
    查看keepalived服务状态:systemctl status keepalived
    在这里插入图片描述
    查看网卡信息:ifconfig
    会出现ens33:3网卡信息
    在这里插入图片描述
  2. 测试
    浏览器访问192.168.164.200,根据nginx配置文件的配置,刷新后出现一次8080两次9090。说明tomcat和nginx服务都正常没有问题。
    此时node1上,启动keepalived服务后的这台服务上的nginx为MASTER。
    在这里插入图片描述
  3. node1主机上检查check_nginx.sh脚本程序的运行
    node1上检查check_nginx.sh脚本程序的运行:
    sh -x /home/check_nginx.sh
    在这里插入图片描述
    以上提示表示node1主机上nginx正常提供服务。没有关掉keepalived
  4. 监听查看nginx服务access.log日志
    [root@node1 ~]# tail -f /usr/local/nginx/logs/access.log
    在这里插入图片描述
    access.log日志监听是否每隔2秒get请求/check.html页面,返回http状态码为200(自动检测脚本check_nginx.sh)
  5. 如果此时我们浏览器访问192.168.164.200,再次监听查看nginx服务access.log日志的显示
    [root@node1 ~]# tail -f /usr/local/nginx/logs/access.log
    在这里插入图片描述
    也就说明此台nginx服务是master。
(4)node5上启动nginx服务

启动node5上的nginx服务
启动nginx服务:systemctl start nginx
查看nginx服务状态:systemctl status nginx
在这里插入图片描述

(5)node5上启动keepalived服务、测试
  1. node5上启动keepalived
    启动keepalived服务:systemctl start keepalived
    查看keepalived服务状态:systemctl status keepalived
    在这里插入图片描述
    查看网卡信息:ifconfig
    会出现ens33:3网卡信息
    在这里插入图片描述
  2. node5主机上检查check_nginx.sh脚本程序的运行
    node5上检查check_nginx.sh脚本程序的运行:
    sh -x /home/check_nginx.sh
    在这里插入图片描述
    以上提示表示node5主机上nginx正常提供服务。没有关掉keepalived
  3. 监听查看nginx服务access.log日志
    [root@node5 ~]# tail -f /usr/local/nginx/logs/access.log
    在这里插入图片描述
    access.log日志监听是否每隔2秒get请求/check.html页面,返回http状态码为200(自动检测脚本check_nginx.sh)
(6)node1上停止nignx服务
  1. node1上停止nignx服务
    停止nginx服务:
    systemctl stop nginx

  2. 当停止node1上的nginx服务,再次查看nginx的监听access.log日志,发现access.log日志已经不再增长。
    tail -f /usr/local/nginx/logs/access.log
    在这里插入图片描述

  3. 检查check_nginx.sh脚本程序的运行:
    sh -x /home/check_nginx.sh
    在这里插入图片描述
    当停止nginx服务后,脚本运行出现停止keepalived,说明没有问题。

  4. 查看keepalived服务状态:
    systemctl status keepalived
    发现dead已经停止了
    在这里插入图片描述

  5. 查看网卡服务:ifconfig
    发现已经没有了ens33:3
    在这里插入图片描述

(7)node5上查看nignx、keepalived服务为BACKUP

当我们关闭掉node1的nginx后,也就是node1的nginx-master已经宕掉。
此时查看node5的nignx、keepalived服务服务

  1. 监听查看nginx服务access.log日志
    [root@node5 ~]# tail -f /usr/local/nginx/logs/access.log
    在这里插入图片描述
    access.log日志监听是否每隔2秒get请求/check.html页面,返回http状态码为200(自动检测脚本check_nginx.sh)
  2. 测试
    浏览器访问192.168.164.200,根据nginx配置文件的配置,刷新后出现一次8080两次9090。说明tomcat和nginx服务都正常没有问题。
    node1的nginx宕掉后,此时node5上,keepalived服务上的nginx为BACKUP已经正在使用服务。
    在这里插入图片描述
  3. 如果此时我们浏览器访问192.168.164.200,再次监听查看node5上nginx服务access.log日志的显示
    [root@node1 ~]# tail -f /usr/local/nginx/logs/access.log
    在这里插入图片描述
    也就说明此台nginx服务是backup。
(8)node1上再次启动nignx、keepalived服务变为MASTER
  1. 再次重新启动node1上的nginx、keepalived服务
    启动nginx服务:systemctl restart nginx
    启动keepalived服务:systemctl start keepalived
    在这里插入图片描述
  2. 关闭node5上的nginx:
    [root@node5 ~]# systemctl stop nginx
    查看node5上keepalived服务:
    [root@node5 ~]# systemctl status keepalived
    显示dead此时服务已经关闭
    在这里插入图片描述
  3. 测试:重启node1上的nginx,关掉node5上nginx。
    浏览器访问192.168.164.200,根据nginx配置文件的配置,刷新后出现一次8080两次9090。说明tomcat和nginx服务都正常没有问题。
    node5的nginx宕掉后,此时node1上,keepalived服务上的nginx为MASTER已经正在使用服务。
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值