Nginx一网打尽:动静分离、压缩、缓存、黑白名单、跨域、高可用、防盗链、SSL、性能优化

引言
一、性能怪兽-Nginx概念深入浅出
二、Nginx环境搭建
三、Nginx反向代理-负载均衡
四、Nginx动静分离
五、Nginx资源压缩
六、Nginx缓冲区
七、Nginx缓存机制
八、Nginx实现IP黑白名单
九、Nginx跨域配置
十、Nginx防盗链设计
十一、Nginx大文件传输配置
十二、Nginx配置SLL证书
十三、Nginx的高可用
十四、Nginx性能优化
十五、放在最后的结尾
引言
早期的业务都是基于单体节点部署,由于前期访问流量不大,因此单体结构也可满足需求,但随着业务增长,流量也越来越大,那么最终单台服务器受到的访问压力也会逐步增高。时间一长,单台服务器性能无法跟上业务增长,就会造成线上频繁宕机的现象发生,最终导致系统瘫痪无法继续处理用户的请求。

“从上面的描述中,主要存在两个问题:①单体结构的部署方式无法承载日益增长的业务流量。②当后端节点宕机后,整个系统会陷入瘫痪,导致整个项目不可用。
因此在这种背景下,引入负载均衡技术可带来的收益:

「系统的高可用:」 当某个节点宕机后可以迅速将流量转移至其他节点。
「系统的高性能:」 多台服务器共同对外提供服务,为整个系统提供了更高规模的吞吐。
「系统的拓展性:」 当业务再次出现增长或萎靡时,可再加入/减少节点,灵活伸缩。
OK~,既然引入负载均衡技术可给我们带来如此巨大的好处,那么又有那些方案可供选择呢?主要有两种负载方案,「「硬件层面与软件层面」」 ,比较常用的硬件负载器有A10、F5等,但这些机器动辄大几万乃至几十万的成本,因此一般大型企业会采用该方案,如银行、国企、央企等。而成本有限,但依旧想做负载均衡的项目,那么可在软件层面实现,如典型的Nginx等,软件层的负载也是本文的重点,毕竟Boss们的准则之一就是:「「能靠技术实现的就尽量不花钱。」」

“当然,如果你认为本文对你而言有帮助,记得点赞、收藏、关注三连噢!
一、性能怪兽-Nginx概念深入浅出
Nginx是目前负载均衡技术中的主流方案,几乎绝大部分项目都会使用它,Nginx是一个轻量级的高性能HTTP反向代理服务器,同时它也是一个通用类型的代理服务器,支持绝大部分协议,如TCP、UDP、SMTP、HTTPS等。

图片
Nginx与Redis相同,都是基于多路复用模型构建出的产物,因此它与Redis同样具备 「「资源占用少、并发支持高」」 的特点,在理论上单节点的Nginx同时支持5W并发连接,而实际生产环境中,硬件基础到位再结合简单调优后确实能达到该数值。

先来看看Nginx引入前后,客户端请求处理流程的对比:

图片
原本客户端是直接请求目标服务器,由目标服务器直接完成请求处理工作,但加入Nginx后,所有的请求会先经过Nginx,再由其进行分发到具体的服务器处理,处理完成后再返回Nginx,最后由Nginx将最终的响应结果返回给客户端。

了解了Nginx的基本概念后,再来快速搭建一下环境,以及了解一些Nginx的高级特性,如动静分离、资源压缩、缓存配置、IP黑名单、高可用保障等。

二、Nginx环境搭建
❶首先创建Nginx的目录并进入:

[root@localhost]# mkdir /soft && mkdir /soft/nginx/
[root@localhost]# cd /soft/nginx/
❷下载Nginx的安装包,可以通过FTP工具上传离线环境包,也可通过wget命令在线获取安装包:

[root@localhost]# wget https://nginx.org/download/nginx-1.21.6.tar.gz
没有wget命令的可通过yum命令安装:

[root@localhost]# yum -y install wget
❸解压Nginx的压缩包:

[root@localhost]# tar -xvzf nginx-1.21.6.tar.gz
❹下载并安装Nginx所需的依赖库和包:

