nginx实战

news2024/11/29 4:27:25

目录

  • 反向代理
    • 去掉前缀
      • 场景1:去掉一层前缀
      • 场景2:去掉两层前缀
    • 返回固定json
    • 增加后缀映射
      • 情况一
      • 情况二
      • 情况三
      • 情况四
  • 正向代理
  • 负载均衡
  • 正则匹配
    • ~ /item/(\d+)

反向代理

通过Nginx我们可以实现反向代理,这也是我在项目中使用到的一个功能,那么什么是反向代理呢?我们用户对代理是无感知的,因为我们不需要进行任何配置就可以进行访问。我们只需要将请求发送至反向代理服务器,由反向代理服务器帮我们决定需要访问哪个资源并且将资源返回给我们。此时反向代理服务器和目标服务器对外就是服务器,但是只对外暴露了代理服务器的地址,目标服务器的地址是隐藏的。

去掉前缀

场景1:去掉一层前缀

正常情况下:在nginx配置文件中中设置了 location /api/ 时 浏览器访问 /api/test 反向代理到后端服务后,后端服务接收到的url地址实际还是/api/test
需要实现的功能需求:访问url路径/api/test 经过nginx反向代理后,到达后端服务的实际url地址为/test

location  ^~/api/ {
    proxy_pass http://localhost:12345/;
}

需要注意和修改的是:在proxy_pass的最后加一个/即可。
修改完成后执行 nginx -s reload 刷新nginx配置文件,然后打开浏览器测试即可

场景2:去掉两层前缀

比如把/gatway/api/test转发到后端是/test

location ^~/gateway/api/ {
			add_header Cache-Control 'no-store';
			client_max_body_size 100m;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_set_header Host $http_host;
			proxy_set_header X-Forwarded-Proto https;
			proxy_set_header X-Nginx-Proxy true;
			proxy_redirect off;
			proxy_connect_timeout      1;
			proxy_send_timeout         20;
			proxy_read_timeout         30;
			proxy_pass http://192.168.0.88:8208/;
		}  

返回固定json

location = /time2 {
		    default_type application/json;
		    add_header 'Access-Control-Allow-Origin' '*';
		    autoindex_localtime on;        
		    add_header 'Access-Control-Allow-Credentials' 'true';
		    return 200 '{"code":0,"year":"2022","month":"05","day":"31","hour":"11","minute":"20","second":"21"}';      
		} 

增加后缀映射

参考:nginx代理路径配置总结

情况一

在这里插入图片描述

这个结果说明代理的时候,按照请求路径中的/api匹配到了对应的代理,代理到服务端的时候,把请求的ip和port替换为代理服务的ip和port,而对应的uri则完全没有变化,是整体的复制过去。

请求nginx:http://192.168.0.105:8087/api/system/common/doLogin

Nginx代理替换之后:http://192.168.0.105:8089/api/system/common/doLogin

代理过程:将图中红色部分替换为绿色部分,其他都不变,然后发送到服务端:在这里插入图片描述

情况二

