三、Nginx_11(笔记)

Nginx 技术

Nginx (engine x) 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务

Nginx 是由伊戈尔·赛索耶夫为俄罗斯访问量第二的 Rambler.ru 站点开发的,公开版本1.19.6发布于2020年12月15日。

其将源代码以类 BSD 许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。

Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在 BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上 nginx 的并发能力在同类型的网页服务器中表现较好。

BSD 是“Berkeley Software Distribution”的缩写,意思是“伯克利软件发行版”。显然,BSD 这个名称并不是我们现在所理解的操作系统,而且其原意也并非简单的操作系统,而是一整套软件发行版的统称。

什么是许可协议呢,要介绍什么是许可,当你为你的产品签发许可,你是在让出自己的权利,不过,你仍然拥有版权和专利(如果申请了的话),许可的目的是,向使用你产品的人提供一定的权限。

不管产品是免费向公众分发,还是出售,制定一份许可协议非常有用,否则,对于前者,你相当于放弃了自己所有的权利,任何人都没有义务表明你的原始作者身份,对于后者,你将不得不花费比开发更多的精力用来逐个处理用户的授权问题。

而开源许可协议使这些事情变得简单,开发者很容易向一个项目贡献自己的代码,它还可以保护你原始作者的身份,使你至少获得认可,开源许可协议还可以阻止其它人将某个产品据为己有。以下是开源界的 5 大许可协议:五大开源许可协议分别是 GPL、LGPL、BSD、MIT 和 Apache。

BSD 就是这五种开源协议之一。

代理模式

代理服务技术是一门很古老的技术,是在互联网早期出现就使用的技术。一般实现代理技术的方式就是在服务器上安装代理服务软件,让其成为一个代理服务器,从而实现代理技术。代理本质上是一个服务器,可以类比为一个中介。为了 A 访问到 B,中间插入一个 C,C 就是代理。

常用的代理技术分为

  1. 正向代理
  2. 反向代理
  3. 透明代理

正向代理

正向代理是一个位于客户端目标服务器之间的代理服务器(中间服务器)。为了从目标服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转发请求,将获得的内容返回给客户端。正向代理的情况下,客户端必须要进行一些特殊的设置才能使用。

image-20230806105953458

一般正向代理有如下使用场景:

  1. 科学上网,嗯,懂得都懂
  2. 加速访问服务器,玩过游戏的都会清楚
  3. Cache 缓存作用,会缓存请求信息,如果多次重复请求,不需要访问目标服务器
  4. 客户端访问授权,代理服务器可以设置客户端不能对某些服务器进行访问
  5. 隐藏访问者踪迹,你不知道我是谁,因为对服务器的请求都是代理服务器发出的

反向代理

反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。对于客户端来说,反向代理就相当于目标服务器,只需要将反向代理当作目标服务器一样发送请求就可以了,并且客户端不需要进行任何设置

image-20230806105904658

一般反向代理有如下应有场景:

  1. 负载均衡,将请求平均的分配下去。
  2. 隐藏服务器真实IP地址,你不需要知道的太多
  3. 提高访问速度,还是负载的事情,众人拾柴火焰高
  4. 提高安全保障,可以将部分有害请求拦截

区别:

​ 正向代理:用户装了一个软件访问服务器的东西;

​ 反向代理:服务器装了一个软件来应对客户端的请求信息。

透明代理

透明代理(transparent proxy)的意思是客户端根本不需要知道有代理服务器的存在,它改变你的 request fields(报文),并会传送真实IP,多用于路由器的NAT转发中。注意,加密的透明代理则是属于匿名代理,意思是不用设置使用代理了。

透明代理是一种拦截网络流量的代理方法,采用该方法可将用户所发出数据收集到代理服务器上进行处理,并向使用者发出相应的报文并将结果再发回去。透明代理也称为“隐式代理”(implicit proxy),是安装了代理软件的代理服务器,这种代理不会在客户端任何位置中显式地声明或提示,所有的网络访问请求都会在代理服务器上经过匹配集合(一种抽象的由实际字符串组成的数据集)。

  • 透明代理服务器主要用于网络防火墙保护,这种形式的代理把真正的用户和客户端隐藏起来,并隔绝外部网络和服务器之间只能通过这种代理才能进行访问。
  • 另外,透明代理也可以用于安全性控制,它可以让系统拥有有效的应用程序层访问控制和安全管理机制,能够阻止用户发起有恶意的网络访问,确保网络数据的安全传输。
  • 此外,透明代理还用于实施数据流量控制,它可以在下行方向上做限速,从而能有效降低网络负载,确保系统的稳定性。
  • 同时,透明代理也常用于内容过滤。由于代理服务器能够获取用户所发出的数据,根据网络安全政策可以过滤掉一些恶意或者非法的数据,从而确保网络安全性。

总而言之,透明代理是一种比较高效的代理方式,能够提高系统的安全性和性能,提高网络连接和访问的可靠性,因此受到企业和私人用户的青睐。

安装 Nginx

下面我们在 Linux 下安装 Nginx 软件。

安装前的准备