[root@localhost]# yum install --downloadonly --downloaddir=/soft/nginx/ gcc-c++
[root@localhost]# yum install --downloadonly --downloaddir=/soft/nginx/ pcre pcre-devel4
[root@localhost]# yum install --downloadonly --downloaddir=/soft/nginx/ zlib zlib-devel
[root@localhost]# yum install --downloadonly --downloaddir=/soft/nginx/ openssl openssl-devel
也可以通过yum命令一键下载(推荐上面哪种方式):

[root@localhost]# yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
执行完成后,然后ls查看目录文件,会看一大堆依赖:

图片
紧接着通过rpm命令依次将依赖包一个个构建,或者通过如下指令一键安装所有依赖包:

[root@localhost]# rpm -ivh --nodeps *.rpm
❺进入解压后的nginx目录,然后执行Nginx的配置脚本,为后续的安装提前配置好环境,默认位于/usr/local/nginx/目录下(可自定义目录):

[root@localhost]# cd nginx-1.21.6
[root@localhost]# ./configure --prefix=/soft/nginx/
❻编译并安装Nginx:

[root@localhost]# make && make install
❼最后回到前面的/soft/nginx/目录,输入ls即可看见安装nginx完成后生成的文件。

❽修改安装后生成的conf目录下的nginx.conf配置文件:

[root@localhost]# vi conf/nginx.conf
修改端口号:listen 80;
修改IP地址:server_name 你当前机器的本地IP(线上配置域名);
❾制定配置文件并启动Nginx:

[root@localhost]# sbin/nginx -c conf/nginx.conf
[root@localhost]# ps aux | grep nginx
Nginx其他操作命令:

sbin/nginx -t -c conf/nginx.conf # 检测配置文件是否正常
sbin/nginx -s reload -c conf/nginx.conf # 修改配置后平滑重启
sbin/nginx -s quit # 优雅关闭Nginx,会在执行完当前的任务后再退出
sbin/nginx -s stop # 强制终止Nginx,不管当前是否有任务在执行
❿开放80端口,并更新防火墙:

[root@localhost]# firewall-cmd --zone=public --add-port=80/tcp --permanent
[root@localhost]# firewall-cmd --reload
[root@localhost]# firewall-cmd --zone=public --list-ports
⓫在Windows/Mac的浏览器中,直接输入刚刚配置的IP地址访问Nginx:

最终看到如上的Nginx欢迎界面,代表Nginx安装完成。

三、Nginx反向代理-负载均衡
首先通过SpringBoot+Freemarker快速搭建一个WEB项目:springboot-web-nginx,然后在该项目中,创建一个IndexNginxController.java文件,逻辑如下:

@Controller
public class IndexNginxController {
@Value(“${server.port}”)
private String port;

@RequestMapping("/")  
public ModelAndView index(){  ModelAndView model = new ModelAndView();  model.addObject("port", port);  model.setViewName("index");  return model;  
}  

}
在该Controller类中,存在一个成员变量:port,它的值即是从application.properties配置文件中获取server.port值。当出现访问/资源的请求时,跳转前端index页面,并将该值携带返回。

前端的index.ftl文件代码如下:

Nginx演示页面

欢迎来到熊猫高级会所,我是竹子${port}号!

从上可以看出其逻辑并不复杂,仅是从响应中获取了port输出。

OK~,前提工作准备就绪后,再简单修改一下nginx.conf的配置即可:

upstream nginx_boot{

30s内检查心跳发送两次包,未回复就代表该机器宕机,请求分发权重比为1:2

server 192.168.0.000:8080 weight=100 max_fails=2 fail_timeout=30s;
server 192.168.0.000:8090 weight=200 max_fails=2 fail_timeout=30s;

这里的IP请配置成你WEB服务所在的机器IP

}

server {
location / {
root html;
# 配置一下index的地址,最后加上index.ftl。
index index.html index.htm index.jsp index.ftl;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 请求交给名为nginx_boot的upstream上
proxy_pass http://nginx_boot;
}
}
“至此,所有的前提工作准备就绪,紧接着再启动Nginx,然后再启动两个web服务,第一个WEB服务启动时,在application.properties配置文件中,将端口号改为8080,第二个WEB服务启动时,将其端口号改为8090。
最终来看看效果:

图片
因为配置了请求分发的权重,8080、8090的权重比为2:1,因此请求会根据权重比均摊到每台机器,也就是8080一次、8090两次、8080一次…

Nginx请求分发原理
客户端发出的请求192.168.12.129最终会转变为:http://192.168.12.129:80/,然后再向目标IP发起请求,流程如下:

