Nginx 技术

news2024/11/18 10:28:12

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. 透明代理

正向代理

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

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

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

反向代理

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

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

  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

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

yum install -y gcc

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

2. 安装 pcre-devel

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

rpm -qa pcre

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

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*

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

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

查看效果

Nginx 反向代理

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

基本代理

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

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

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

条件跳转

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

配置文件

location /eat/ {
    proxy_pass   http://192.168.160.1:8083/; #必须以/结尾
}

location /sleep/ {
    proxy_pass   http://192.168.160.1:8082/;
}

项目启动

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

查看效果

Nginx 负载均衡

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

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

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

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

负载均衡的实现

# 代理服务器
# 设置服务器组
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。

负载均衡的作用

  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 作为 8001,8002 的备份服务器
	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 支持如下六种方式的分配算法,分别是:

算法名称说明案例
轮询默认方式。
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 指令无法保证后端服务器的负载均衡,可能导致有些后端服务器接收到的请求多,有些后端服务器接受的请求少,而且设置后端服务器权重等方法将不起作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/737002.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论文阅读 | UniFormer

UniFormer: Unified Multi-view Fusion Transformer for Spatial-Temporal Representation in Bird’s-Eye-View 文章目录 UniFormer: Unified Multi-view Fusion Transformer for Spatial-Temporal Representation in Bird’s-Eye-View摘要介绍Question: 说了半天这个时空融合…

开放式耳机漏音严重吗?开放式耳机哪个品牌好?

开放式耳机因其不入耳、不伤耳设计,深受大家喜欢,开放式耳机不会对耳朵产生任何物理伤害,也不会影响听觉神经,所以不会出现传统入耳式耳机音质损伤的问题。相信还有部分用户不知道什么是开放式耳机?开放式漏音严重吗&a…

剑指Offer-29-顺时针打印矩阵

剑指Offer-29题 题目描述:顺时针打印矩阵 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 **题解思路:**使用 模拟 的方法 定义四个边界变量表示当前要遍历的边界:上(top)、下(bottom)、左(left)、右(right)&am…

爬取新闻评论数据并进行情绪识别

一、为什么要爬取新闻评论数据并进行情绪识别? 爬取新闻评论数据并进行情绪识别的目的是为了从网页中抓取用户对新闻事件或话题的评价内容,并从中识别和提取用户的情绪或态度,如积极、消极、中立等。爬取新闻评论数据并进行情绪识别有以下几个…

mysql查看引擎、默认引擎、表引擎

文章目录 1、查看mysql 数据库引擎2、查看mysql当前默认的存储引擎3、查看某个表用了什么引擎(在显示结果里参数engine后面的就表示该表当前用的存储引擎):扩展知识:最常使用的2种存储引擎: 1、查看mysql 数据库引擎 命令: SHOW ENGINES 2、查看mysql当…

CPU高速缓存cache分类与查看

cat /sys/devices/system/cpu/cpu0/cache/index0/size #查看L1数据缓存大小 2~4 个时钟周期 cat /sys/devices/system/cpu/cpu0/cache/index1/size #查看L1指令缓存大小 2~4 个时钟周期 cat /sys/devices/system/cpu/cpu0/cache/index2/size #查看 CPU 里的 L2 Cache 的容量大…

PROFINET转ETHERNET/IP网关西门子通讯协议profinet

大家好,今天我们来聊一款令人兴奋的产品——远创智控YC-PN-EIP!它是一款自主研发的 PROFINET 从站功能的通讯网关,可以将 PROFINET网络和ETHERNET/IP 网络连接起来,实现数据传输和交换。但这只是它的基础功能,它还有哪…

定时器中断

背景:使用动态数码管读取光电传感器的值并且显示,因此要使用到定时器,每隔一个阶段进行一次检测并进行中断。 51单片机里的关于中断的寄存器如下: IE – 中断允许控制寄存器 IP – 中断优先级控制寄存器 TMOD – 定时器工作方式寄…

