nginx,从基本原理到开发实践

毛奇志(公众号:爱奇志) 毛奇志(公众号:爱奇志)     2022-12-05     478

关键词:

一、前言

二、Nginx实现Http缓存

2.1 理论

Nginx作为服务端最先处理网络请求的中间件,有一定的缓存功能,缓存的是真实的tomcat的响应,缓存如果命中,nginx就直接返回,不用去访问后面的tomcat了。

在这里插入图片描述
CDN的全称是Content Delivery Network,即内容分发网络。

创建并配置缓存的路径(在centos上创建目录,在 conf/nginx.conf 上配置创建的目录)

在这里插入图片描述

在这里插入图片描述

2.2 实践

第一步,先创建并配置缓存的路径(在centos上创建目录,在 conf/nginx.conf 上配置创建的目录)

第二步,server location 块中,配置使用缓存
在这里插入图片描述
proxy_set_header 添加请求头 给idea上的tomcat,一般存放 浏览器发过来的网络信息,用来给tomcat看,即发送给后台真实服务器的请求头

add_header 添加响应头 给浏览器,一般存放是否命中缓存这些信息,即响应给客户端(浏览器)时需要添加的头信息

第三步,开始用

在这里插入图片描述
第一次请求
在这里插入图片描述
nginx上产生了缓存文件

在这里插入图片描述

第二次访问,时间没变,响应头中为hit,表示命中缓存

在这里插入图片描述
对于 $upstream_cache_status 有这些取值

在这里插入图片描述

基本就是 hit 命中,miss 和 expired 没命中,其中,miss没命中,expired过期了

2.3 第三方插件:ngx_cache_purge

nginx可以提供手动 删除缓存 的方式,就是在 url 里面加一个特定 路径名,识别到这个路径名,就删除缓存,即使用户 误操作 也没有关系。

在这里插入图片描述

理解即可,不是nginx自带,不常用。

第一步,下载安装 ngx_cache_purge
第二步,配置 server location
唯一注意: proxy_cache_purge 缓存名 和 缓存key 要和前面完全匹配
在这里插入图片描述
第三步,生成缓存,清空缓存,再次访问,就无法命中缓存了。

在这里插入图片描述

在这里插入图片描述

三、Nginx实现动静分离

3.1 静态资源和动态资源

在这里插入图片描述
静态资源:系统运行的时候,内容不会改变的,js css 图片,怎么运行都不会变
动态资源:系统运行的时候,内容会改变的

在这里插入图片描述

缓存和页面静态化:nginx缓存指的是url,这是nginx自带的技术。电商网站中,商品详情页对于包含复杂数据量的页面,做页面静态化,提高响应效率,是开发人员将动态页面静态化,是另一码事。
相同点是,都提高响应速度。

3.2 实践

第一步,先配置好 conf/nginx.conf目录
在这里插入图片描述

在这里插入图片描述
对于这些后缀名的问题,会放到下面的static目录下。

第二步,写好接口

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

第三步,访问静态文件:

可以访问到 192.168.44.81/gupao.png,就是被上面的配置文件 localhost:80 匹配上,png也被匹配上,所以 直接访问 static目录下的静态文件
在这里插入图片描述
在这里插入图片描述

第四步,启动tomcat,访问接口,访问到index.html 这个动态文件。
在这里插入图片描述

四、Nginx实现数据压缩

4.1 理论

nginx内置gzip实现文件压缩,在 浏览器 --> nginx --> tomcat 例子中,nginx作为一个中转转发服务器,有一定的压缩功能,对于 tomcat 响应体给nginx,nginx可以将收到的响应体用gzip压缩,然后响应给浏览器,浏览器一般都有gzip解压缩功能,nginx的压缩一般可以压缩size达到一半以上,可以提高网络传输效率,当然,整个压缩解压缩的过程,对于客户透明的。

也是写在 conf/nginx.conf 配置文件中的,配置在http块内,与server块同级

在这里插入图片描述
常见配置参数如下:
在这里插入图片描述

4.2 实践

先关闭nginx压缩,即在 conf/nginx.conf 中设置gzip off;