图片
由于Nginx监听了192.168.12.129的80端口,所以最终该请求会找到Nginx进程;
Nginx首先会根据配置的location规则进行匹配,根据客户端的请求路径/,会定位到location /{}规则;
然后根据该location中配置的proxy_pass会再找到名为nginx_boot的upstream;
最后根据upstream中的配置信息,将请求转发到运行WEB服务的机器处理,由于配置了多个WEB服务,且配置了权重值,因此Nginx会依次根据权重比分发请求。
四、Nginx动静分离
动静分离应该是听的次数较多的性能优化方案,那先思考一个问题:「「为什么需要做动静分离呢?它带来的好处是什么?」」 其实这个问题也并不难回答,当你搞懂了网站的本质后,自然就理解了动静分离的重要性。先来以淘宝为例分析看看:

图片
当浏览器输入www.taobao.com访问淘宝首页时,打开开发者调试工具可以很明显的看到,首页加载会出现100+的请求数,而正常项目开发时,静态资源一般会放入到resources/static/目录下:

图片
在项目上线部署时,这些静态资源会一起打成包,那此时思考一个问题:「「假设淘宝也是这样干的,那么首页加载时的请求最终会去到哪儿被处理?」」 答案毋庸置疑,首页100+的所有请求都会来到部署WEB服务的机器处理,那则代表着一个客户端请求淘宝首页,就会对后端服务器造成100+的并发请求。毫无疑问,这对于后端服务器的压力是尤为巨大的。

“但此时不妨分析看看,首页100+的请求中,是不是至少有60+是属于*.js、.css、.html、*.jpg…这类静态资源的请求呢?答案是Yes。
既然有这么多请求属于静态的,这些资源大概率情况下,长时间也不会出现变动,那为何还要让这些请求到后端再处理呢?能不能在此之前就提前处理掉?当然OK,因此经过分析之后能够

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

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

相关文章

redis真实使用

Spring Data Redis中提供了一个高度封装的类:RedisTemplate,对相关api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下: ValueOperations:string数据操作 SetOperations:set类型数据操作 …

Flink SQL 中的流式概念:状态算子

博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,…

动态规划-01背包问题新解(c)

动态规划-01背包问题新解 概述动态规划01背包问题传统思路算法官方递推关系算法2种算法比较 概述 本文将从一个新的角度来描述和实现01背包问题,以协助对01背包问题以及教材上的算法的彻底理解。 新的角度为:传统思路算法,“新”是新在与绝…

【Python】Ubuntu创建虚拟环境运行Python

虚拟环境让项目之间的依赖关系更加清晰,同时也可以避免全局安装的包的版本冲突问题。 在Ubuntu系统上,可以使用Python的内置工具venv来创建虚拟环境。以下是在Ubuntu上创建Python虚拟环境的步骤: 安装Python虚拟环境工具:首先确保…

Maven配置文件忘记更新阿里云的Mavne镜像的最新地址

最近更新最新版的IDEA,打开旧的工作空间,发现以前Spring相关项目全部报错并无法运行。 单元测试发现无法识别XML配置文件路径,同时提示各种异常 异常一 org.springframework.beans.factory.BeanDefinitionStoreException: IOException par…

10W 音频功率放大电路芯片TDA2003,可用于汽车收音机及收录机中作音频功率放大器,内部具有短路保护和过热保护等功能

TDA2003 用于汽车收音机及收录机中作音频功率放大器。 采用 TO220B5 封装形式。 主要特点: ⚫ 内部具有短路保护和过热保护。内部具有地线开路、电源极性接 反和负载泄放电压反冲等保护电路。 ⚫ 输出电流大。 ⚫ 负载电阻可低至 1.6 。 …

[C++]C/C++ Socket设置非阻塞模式接收超时时间的多种方法

网络编程中经常需要处理的一个问题就是如何正确地处理Socket超时,对于C/C,有几种常用的技术可以用来设置Socket接收超时时间,在这篇文章中,我们将详细介绍如何在C/C中设置Socket的非阻塞模式以及如何配置接收超时时间,需要的朋友可以参考下 C/C Socket设置非阻塞模式接收超时时…

LeetCode 刷题 [C++] 第141题.环形链表

题目描述 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&a…

STC-ISP原厂代码研究之 V3.7d汇编版本