location后的路径为“/api”,代理服务的上下文为“/”(http://192.168.0.105:8089/),看下图:

在这里插入图片描述

服务端接收的uri为:
在这里插入图片描述

这个结果说明按照请求路径中的/api匹配到了对应的代理之后,把请求中的“/api”替换为代理服务上下文路径“/”,“/api”之后的路径不变,替换如下:

请求nginx:http://192.168.0.105:8087/api/system/common/doLogin

Nginx代理替换之后:http://192.168.0.105:8089/ /system/common/doLogin

代理过程:将红色的部分替换为绿色的部分,其他都不变,然后发送服务端:

在这里插入图片描述

情况三

location后的路径为“/api/”,代理服务的上下文为空(http://192.168.0.105:8089),看下图:
在这里插入图片描述

服务端接收的uri为:

在这里插入图片描述

这个结果和情况一是一样的,按照请求路径中的/api/匹配到了对应的代理,代理到服务端的时候,把请求的ip和port替换为代理服务的ip和port,而对应的uri则完全没有变化,是整体的复制过去。

请求nginx:http://192.168.0.105:8087/api/system/common/doLogin

Nginx代理替换之后:http://192.168.0.105:8089/api/system/common/doLogin

情况四

location后的路径为“/api/”,代理服务的上下文为“/”(http://192.168.0.105:8089/),看下图:

在这里插入图片描述

服务端接收的uri为:
在这里插入图片描述

这个结果说明和情况二是一样的,按照请求路径中的/api/匹配到了对应的代理之后,把请求中的“/api/”替换为代理服务上下文路径“/”,“/api/”之后的路径不变,替换如下:

请求nginx:http://192.168.0.105:8087/api/system/common/doLogin

Nginx代理替换之后:http://192.168.0.105:8089/system/common/doLogin

代理过程:将红色部分替换为绿色部分,其他部分不变:
在这里插入图片描述

正向代理

Nginx不仅可以实现反向代理,还能实现正向代理,那么什么是正向代理呢?前面说到反向代理我们是无感知的,我们并不知道我们需要访问的目标,我们只是知道代理的地址。而正向代理则不同,我们是很清楚我们需要访问的目标的,但是访问过程中出现了一个代理去帮我们完成这个请求并将结果返回。 此时服务器只知道请求来自哪个代理服务器,而不知道是哪个客户端发起的请求,正向代理模式屏蔽或者隐藏了真实客户端的信息。

负载均衡

Nginx提供了六种不同的负载均衡策略,分别为:

  • 轮询(默认):最基本的配置方法,它是upstream模块默认的负载均衡默认策略。每个请求会按时间顺序逐一分配到不同的后端服务器。
    来了一个订单会按照时间顺序来分发,比如现在是A分店接的单,再来一个订单就将订单交给B分店,这样循环。
  • weight(权重):权重方式,在轮询策略的基础上指定轮询的几率。
    这种方式会按照每个分店的权重来分发订单,比如A分店最大,能够处理的订单最多,这时候就应该将A分店的权重设置大一些,分发的订单就多一点。
  • ip_hash:指定负载均衡器按照基于客户端IP的分配方式,这个方法确保了相同的客户端的请求一直发送到相同的服务器,以保证session会话。这样每个访客都固定访问一个后端服务器,可以解决session不能跨服务器的问题。
    这种方式可以理解成根据用户的地址信息来选择将订单分发给哪家店,当然这并不意味着哪个地址近我就将这个订单分发给哪家店,因为在实际情况中我们是无法通过IP地址来判定客户端离目标服务器的距离的,你可以理解成外卖小哥也不知道这个地址离哪个分店近,他只是按照一定的规则按照订单地址分发,比如有四家分店,我可以按照地址最后一个字的音调来决定选择哪家,第一声我就选择A分店,以此类推。
  • least_conn:把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。
    这种方式选择的是订单数最少(连接数最少)的店来分配订单,轮询方案是将订单均匀分发给不同的店,但是不同的订单制作时间不一样,比如分店A接到的订单全是要加葱的,这时候分店A刚好没有葱了,还得花时间准备葱,这样采用轮询方案会导致订单在分店A堆积。这时候假如来了个订单按照轮询应该给A分店,但是我选择了最少订单的分店B来处理这个订单就会达到更好的负载效果。
  • fair(第三方):按照服务器端的响应时间来分配请求,响应时间短的优先分配。
    这种方式可以理解成按照店的处理速度来选择,哪家店能够最快处理这笔订单就交给谁。
  • url_hash(第三方):按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再此收到请求,就可以从缓存中读取。
    这种方式要和ip_hash理解分开,ip_hash确保的是同一个用户的订单是交给固定的分店处理的,而url_hash虽然也是按照某一信息来决定分发,但是却跟ip_hash有很大的区别,可以理解成url_hash是根据点的火锅种类来分发的。试想这样一个场景,分店A做了很多汤卤火锅,分店B做了很多清炖火锅,分店C做了很多清水火锅,这时候假如来了一个订单是点汤卤火锅的,假如按照ip_hash是将该订单交给分店B,这样显然不太合适,而且假如分店B做了这份订单,但是一天下来分到的订单就只有这笔订单是汤卤火锅的,这样就会造成时间和资源上的浪费,这时候url_hash的优势就出来了,我可以根据客户请求的资源来决定要分发到哪个位置。

正则匹配

~ /item/(\d+)

location ~ /item/(\d+) {
	
}
  • ~ 表示正则匹配
  • **()**表示一个分组
  • \d表示数字
  • + 表示任意数量

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

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

相关文章

20221122非累加的m3u8的ts切片列表的补全步骤

20221122非累加的m3u8的ts切片列表的补全步骤 2022/11/22 19:07 https://apppy87xs3b3950.h5.xiaoeknow.com/v2/course/alive/l_6374b6d0e4b0edc794f61031?type2&app_idapppy87xs3b3950&availabletrue&share_user_idu_61333670aabd8_rizBVXTg2F&share_type5&a…

从零开始的图像语义分割:FCN快速复现教程(Pytorch+CityScapes数据集)

从零开始的图像语义分割:FCN复现教程(PytorchCityScapes数据集)前言一、图像分割开山之作FCN二、代码及数据集获取1.源项目代码2.CityScapes数据集三、代码复现1.数据预处理2.代码修改3.运行结果总结参考网站前言 摆了两周,突然觉…

【第五部分 | JS WebAPI】6:PC端网页特效与本地存储

目录 | 概述 | PC端网页特效之三大系列 1-1 elementObj . offsetXXX 属性 1-2 elementObj . style 和 offset 的区别 1-3 案例:获取鼠标在某个盒子内的位置 2-1 elementObj . clientXXX 属性 3-1 elementObj . scrollXXX 属性 三大系列总结 | 动画函数封装 …

LeetCode1005. K 次取反后最大化的数组和

1 题目描述 给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组: 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后,返回数组 可能的最大和 。 示例 1&a…

弹簧(压簧)力度计算与设计

弹簧(压簧)力度计算与设计弹簧的种类什么是弹性系数弹簧的材料常用材料与用途弹性系数与哪些因素有关弹簧力度设计与计算弹簧收尾设计弹簧是一种利用弹性来工作的机械零件。一般用弹簧钢制成。利用它的弹性可以控制机件的运动、缓和冲击或震动、储蓄能量…

[附源码]java毕业设计校园疫情防控管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

BMN:Boundary-matching network for temporal action proposal generation

Video Analysis 相关领域解读之Temporal Action Detection(时序行为检测) - 知乎本文投稿于 极视角 公众号,链接为 文章链接. 上一篇 Video Analysis相关领域解读之Action Recognition(行为识别) - 知乎专栏介绍了 Action Recognition 领域的研究进展。Action Recog…

转铁蛋白修饰纳米载体(纳米颗粒,介孔硅,四氧化三铁,二氧化硅等)

转铁蛋白又名运铁蛋白(Transferrin,TRF、Tf),负责运载由消化管吸收的铁和由红细胞降解释放的铁。以三价铁复合物(Tf-Fe3)的形式进入骨髓中,供成熟红细胞的生成。转铁蛋白主要存在于血浆中&#…

vue 动态表单优秀案例

不同的下拉框 就会显示不同的表单&#xff0c;表单配置是灵活匹配的&#xff0c;还有就是 一定要知道都有哪些类型的数据做到兼容起来。 app.vue <template><a-select v-model:value"FormDataSelect" :options"FormDataSelectList" /><a-fo…

相控阵天线(五):稀疏阵列(概率密度稀疏法、多阶密度加权法、迭代傅里叶(IFT)法)

目录简介稀疏线阵概率密度稀疏法多阶密度加权法迭代傅里叶(IFT)综合法对称分布稀疏阵列建模仿真简介 稀疏阵是在不明显改变阵列波束宽度的情况下去掉一些阵元&#xff0c;可以用满阵列的几分之一的阵元构造一个减低了增益的高方向性阵列&#xff0c;符合大型阵列设计中降低成本…

【C++】哈希算法

目录 1.哈希映射 1.1哈希的概念 1.2哈希冲突 1.3哈希函数 1.31直接定值法 1.32除留余数法 2.解决哈希冲突 2.1闭散列法 2.11线性探测 2.12二次探测 3代码实现 3.1状态&#xff1a; 3.2创建哈希节点类 3.21哈希表扩容&#xff1a; 3.3数据插入 3.4查找与删除 3.…

数据可视化之设计经验分享:轻松三步教你学会制作数据可视化大屏思路

当看到屏幕上一个个炫酷&#xff0c;具有科技感的数据大屏时&#xff0c;很多人都会好奇这是怎么做出来的。自己在制作大屏时明明按着需求做了&#xff0c;可是做出来后总是觉得画面不好看&#xff0c;不够炫&#xff0c;感觉很糟糕。 那要如何才能设计那样的数据可视化大屏呢…

JS 的新一代日期/时间 API Temporal

众所周知&#xff0c;JS的Date是出了名的难用&#xff0c;一直以来我们都在使用momentjs&#xff0c;dayjs等第三方库来处理日期和时间格式&#xff0c;于是 TC39 组织开始了对 Date 的升级改造&#xff0c;他们找到了 moment.js 库的作者&#xff0c;Maggie &#xff0c;由她来…

【深度学习】实验5答案:滴滴出行-交通场景目标检测

DL_class 学堂在线《深度学习》实验课代码报告&#xff08;其中实验1和实验6有配套PPT&#xff09;&#xff0c;授课老师为胡晓林老师。课程链接&#xff1a;https://www.xuetangx.com/training/DP080910033751/619488?channeli.area.manual_search。 持续更新中。 所有代码…

代码随想录刷题| 01背包理论基础 LeetCode 416. 分割等和子集

目录 01背包理论基础 二维dp数组 1、确定dp数组以及下标的含义 2、确定递推公式 3、dp数组如何初始化 4、确定遍历顺序 5、打印dp数组 最终代码 一维dp数组 1、确定dp数组的定义 2、确定递推公式 3、初始化dp数组 4、遍历顺序 5、打印dp数组 最终代码 416. 分割…

一次搞懂SpringBoot核心原理:自动配置、事件驱动、Condition

前言 SpringBoot是Spring的包装&#xff0c;通过自动配置使得SpringBoot可以做到开箱即用&#xff0c;上手成本非常低&#xff0c;但是学习其实现原理的成本大大增加&#xff0c;需要先了解熟悉Spring原理。如果还不清楚Spring原理的&#xff0c;可以先查看博主之前的文章&…

Vue实现简易购物车功能

用Vue写一个列表案例&#xff0c;页面布局什么的dom&#xff0c;不需要自己事先全部排好&#xff0c;而是通过li遍历&#xff0c;把数据遍历出来&#xff1b;先定义好div标签&#xff0c;li根据数组的长度datalist进行遍历&#xff0c;图片的链接要用“&#xff1a;”&#xff…

算法设计与分析 SCAU8597 石子划分问题

8597 石子划分问题 时间限制:1000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G;GCC;VC;JAVA Description 给定n个石子&#xff0c;其重量分别为a1,a2,a3,…,an。 要求将其划分为m份&#xff0c;每一份的划分费用定义为这份石子中最大重量与最小重量差…

nRF52832闪存FDS使用(SDK17.1.0)

陈拓 2022/10/29-2022/11/22 1. 简介 对于Nordic芯片内部FLASH存储管理有两种方式&#xff0c;FS (Flash Storage)和FDS (Flash Data Storage) 。FS是FDS的底层实现&#xff0c;FDS是对FS的封装&#xff0c;使用更容易。 Flash Data Storage&#xff08;FDS&#xff09;模块是…

容器与容器编排系统

Docker公司发明的「容器镜像」技术&#xff0c;创造性地解决了应用打包的难题。改变了一大批诸如容器编排、服务网格和云原生等技术&#xff0c;深刻影响了云计算领域的技术方向。 一、Docker 容器技术 概括起来&#xff0c;Docker 容器技术有3个核心概念容器、镜像和镜像仓库…