启动 nginx 和 tomcat,访问nginx转发的到tomcat,此时js文件大小为 272kb

在这里插入图片描述

然后 在 conf/nginx.conf 中设置gzip on; 再次访问,返回回来的js文件 为90.4kb ,压缩了一半以上。

在这里插入图片描述
看一下报文,request中浏览器是请求了gzip压缩的,respose中 Content Encoding 也确实是 nginx返回的 使用gzip 的压缩结果。

注意:一定要浏览器要求使用gzip压缩,nginx启动gzip压缩,两个条件都满足,如果浏览器不要求压缩 ,和nginx没开启压缩,都是不可以的。

在这里插入图片描述

五、Nginx实现跨域访问

5.1 同域

同域:协议、域名/子域名/ip、端口 三个都相同,如下:
在这里插入图片描述

浏览器同源策略:不允许一个域的脚本,去操作另外一个域的数据,去获得另一个域的返回数据,对于这样的操作,浏览器会进行拦截,拦截另外一个域返回给一个域的响应体。

在这里插入图片描述

5.2 跨域请求

这里有一种跨域场景,在idea上启动tomcat1 和 tomcat2,将nginx部署到centos上,tomcat1启动的html中,script的脚本访问 nginx ,这是一个跨域请求,虽然可以访问成功,且nginx收到这个请求后,再次访问(就是转发)给idea上启动tomcat2(虽然此时也是跨域,但是这不是script脚本,无妨),tomcat2响应体给了nginx,然后nginx响应体给tomcat1,此时无法成功,来自nginx的响应体会被浏览器拦截,因为tomcat1通过script做跨域请求。

注:不是 tomcat1 的请求不能跨域传递给nginx,也不是nginx不发送响应给tomcat1,而是 这个跨域响应被 浏览器 拦截了。
在这里插入图片描述

浏览器的拦截信息如下,这就是 跨域拦截。
在这里插入图片描述

5.3 四种处理跨域请求的方式

5.3.1 jsonp

方式1:jsonp 方式,

理由:js中,script标签的src属性,img标签的src属性,link超链接标签的ref属性,这三个东西,都是不会受到浏览器的同源的限制的,jsonp就是利用js自带三个属性这样处理的。

劣势:只能帮助处理script标签中的,get请求的跨域处理,不能post

在这里插入图片描述

实现:在前端执行跨域请求的script块中,将dataType设置为JSONP,并设置好 jsonpCallback ,这个callback,是后端使用@RestController注解返回的是字符串,但是
在这里插入图片描述
如下,前端代码修改
在这里插入图片描述
后端返回的时候修改,
将 return json.toJSONString(); 变为 return “successCallback(” + json.toJSONString() + “)”;
在这里插入图片描述

5.3.2 方法或类上加上@CrossOrigin注解,或者全局加上配置

理由:在目标的方法或类上加上@CrossOrigin注解,直接给一个通行证,便是某些特定ip或域名跨域访问 目标接口方法,就是通过 Access-Control-Allow-Origin 属性中配置,默认为* 表示,在目标接口方法上配置上,任何一个ip或域名都可以跨域访问 目标接口方法。
在这里插入图片描述
实践:两种方式
方式1:@CrossOrigin 放到Controller层的 方法上或者放到类上
方式2:直接配置全局的bean

在这里插入图片描述

在这里插入图片描述

url 可以配所有的,也可以匹配指定的,origin同理。

注意:不能重复,不能配置两次,配置了全局@CrossOrigin的就不要配置局部的(类或方法上或nginx上),否则浏览器上出现如下错误。

在这里插入图片描述

5.3.3 巧用nginx:将跨域变成nginx转发,这样对浏览器来说,就变成了同域请求

在这里插入图片描述

浏览器上访问 192.168.44.181(即centos ip地址)/file/get ,被nginx拦截,转发给 192.168.44.1:9096(即tomcat1)/file/get,然后这个接口就是idea上的tomcat1处理的,这个tomcat1 return new ModelAndView(“index.html”) 这个index.html 里面的 script 标签访问 192.168.44.181(即centos ip地址)/time/query,被nginx拦截,转给给 192.168.44.1:9097(即tocmat2)/time/query