在安装 nginx 之前我们需要准备好安装 nginx 的安装环境,下面的安装环境根据个人系统环境而定,没有安装的要进行安装。

1. 安装 gcc

首先,安装 nginx 要有 gcc 的环境,先检查电脑是否安装了 gcc。

gcc -v

image-20230806110033513

如果未安装可以使用以下命令进行安装。

yum install -y gcc

gcc 可以编译 C、C++、Ada、Object C和Java等语言(安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境)

2. 安装 pcre-devel

安装第三方库 pcre-devel,首先检查是否安装了 pcre-devel。

rpm -qa pcre

image-20230806110304041

如果未安装,使用命令安装。

yum install -y pcre pcre-devel

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

3. 安装 zlib

zlib 也是一个第三方库,这个库提供了很多种压缩和解压缩方式。nginx 使用 zlib 对 http 包的内容进行 gzip,所以需要安装。

检查是否安装

yum list installed | grep zlib*

image-20230806110348130

如果没有安装,也需要进行安装。

yum install -y zlib zlib-devel

安装好上面的环境我们就可以开始进行正式的 nginx 安装了。

下载 Nginx

  • 可以在 nginx 的官网下载, 下载地址,下载后上传到虚拟机
  • 也可以使用 wget 使用以下命令进行下载

解压 Nginx

这个没什么好说的,通过命令解压就行。

安装 Nginx

进入到 nginx 解压后的文件夹执行命令安装

./configure --prefix=/opt/soft/nginx/  // /opt/soft/nginx/ 指定的安装目录

编译 nginx

make && make install

Nginx 相关命令

进入到安装目录的 sbin 文件夹下

  • 普通启动服务:./nginx
  • 配置文件启动:./nginx -c …/conf/nginx.conf
  • 暴力停止服务:./nginx -s stop
  • 优雅停止服务:./nginx -s quit
  • 检查配置文件:./nginx -t
  • 重新加载配置:./nginx -s reload
  • 查看相关进程:ps -ef | grep nginx

查看效果

image-20230806110416835

Nginx 反向代理

已经在 Linux 中安装成功了,下来我们通过一些案例演示 Nginx 反向代理的效果。

基本代理

步骤一:修改Windows中的hosts域名映射

复制“C:\Windows\System32\drivers\etc\hosts”到桌面,右键记事本打开,在里边加上以下代码保存,然后再复制回去,不要直接修改,会不让保存!

注意:用Notepad++打开,文件可能是只读的,修改一下

image-20230806111222277

注意:C:\Windows\System32\drivers\etc\hosts,将这个目录的文件最好复制一个副本,以免出现错误无法修改

image-20230806110914986

步骤二:修改Nginx中的配置文件

image-20230806110612061

条件跳转

使用 Nginx 反向代理,根据访问的路径跳转到不同端口的服务中。

项目搭建(SpringBoot)

结构

image-20231007150322776

1、一个端口进行反向代理

导入依赖

image-20231007140252119

controller包

image-20231007140411797

配置文件

image-20231007140537180

启动类

image-20231007140444023

index.html

image-20231007140625533

代理修改内容

1、修改Windows中的hosts域名映射;

image-20231007142115712

2、修改Nginx中的配置文件。

image-20231007142219204

注:先停止(./nginx -s quit),修改后,再启动(./nginx)

启动项目

image-20231007142511574

测试结果

1、正常访问

image-20231007142549712

2、代理访问

image-20231007142712118

结果可见,代理成功

用户访问的是虚拟机的ip,虚拟机的再把请求转发给目标服务器(Tomcat)

2、多个端口进行反向代理

配置文件

location /a12/ {
    proxy_pass   http://192.168.160.1:8081/; #必须以/结尾
}
location /b12/ {
    proxy_pass   http://192.168.160.1:8082/;
}

image-20231007144359919

修改配置

在IDEA中想要将项目启动多次,修改配置

image-20231007143520771

修改端口号

image-20231007143615736

启动项目

把一个 SpringBoot 项目分别启动两次,端口号分别是:8083 和 8082。

image-20231007143835909

测试结果

image-20231007144826307

image-20231007144920354

根据条件的不同,去找到不同的服务器上。

Nginx 负载均衡

早期的网站流量和业务功能都比较简单,单台服务器足以满足基本的需求,但是随着互联网的发展,业务流量越来越大并且业务逻辑也跟着越来越复杂,单台服务器的性能及单点故障问题就凸显出来了,因此需要多台服务器进行性能的水平扩展及避免单点故障出现,那么如何将不同用户的请求流量分发到不同的服务器上呢?

这时候我们就要使用到负载均衡,负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行,例如 Web 服务器、FTP 服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

image-20230806115158631

这里面涉及到两个重要的角色分别是“应用集群”和“负载均衡器”。

  • 应用集群:将同一应用部署到多台机器上,组成处理集群,接收负载均衡设备分发的请求,进行处理并返回响应的数据。

    (一群服务器)

  • 负载均衡器:将用户访问的请求根据对应的负载均衡算法,分发到集群中的一台服务器进行处理。(相当于中转站)

    (分发请求者)

