Nginx服务器配置---反向代理服务时proxy_pass的转发规则

news/2024/11/20 17:42:12/文章来源:https://www.cnblogs.com/jilodream/p/18558874

nginx是由俄罗斯开发的一款http web服务器,我们经常用这款服务器做负载均衡和反向代理。
今天我们就来聊聊Nginx作为反向代理时,如何进行路由配置。
假设你已经部署好Nginx了,我们进入Nginx安装目录,进入nginx.conf文件。
找到http节点下的server节点,值是一个json。
在json中 有一个location的指令,就是代表转发。
一般是这样的形式:

location {$path} {proxy_pass {$url};
}

{$path}代表匹配源url的部分,proxy_pass 后的{$url}则是代表要转发的目标url,

这里一般会涉及到转发时是否携带原有路径的问题。举个例子:

location /abc {proxy_pass http://127.0.0.1:9090/;
}

如果我们请求 http://127.0.0.1:80/abc (假设nginx的服务器的是80)

则请求的路径path是/abc,此时会匹配到该location指令的规则 /abc,则请求会转发的本机的9090端口。
如果我们请求 http://127.0.0.1:80/abc/cloud
则请求的路径path是/abc/cloud,(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )此时会匹配到该location指令的规则,则请求会转发的本机的9090端口。
但是问题来了,转发9090端口时,/abc要不要补充到后边?后边的/cloud部分要不要追加?
这里是和$url是否包含路径有关系,无斜杠就代表不包含路径,有斜杠就代表包含路径。

一、无路径场景

如果:$url为http://127.0.0.1:9090 表示无路径
此种情况,会将源url的路径部分直接追加
举几个例子
(1)

location /abc {proxy_pass http://127.0.0.1:9090;
}

请求http://127.0.0.1:80/abc/bcd

则跳转到http://127.0.0.1:9090/abc/bcd
(2)

location /abc/bcd {proxy_pass http://127.0.0.1:9090;
}

请求http://127.0.0.1:80/abc/bcd

则跳转到http://127.0.0.1:9090/abc/bcd
(3)

location /abc/bcd/ {proxy_pass http://127.0.0.1:9090;
}

请求http://127.0.0.1:80/abc/bcd/

则跳转到http://127.0.0.1:9090/abc/bcd/

总结就是一句话,proxy_pass 后配置的目标url,如果没有路径信息(包括/),则会将源url的路径部分,直接追加到目标url中

二、有路径场景

如果:$url为http://127.0.0.1:9090/ 表示有路径
如果:$url为http://127.0.0.1:9090/gov 表示有路径
如果:$url为http://127.0.0.1:9090/gov/ 表示有路径
此种情况,会将源url的路径部分去掉已匹配部分后,将剩余部分直接追加到目标url后,如图:

 

举几个例子

(1)

location /abc/ {proxy_pass http://127.0.0.1:9090/;
}

请求http://127.0.0.1:80/abc/bcd

则跳转到http://127.0.0.1:9090/bcd
分析:
源url的路径部分是: “/abc/bcd”
与匹配规则“/abc/”匹配成功
匹配后剩余部分是“bcd”“http://127.0.0.1:9090/”追加“bcd”
则最终会跳转到http://127.0.0.1:9090/bcd
(2)

location /abc {proxy_pass http://127.0.0.1:9090/gov;
}

请求http://127.0.0.1:80/abc/bcd

则跳转到http://127.0.0.1:9090/gov/bcd
(3)

location /abc/b {proxy_pass http://127.0.0.1:9090/gov/;
}

请求http://127.0.0.1:80/abc/bcd/

则跳转到http://127.0.0.1:9090/gov/cd/
(4)

location /abc/b {proxy_pass http://127.0.0.1:9090/gov/;
}

请求http://127.0.0.1:80/abc/b/cd/

则跳转到http://127.0.0.1:9090/gov//cd/

总结就是一句话,proxy_pass 后配置的目标url,如果有路径信息(包括/),则会将源url的路径部分匹配后剩余的部分路径,直接追加到目标url中

现在还有一个问题就是,(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )如果有多个匹配规则都命中的话,那么nginx会怎么处理呢?