最后,tomcat2 响应给 nginx ,nginx 响应给 tomcat1,tomcat1 再响应给 nginx,nginx 响应给浏览器。

理由:为什么不会被浏览器拦截?
对于浏览器来说, 192.168.44.181(即centos ip地址)/file/get 请求和 script中的 192.168.44.181(即centos ip地址)/time/query ,是同域的,当然不会拦截 响应体。

至于 nginx 上转发给 tomcat1 是跨域的, nginx 上转发给 tomcat2 是跨域的,这不是在前端script中完成的,浏览器不管。

原理:之前是 浏览器 -> tomcat1 ->(script中跨域请求) nginx -> tomcat2
现在是
浏览器 -> nginx -> tomcat1 ->(因为浏览器上一次访问的是nginx,所以这个script这里对于浏览器来收,同域) nginx -> tomcat2

即,之前是 浏览器直接访问tomcat1,现在是把 conf/nginx.conf 配置好,把tomcat1也挂到nginx上

劣势:conf/nginx.conf 多维护了一个 tomcat1 的配置。

5.3.4 巧用nginx,在目标接口方法上配置上通行证@CrossOrigin

add_header表示在nginx的响应头上加上字段给浏览器,这里就是加上 通行证@CrossOrigin 给浏览器,浏览器看到通行证就会让,核对 跨域请求的源ip,就会让这个响应通过。

重申:不是 tomcat1 的请求不能跨域传递给nginx,也不是nginx不发送响应给tomcat1,而是 这个跨域响应被 浏览器 拦截了。
在这里插入图片描述
在这里插入图片描述
注意:nginx参数设置中比较容易混淆的点

proxy_set_header:对于nginx发送给tomcat的请求,添加请求头 给idea上的tomcat,一般存放 浏览器发过来的网络信息,用来给tomcat看,即发送给后台真实服务器的请求头

add_header:nginx接收tomcat的响应,然后自己响应浏览器的请求, 添加响应头 给浏览器,一般存放是否命中缓存这些信息,即响应给客户端(浏览器)时需要添加的头信息

六、尾声

Nginx,从基本原理到开发实践(二),完成了。

天天打码,天天进步!!

nginx,从基本原理到开发实践(代码片段)

文章目录一、前言二、Nginx三大功能——HTTP服务器三、Nginx三大功能——虚拟主机3.1虚拟主机3.2Nginx配置文件的结构3.3Nginx三种虚拟主机方式——基于ip的虚拟主机配置3.4Nginx三种虚拟主机方式——基于端口的虚拟主机配置3.5Nginx三... 查看详情

nginx,从基本原理到开发实践(代码片段)

文章目录一、前言二、Nginx三大功能——HTTP服务器三、Nginx三大功能——虚拟主机3.1虚拟主机3.2Nginx配置文件的结构3.3Nginx三种虚拟主机方式——基于ip的虚拟主机配置3.4Nginx三种虚拟主机方式——基于端口的虚拟主机配置3.5Nginx三... 查看详情

serverless从入门到进阶:架构原理与实践

... Serverless基础主要介绍了Serverless的概念、发展历程、基本特 查看详情

深入浅出学习透析nginx服务器的基本原理和配置指南「初级实践篇」