负载均衡的实现

修改Nginx中的配置文件

# 代理服务器
# 设置服务器组
upstream loadBalancing {
	server localhost:8001;
	server localhost:8002;
	server localhost:8003;
}
server {
	listen 80;
	server_name dailyblue.com;
		
	location / {
		# loadBalancing 就是服务器组的名称
		proxy_pass http://loadBalancing/;
	}
}
  • upstream:该指令是用来定义一组服务器,它们可以使监听不同端口的服务器,并且也可以是同时监听 TCP 和 Unix socket 的服务器。服务器可以指定不同的权重,默认为1。

  • server:该指令用来指定后端服务器的名称和一些参数,可以使用域名、IP、端口或者 unix socket。

    具体修改

image-20231007150852198

image-20231007150646828

再启动一个端口号为8083的项目

image-20231007151157788

启动

image-20231007151357154

测试结果

image-20231007151453820

image-20231007151505540

image-20231007151528266

注:对于同一个项目启动后,同样的路径,每次请求,会进入不同的服务器中去,从而实现了负载均衡。

负载均衡的作用
  1. 解决服务器的高并发压力,提高应用程序的处理性能。

    (从单一服务器变为多个服务器共同处理请求)

  2. 提供故障转移,实现高可用。

    (对于某个服务器宕机,其他服务器还可以代替工作)

  3. 通过添加或减少服务器数量,增强网站的可扩展性。

    伸缩度变强

  4. 在负载均衡器上进行过滤,可以提高系统的安全性。

    在登录成功之后,通过路由网关进行转发操作。

负载均衡的状态

代理服务器在负责均衡调度中的状态有以下几个:

状态概述
down当前的server暂时不参与负载均衡。
backup预留的备份服务器。
max_fails允许请求失败的次数。
fail_timeout经过 max_fails 次失败后,服务暂停的时间。
max_conns限制最大的接收连接数。
down 状态

将该服务器标记为永久不可用,那么该代理服务器将不参与负载均衡。该状态一般会对需要停机维护的服务器进行设置

upstream loadBalance{
	server localhost:8001 down;
	server localhost:8002;
	server localhost:8003;
}
backup 状态

将该服务器标记为备份服务器,当主服务器不可用时,将用来传递请求。

upstream loadBalance {
	server localhost:8001;
	server localhost:8002;
	# 8003 作为 80018002 的备份服务器
	server localhost:8003 backup;
}
max_fails 状态

max_fails=numer:设置允许请求代理服务器失败的次数,默认为1。

fail_timeout 状态

fail_timeout=time:设置经过 max_fail 次失败后,服务暂停的时间,默认是10秒。

upstream loadBalance {
	server localhost:8001;
	server localhost:8002;
	server localhost:8003 max_fails=3 fail_timeout=15;
}
max_conns 状态

max_conns=number:用来设置代理服务器同时活动链接的最大数量,默认为0,表示不限制,使用该配置可以根据后端服务器处理请求的并发量来进行设置,防止后端服务器被压垮。

负载均衡策略

Nginx 的 upstream 支持如下七种方式的分配算法,分别是:

1、轮询

2、依据 ip 分配方式

3、依据最少连接方式

4、依据最少连接方式

5、依据 URL 分配方式

6、依据响应时间方式

7、随机方式

算法名称说明案例
轮询默认方式,将请求均分给所有的服务器。
weight权重方式。weight=number:用来设置服务器的权重,默认为1,权重数字越大,被分配到请求的几率越大。该权重值主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的,所有此策略比较适合服务器的硬件配置差别比较大的情况。server localhost:8001 weight=1; server localhost:8002 weight=1; server localhost:8003 weight=1;
ip_hash依据 ip 分配方式。当对后端的多台动态应用服务器做负载均衡时,ip_hash 指令能够将某个客户端IP的请求通过哈希算法定位到同一台后端服务器上。upstream loadBalance { ip_hash; server localhost:8001; server localhost:8002; server localhost:8003; }
least_conn依据最少连接方式。把请求转发给连接数较少的后端服务器。upstream loadBalance { least_conn; server localhost:8001; server localhost:8002; server localhost:8003; }
url_hash依据 URL 分配方式。按访问 url 的 hash 结果来分配请求,使每个 url 定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用 url_hash,可以使得同一个 url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再次收到请求,就可以从缓存中读取。upstream loadBalance { hash $request_uri; server localhost:8001; server localhost:8002; server localhost:8003; }
fair依据响应时间方式。fair 采用的不是内建负载均衡使用的均衡算法,而是可以根据页面大小、加载时间长短智能地进行负载均衡。fair 属于第三方模块实现的负载均衡。需要添加 nginx-upstream-fair。upstream loadBalance { fair; server localhost:8001; server localhost:8002; server localhost:8003; }
随机对于以上的分配方式采取随机方式,都有可能。

注意:

使用 ip_hash 指令无法保证后端服务器的负载均衡

  • 可能导致有些后端服务器接收到的请求多,有些后端服务器接受的请求少;
  • 而且设置后端服务器权重等方法将不起作用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值