如下:

location / {proxy_pass http://127.0.0.1:9091/gov/;
}
location /abc {proxy_pass http://127.0.0.1:9092/gov/;
}
location /abc/ai {proxy_pass http://127.0.0.1:9093/gov/;
}

请求http://127.0.0.1:80/abc/ai/

则nginx 会按照最大匹配原则的情况,选择匹配对象,此时就会将请求转发至9093端口

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

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

相关文章

less 全局变量使用 引用

参考链接: https://blog.csdn.net/qq_42493241/article/details/120021001 照搬成功 (以防链接失效截图)

Ablations

消融实验(ablation study)是什么? 太长不看版: 说白了就是设立对照组/控制变量法的意思,通过去除/增加某个模块的作用,来证明该模块的必要性,如果消融实验后得到性能结果大幅变化,说明该模块起到了作用。—————————————————————————— 严谨版: …

低代码无代码开发工具:TOP10排名

随着企业数字化转型步伐的加快,无代码及低代码开发工具(LCNC)已跃升为构建应用的首选方案。这些工具凭借简化开发流程、降低技术壁垒的优势,赋能企业迅速构建并部署应用,以灵活应对市场的瞬息万变。为何需要低无代码? 在快速迭代的商业环境中,传统的代码开发模式往…

Debian12关闭休眠模式

场景描述: 日常服务器部署中,系统环境如果是Debian12操作系统,那么安装完操作系统后,会默认开启系统自动休眠模式, 需要关闭系统的自动休眠,否则网络状态也会休眠,导致远程连接服务器的时候,没有响应! 临时解决方式: 如果目标服务器在机房或者在旁边,可以移动下该服…

IDM冻结试用期

本文并非原创,详细内容在GitHub上 https://github.com/lstprjct/IDM-Activation-Script/blob/main/README.md https://github.com/Mercury-Z/IDM-Activation-Script-Chinese 我讲讲我的使用过程,现在CSDN上阅读量比较多的帖子都是IDM破解版安装包,但就怕安装包有夹带,而且我…

NL-SLAM for OC-VLN: Natural Language Grounded SLAM for Object-Centric VLN

NL-SLAM for OC-VLN: Natural Language Grounded SLAM for Object-Centric VLN 用于 OC-VLN 的 NL-SLAM:用于以对象为中心的 VLN 的基于自然语言的 SLAM 【NL-SLAM for OC-VLN: Natural Language Grounded SLAM for Object-Centric VLN 】 文章链接:[2411.07848] NL-SLAM fo…

高德地图区域掩模设置背景透明

使用高德地图创建区域掩模,参考高德地图api,效果如下:不难发现绘制的地图自带了默认的颜色和背景图,如图:需求为需要透出父元素中的背景图,那么就需要将绘制高德地图节点和canvas的背景去除。 1、可通过直接设置CSS去除类名 amap-container 的背景图; .amap-container {…

MySql Is Null和is not null索引失效的问题

简介mysql的sql查询语句中使用is null、is not null、!=对索引并没有任何影响,并不会因为where条件中使用了is null、is not null、!=这些判断条件导致索引失效而全表扫描。 mysql官方文档也已经明确说明is null并不会影响索引的使用。 事实上,导致索引失效而全表扫描的通常是…

由于目前头像不足

一个人收两个头像咋样

CH592工具更新说明

①首先拔除电脑上的所有串口工具,再插入我们需要烧录程序的串口,确保能找到我们要下载固件的COM口,一般同一个串口工具在同一台电脑上所分配的COM号是唯一的 ②打开工具,点击Search Device,会跳出对应的COM号③搜索到COM号后可以拔掉串口,开始硬件接线,VCC接串口3V3,GN…

批量解除 此文件来自其他计算机,可能被阻止以帮助保护该计算机

下载微软工具 - Streams https://learn.microsoft.com/en-us/sysinternals/downloads/ streams -s -d D:/file留待后查,同时方便他人 联系我:renhanlinbsl@163.com

使用linq查询报错English Message : Join a needs to be the same as OrderBy it

可以使用 .Select 和 .MergeTable() 将多表结果集变成单表:这样问题就可以解决了