什么是Nginx?Nginx(EngineX)是一个轻量级的Web服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器、高性能的HTTP服务器,它以高稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。什么是反向代理?反向代理(... 查看详情

adaboost提升算法从原理到实践

1.基本思想:综合某些专家的判断,往往要比一个专家单独的判断要好。在”强可学习”和”弱科学习”的概念上来说就是我们通过对多个弱可学习的算法进行”组合提升或者说是强化”得到一个性能赶超强可学习算法的算法。... 查看详情

从实践到原理掌握gdb(代码片段)

文章目录基本概念什么是GDB?GDB可以用来做些什么?调试模型本地调试远程调试安装GDB实战启动调试调试未运行的程序无参数有参数调试运行中的程序已生成调试信息未生成调试信息调试core文件配置core文件生成调试core... 查看详情

从实践到原理掌握gdb(代码片段)

文章目录基本概念什么是GDB?GDB可以用来做些什么?调试模型本地调试远程调试安装GDB实战启动调试调试未运行的程序无参数有参数调试运行中的程序已生成调试信息未生成调试信息调试core文件配置core文件生成调试core... 查看详情

深入浅出学习透析nginx服务器的基本原理和配置指南「初级实践篇」(代码片段)

什么是Nginx?Nginx(EngineX)是一个轻量级的Web服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器、高性能的HTTP服务器,它以高稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。什么是反向代理&#x... 查看详情

androidjetpack从使用到源码深耕调度任务组件workmanager从实践到原理

...的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,那么它可以是whiletrue一直占用cpu资源运行,但是具体运行什么,需要由外界交 查看详情

nginx从入门到实践,万字详解!

最近越来越频繁地遇到需要配置反向代理的场景,在自己搭建博客的时候,也不可避免要用到Nginx,所以这段时间集中学习了一下Nginx,同时做了一些笔记,希望也可以帮助到大家~ 查看详情

爬虫从入门到放弃——爬虫的基本原理(代码片段)

 爬虫的基本原理:https://www.cnblogs.com/zhaof/p/6898138.html这个文章写的非常好,把爬虫的基本思路解释的很清楚的。 一、介绍工具(用什么爬)1、PythonIDLE就是用了创建、运行、测试和调试python的工具。集成开发环境:用于... 查看详情

nginx使用与服务发现

...践Nginx中的Rewrite的重定向配置与实践-龙恩0707-博客园Nginx开发从入门到精通—Nginx开发从入门到精通https://wsgzao.github.io/post/nginx/WelcometoNGINXWiki!|NGINXnginx中$1,$2,$3是什么如:set$para$1_有种轰趴我-CSDN博客_n 查看详情

深入浅出学习透析nginx服务器的基本原理和配置指南「负载均衡篇」

...均衡之前的章节内容中【深入浅出学习透析Nginx服务器的基本原理和配置指南「初级实践篇」】和【深入浅出学习透析Nginx服务器的基本原理和配置指南「进阶实践篇」】,我们采用的代理仅仅指向一个服务器。但是网站在实际... 查看详情

androidjetpack从使用到源码深耕调度任务组件workmanager从实践到原理(代码片段)

本文,是Jetpack调度任务组件WorkManager从实践到原理系列文章的最后一篇,本文我们将对WorkManager任务的具体执行源码,进行深入的解读。大家坐好,我们要开始飙车了。1.任务的具体执行书接上文,我们既然知道了WorkManager,既然... 查看详情

rxjava源码分析&实践rxjava基本原理分析之订阅流(代码片段)

...加查阅部分源码验证的方式,来一起探索一下Rxjava实现的基本原理。为了本文原理分析环节,可以被更多的人理解、学习,所以小编从初学者的角度,从使用入手,一点点的分析了其中的源码细节、思想,建议大家随着本文的章... 查看详情

https的原理浅析与本地开发实践(下)

...TP转换到HTTPS,为系列第二篇,第一篇:HTTPS的原理浅析与本地开发实践(上)。希望这两篇关于HTTPS的浅析能够对你的日常研发过程有所帮助。使用CA机构签发的证书配置http——以阿里云免费SSL证书申请过程为... 查看详情

https的原理浅析与本地开发实践(下)

...TP转换到HTTPS,为系列第二篇,第一篇:HTTPS的原理浅析与本地开发实践(上)。希望这两篇关于HTTPS的浅析能够对你的日常研发过程有所帮助。使用CA机构签发的证书配置http——以阿里云免费SSL证书申请过程为... 查看详情

分享即时通讯开发之websocket:概念原理易错常识动手实践

本文将从基本概念、技术原理、常见易错常识、动手实践等多个方面入手,万字长文,带你一起全方位探索WebSocket技术。 阅读完本文,你将了解以下内容:1)了解WebSocket的诞生背景、WebSocket是什么及它的优... 查看详情