最近在研究STC的ISP程序,用来做一个上位机烧录软件,逆向了上位机软件,有些地方始终没看明白,因此尝试读取它的ISP代码,但是没有读取成功。应该是目前的芯片架构已经将引导代码放入在了单独的存储块中,而这存储块有硬件级的使能线,在面包板社区-宏晶STC单片机的ISP的BIN文…

uniapp的动态表单实现

目录 1.说明 2.示例 3.总结 1.说明 ①在 formData 中定义个数组变量用来接受同一个字段的多个结果。 dynamicFormData: {email: ,// domains 字段下会有多个结果domains: [] }②使用 uni-forms-item 的 rules 属性定义单个表单域的校验规则。 <uni-forms-item :label&qu…

matlab绘制雷达图和二维FFT变换图

1、内容简介 略 49-可以交流、咨询、答疑 matlab绘制雷达图和二维FFT变换图 NMO组及NORMAL组 RNFL层、GCL层、IPL层、GCC层、ORL层做雷达图&#xff08;共10张&#xff09; 2、内容说明 略 NMO组及NORMAL组 RNFL层、GCL层、IPL层、GCC层、ORL层请分别做雷达图&#xff08…

每日OJ题_分治快排③_力扣215. 数组中的第K个最大元素

目录 力扣215. 数组中的第K个最大元素 解析代码 力扣215. 数组中的第K个最大元素 215. 数组中的第K个最大元素 难度 中等 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xf…

【学习笔记】SOA服务设计原则(二)举例说明

以银行系统为例 背景 在线银行系统允许用户进行各种银行业务,如查看账户余额、转账、支付账单等。为了支持这些功能,系统需要与账户管理、交易处理、账单支付等多个不同的服务进行交互。 应用SOA设计基本原则 标准化服务合约(Standardized Service Contract) 例子:所有服…

VAST Data步步攀升,整合AI堆栈,打造一体化AI平台:从存储根基走向全方位数据处理与分析

VAST Data公司正逐步从其商品化存储基础出发&#xff0c;构建一套统一的AI堆栈系统&#xff0c;致力于提供一站式AI解决方案。最近&#xff0c;VAST公司的现场CTO安迪珀斯坦纳在一次简报中传达了这一战略方向。 VAST提供了分散式QLC单层闪存架构的并行、横向扩展文件型存储系统…

kotlin与java的相互转换

Kotlin转java 将kotlin代码反编译成java Tools -> Kotlin -> Show Kotlin Bytecode 然后点击 【Decompile】 生成java代码 java转kotlin Code -> Convert Java File To Kotlin File

Docker数据管理及网络通信

目录 ------------------Docker 的数据管理--------------------- 1&#xff0e;数据卷 2&#xff0e;数据卷容器 -----------------端口映射----------------------------------- ------------------容器互联&#xff08;使用centos镜像&#xff09;---------------------…

科技论文编写思路

科技论文编写思路 1.基本框架2.课题可行性评估1.研究目标和意义2.研究方法和技术3.可行性和可操作性4.风险和不确定性5.经济性和资源投入6.成果预期和评估 3.写作思路4.利用AI读论文5.实验流程 1.基本框架 IntroductionRelated worksMethodExperiment and analysisDiscussionC…

ElasticSearch之Search Template和Index Alias

写在前面 本文看下es的search template和index alias。 1&#xff1a;search template 用来定义模板查询语句&#xff0c;运行时只需要将要查询的内容作为参数传进来即可&#xff0c;如下&#xff1a; 接着来测试下&#xff0c;首先来定义数据&#xff1a; DELETE tmdb/ P…

服务器防火墙的应用技术有哪些

服务器防火墙的应用技术有哪些 1.数据包过滤技术 数据包过滤是最基本的服务器防火墙技术之一&#xff0c;它根据一系列预定义规则过滤进出网络的数据包。数据包过滤器通常基于IP地址、端口号和协议类型等信息来判断数据包是否合法&#xff0c;如果不符合规则&#xff0c;则将被…

解决i18n国际化可读性问题,傻瓜式webpack中文支持国际化插件开发

先来看最后的效果 问题 用过国际化i18n的朋友都知道&#xff0c;天下苦国际化久矣&#xff0c;尤其是中文为母语的开发者&#xff0c;在面对代码中一堆的$t(abc.def)这种一点也不直观毫无可读性的代码&#xff0c;根本不知道自己写了啥 &#xff08;如上图&#xff0c;你看得出…