IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> nginx proxy_pass转发规则解析 -> 正文阅读

[系统运维]nginx proxy_pass转发规则解析

综述

nginx官方网站讲解proxy_pass时,只给了规则的说明,并没有给出具体的示例辅助理解。对于英语不太好的人,理解起来真的很头痛,只能通过测试来验证对英文意思的猜测。
nginx对proxy_pass的官方说明见http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass
其将proxy_pass的转发规则分为3类:

  1. location为简单配置(非正则表达式),proxy_pass的url带path路径
  2. location为简单配置(非正则表达式),proxy_pass的url不带path路径
  3. nginx无法确认url的替换规则

url中带path路径

判断条件

如果域名后面带了“/”,则认为是url中带了path路径。比如:

  1. proxy_pass http://127.0.0.1/
  2. proxy_pass http://127.0.0.1/aaa
  3. proxy_pass http://127.0.0.1/aaa/

转发规则

nginx官网原文如下:

If the proxy_pass directive is specified with a URI, then when a request is passed to the server, the part of a normalized request URI matching the location is replaced by a URI specified in the directive:

location /name/ {
proxy_pass http://127.0.0.1/remote/;
}

个人理解如下:
使用proxy_pass配置的url去替换location指定的部分。如下图就是使用http://127.0.0.1/remote/去替换path中/name/这一段
在这里插入图片描述

url中不带path路径

判断条件

与第一点相反,proxy_pass指定url中只有域名,比如ttp://127.0.0.1

转发规则

If proxy_pass is specified without a URI, the request URI is passed to the server in the same form as sent by a client when the original request is processed, or the full normalized request URI is passed when processing the changed URI:

location /some/path/ {
proxy_pass http://127.0.0.1;
}

个人理解如下:
转发url=proxy_pass配置的url+原始url中path部分
在这里插入图片描述

nginx无法确认url的替换规则

这种场景nginx又细分成3类

location指定的是正则表达式

nginx官方要求配置proxy_pass时,不能带path路径。

When location is specified using a regular expression, and also inside named locations.
In these cases, proxy_pass should be specified without a URI.

path路径在location中使用rewrite重写了

比如

location /name/ {
rewrite /name/([^/]+) /users?name=$1 break;
proxy_pass http://127.0.0.1/test;
}
In this case, the URI specified in the directive is ignored and the full changed request URI is passed to the server.

这种场景,nginx会忽略proxy_pass中配置的path路径,然后使用proxy_pass中指定的域名加上rewrite中指定的path路径即为转发后的url。

proxy_pass配置的url中带变量

比如

location /name/ {
proxy_pass http://127.0.0.1$request_uri;
}
In this case, if URI is specified in the directive, it is passed to the server as is, replacing the original request URI.

这种场景,如果proxy_pass配置的url经过变量转换后带path路径,则直接使用该url。
在这里插入图片描述

其他

实际上,“nginx无法确认url的替换规则”3个细分类可能存在交叉的地方,这个nginx没有提到,大家只能动手自己去测试nginx的混合场景的规则了。
比如我们系统后端服务是没有context-path的,后面为了容器化需要添加context-path,详细背景见之前的博客。为了对前端屏蔽变化,因此需要修改nginx的转发规则。如下图所示,这样就涉及到“location指定的是正则表达式”和“proxy_pass配置的url中带变量”混合场景了。
在这里插入图片描述

If the location is given by regular expression, can not be a URI part in proxy_pass directive, unless there are variables in the directive

如果location使用正则表达式,proxy_pass中不能指定path,除非proxy_pass中包含变量

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 12:01:58  更:2022-05-05 12:05:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 18:29:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码