操作系统12:I/O系统的功能、模型、接口及 I/O 设备和设备控制器

目录 1、I/O系统的功能、模型和接口 (1)I/O系统的基本功能 1.1 - 隐藏物理设备的细节 1.2 - 与设备的无关性 1.3 - 提高处理机和I/O设备的利用率 1.4 - 对 I/O 设备进行控制 1.5 - 确保对设备的正确共享 1.6 - 错误处理 (2&#xff…

浅谈用于配电室的内部环境监控系统设计

摘要:配电室是配电系统的重要组成部分,影响着电力用户的用电需求,需要保障其安全、可靠运行。针对配电室内部环境进行了深入分析,设计了一种内部环境监控系统。通过该系统可以采集配电室内部的温度、湿度、液位、SF6气体和烟雾&am…

Unity游戏开发智能巡逻兵

完整资料进入【数字空间】查看——baidu搜索"writebug" 1.1 游戏设计要求: 创建一个地图和若干巡逻兵(使用动画); 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址。即每次确定下一个目标位置,用自己当前位置…

STM32单片机不同型号之间的HAL库代码移植浅谈(代码解析)

在嵌入式系统开发中,STM32HAL库是一种常用的软件开发工具,用于开发STM32系列微控制器的应用程序。由于不同型号的芯片具有不同的硬件架构和外设,因此在将代码移植到不同类型的芯片上时,需要进行一些适配和调整。 首先,…

wps中excel如何实现模糊搜索匹配的内容(可以匹配想要的各种格式)

1,在某一列进行搜索-筛选搜索-如包含“XXX信息XX公司XX”这种格式的。 输入 :信息*公司 (1)选择第一种搜索方式代表寻找符合条件: 包含信息和公司两个关键字, 且信息在前公司在后, 且两个词语之…

SIP 抓包后获取媒体内容备忘(解析RTP)

SIP呼叫并抓包 从网上找免费的sip 软中端, 两个转中端建立呼叫且抓包 详情可以参考 https://blog.csdn.net/liuxingrui4p/article/details/96709136?spm1001.2014.3001.5502 使用wireshark检查SIP flow: 点击Telephony > SIP Flows 打开页面如下…

下一代边缘计算技术在哪里?

扫描文末二维码,立刻免费报名 云网一体,超大规模流量下 边缘云的架构与技术揭秘 伴随超高清视频时代的开启,热点赛事、晚会直播等特殊场景的巨大流量对业务的带宽储备、节点资源、流量调度和安全保障能力提出了新的挑战。 火山引擎边缘云基于…

JUC之十一:CompletableFuture用法详解

JUC之十一:CompletableFuture用法详解 文章目录 JUC之十一:CompletableFuture用法详解一、前言二、CompletableFuture类简介三、功能分类3.1、获取结果3.2、依赖关系3.3、and聚合关系3.4、or聚合关系3.5、并行执行3.6、结果处理 四、方法详解4.1、结果转…

【JavaScript】ES6新特性(5)

16. Promise Promise 是异步编程的一种解决方案,比传统的解决方案回调函数, 更合理和更强大 ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象 指定回调函数方式更灵活易懂解决异步 回调地狱 的问题 16.1 回调地狱 当一个回调函数…

Linux 进程管理与调度

一、前言 本篇文章是对Liunx的进程管理调度的实验过程记录,读者可以通过这篇文章加深对Liunx中进程管理和调度的理解,本文所使用的操作系统为RHEL 8.0版本,为在Vmware workstation中运行的虚拟机。 二、实验目的 ① 掌握linux进程相关操作 ②…

RabbitMQ学习笔记9 TTL死信队列+延迟队列实战

我们去新建一个交换机: 然后我们再用这种方法直接创建一个队列: 点击bind这样我们的交换机和队列就绑定到一起了。 然后我们要新建普通队列,设置过期时间,指定死信交换机。 发布一条消息。 它会把队列传递到死信队列中去。