Nginx反向代理proxy_pass

2023-10-27

一、概述

  代理(proxy),即中间人,它代替客户端发送请求给服务器,收到响应后再转给客户端。通常意义上的代理是从用户的角度讲的,用户通过某个代理可以访问多个网站,这个代理是靠近用户的,比如某些公司可能需要限制员工所访问的网站,就会在网络出口处放置一个代理来做过滤。

  反向代理(reverse proxy),本质上跟代理是一回事,只不过是从服务器的角度讲的,是靠近服务器的。比如某个网站有多个服务器,提供同样的功能,一般会在网络入口处放一个代理,接收客户端的请求,再基于某种策略(比如轮转)转发给后端服务器,这样可以提高整个系统的服务能力。nginx 就是一种常见的 HTTP 协议反向代理。

1.1、反向代理指令

nginx 中常见的反向代理指令有两个:proxy_pass 和 fastcgi_pass,前者使用标准的 HTTP 协议转发,后者使用 FastCGI 协议转发,用于 PHP 等架构的环境。在我要说的这个域名问题上,它们行为是一样的,所以下面仅以 proxy_pass 为例。

一个最简单的反向代理配置如下:

server {
    location / {
        proxy_pass https://github.com;
    }
}

1.2、域名解析

其作用是将所有请求转发到 github.com。注意此处写的是域名,而非 IP。我们知道在真正发起请求前,是需要将域名解析成 IP 的,对于 github.com 来说,在我的环境上它会被解析成两个 IP:192.30.253.112 和 192.30.253.113,TTL 都是 50s,如下图:

那么使用上面这个配置,nginx 是什么时候做这件事情的呢?答案是启动的时候,只做一次,解析结果会被缓存下来,也就是完全无视 TTL,后续所有的请求转发,都是直接使用缓存下来的 IP,不会再做任何域名解析。对于 github.com 这种返回多个 IP 的情况,nginx 在转发时会自动对 IP 列表进行轮转。

可以使用 sudo tcpdump -n -i any port 53 抓包来验证这个行为。注:53 是 DNS 服务的默认端口。

那么问题来了,IP 变了怎么办?有什么办法让 nginx 自动重新解析域名吗?

1.3、配置动态域名解析

resolver 8.8.8.8;

server {
    location / {
        set $servers github.com;
        proxy_pass http://$servers;
    }
}

如上,通过使用变量($servers)的方式可以强制 nginx 遵守域名解析结果的 TTL,过期后自动重新解析。不过这种写法有个副作用,如此配置后 nginx 不会自动使用系统 /etc/resolve.conf 的配置,此时必须使用 resolver 指令手动给它指定一个 DNS 服务器。

  其中 8.8.8.8是谷歌的开源免费DNS,国内的有114.114.114.114.如果是内网域名,需要制定内网的DNS服务器。

参看地址:

  在 nginx 反向代理中使用域名 · Issue #4 · inetfuture/blog · GitHub

  https://www.nginx.com/blog/dns-service-discovery-nginx-plus/ 

二、反向代理

  注意设置proxy_pass 后,同时需要设置proxy_set_header

proxy_set_header Host js.test.com; 
proxy_pass http://js.test.com/; 

2.1、nginx location proxy_pass 后面的url 加与不加/的区别

  在nginx中配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走。 

  在nginx中配置proxy_pass时,如果是按照^~匹配路径时,要注意proxy_pass后的url最后的/,当加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走。

首先是location进行的是模糊匹配

  1)没有“/”时,location /abc/def可以匹配/abc/defghi请求,也可以匹配/abc/def/ghi等

  2)而有“/”时,location /abc/def/不能匹配/abc/defghi请求,只能匹配/abc/def/anything这样的请求

下面2种情况分别用http://192.168.1.1/proxy/test.html 进行访问。

1、proxy_pass后有 / 绝对路径 不带走 location 路径

location  /proxy/ {
    proxy_pass http://127.0.0.1:81/;
}

结论:会被代理到http://127.0.0.1:81/test.html 这个url

扩展1、

location  /proxy/ {
    proxy_pass http://127.0.0.1:81/ftlynx/;
}

结论:会被代理到http://127.0.0.1:81/ftlynx/test.html 这个url。

扩展2、

location  /proxy/ {
    proxy_pass http://127.0.0.1:81/ftlynx;
} 

结论:会被代理到http://127.0.0.1:81/ftlynxtest.html 这个url

2、proxy_pass 后没有 / ,带走location路径

location  /proxy/ {
    proxy_pass http://127.0.0.1:81;
}

结论:会被代理到http://127.0.0.1:81/proxy/test.html 这个url

3、可以通过的rewrite来实现/的功能

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx反向代理proxy_pass 的相关文章

  • 是否可以使用 nginx 合并两个 json 响应?

    我有一个现有的快速端点 如下所示 app get route id async req res gt try const id req params id const result await dbFn id res send result
  • 如何在c++中使用libcurl发送POST请求并接收它?

    我正在使用 c libcurl 向网页发送 POST 请求 但我正在努力测试它 使用的代码是 include
  • 错误:最终加载程序(./node_modules/awesome-typescript-loader/dist/entry.js)未返回缓冲区或字符串

    dockerhub构建dockerfile时出现此错误 错误 最终加载程序 node modules awesome typescript loader dist entry js 未返回缓冲区或字符串 我在网上搜索了各种解决方案 但没有找
  • 不加载隐藏图像

    我的网站上有一堆隐藏图像 它们的容器 DIV 具有 style display none 根据用户的操作 某些图像可能会通过 JavaScript 显示 问题是我的所有图像都是在打开页面时加载的 我想通过仅加载最终可见的图像来减轻服务器的压
  • Rails api 中阻止用户配置文件的最佳 HTTP 状态代码是什么?

    我在 Rails 中为社交应用程序编写了一个 API 这个应用程序就像Facebook一样 用户可以阻止其他用户 如果用户 A 阻止用户 B 则用户 B 无法查看用户 A 的个人资料页面 那么我应该返回的最佳 HTTP 代码状态是什么 40
  • 为什么将域连接到“Shopify”需要 CNAME 和 A 记录?

    为什么将域连接到 Shopify 需要CNAME and ARecord ref https help shopify com en manual domains add a domain using existing domains co
  • Flex HTTPservice 和 POST,发送文件?

    我使用基本的 Post 将数据发送到 Django 服务器 数据由flex动态创建的base64编码的640 380 PNG图像组成 成分
  • 哪些具体用例需要通过 WebSockets 和长轮询使用 BOSH? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • eBay API 调用不适用于 UPC/EAN

    eBay 的 API findItemsByProduct 操作适用于 UPC 和 EAN 但不幸的是它不起作用 例如 下面的 HTTP GET 请求会抛出 无效的产品 ID 值 错误41 Note 请将 SECURITY APPNAME
  • 禁用 Kubernetes NGINX 入口的 SSL 重定向

    默认情况下 在 Kubernetes NGINX 入口中启用 SSL 重定向 如何禁用此功能 目前的实施如下 apiVersion extensions v1beta1 kind Ingress metadata name project
  • nginx 解析器——dns

    请原谅一个非常初学者的问题 我无法理解 nginx 的 解析器 参数及其工作原理 我已阅读文档 搜索教程和帖子 使用解析器 nginx 和 dns 等关键字 但我仍然不确定如何应用解析器 http nginx org en docs htt
  • NGINX 和 Spark Java 之间的跨源通信

    我正在将 NGINX 和 Sparkjava 用于我的 Web 应用程序 我确信我已正确启用所有 CORS 标头 尽管如此 我还是得到了 XMLHttpRequest 无法加载http localhost 3003 platformAPI
  • Response.Redirect 并不总是重定向

    我们在一个工作不一致的页面上有一个简单的 Response Redirect IIS 6 0 大多数情况下 它会正确重定向 但我们收到一些用户抱怨 他们没有重定向 而是看到 302 对象移至此处 页面 该页面显示标题信息以及正确的位置 如果
  • Nginx 作为负载均衡器,具有 75% 和 25% 加权路由

    我是 Nginx 新手 我有两台服务器 serverA 和 serverB 我希望 75 的请求发送到 serverA 其余 25 的请求发送到 serverB 这可能吗 使用nginx加权路由 stream upstream stream
  • 如何解析来自基于 C 的 Web 服务器的 HTTP 请求

    我有一个编程项目 我必须创建一个处理 HTTP 请求的多线程 Web 服务器 我刚刚学习了套接字编程 并且运行了一个客户端和一个服务器 我想知道解析 HTTP 请求标头的最佳方法是什么 我看到了这个 如何用C 解析http请求 https
  • Java Junit 测试 HTTP POST 请求

    我需要测试以下方法而不改变方法本身 该方法向服务器发出 POST 方法 但我需要制作一个独立于服务器的测试用例 在将其重定向到本地文件之前 我测试了类似的方法 但为此我将协议指定为文件 主机名指定为 localhost 端口指定为 1 我的
  • Angular2:动态同步http请求

    Goal 发出一系列同步 http 请求并能够将它们作为一个可观察流进行订阅 示例 不工作 let query arr test1 test2 test3 function make request query arr if query a
  • Django:如何测试“HttpResponsePermanentRedirect”

    我正在为我的 django 应用程序编写一些测试 在我看来 它使用 HttpResponseRedirect 重定向到其他一些网址 那么我该如何测试呢 姜戈TestCase类有一个方法assertRedirects https docs d
  • 如何在PHP中完成http响应并进行进一步处理?

    就我而言 我需要向客户端回显一个标志并发送一封电子邮件 现在客户端需要等待电子邮件发送 但我想把这两个步骤分开 该怎么做呢 你可以看一下异步运行 PHP 任务 https stackoverflow com questions 858883
  • nginx - 使用 ssl 支持设置多个 server_name

    我很想使用 nginx 来为具有多个域名和 SSL 的网站提供服务 webmail example com webmail beispiel de 两者都使用相同的虚拟主机 因此我只设置 server name 两次 问题是 我需要 ngi

随机推荐

  • 启元世界内推招聘(对标阿里P6-P7)

    推荐系统架构师 岗位职责 负责游戏推荐系统的需求分析 系统设计 负责应用系统平台的可行技术设计 方案 指导和优化技术选型 负责推荐算法策略线上化 系统化实现在线服务 优化平台线上性能 负责线上平台的稳定性保障 负责推动应用系统的技术升级与研
  • 懂编译真的可以为所欲为

    作者 闲鱼技术 玉缜 背景 整个前端领域在这几年迅速发展 前端框架也在不断变化 各团队选择的解决方案都不太一致 此外像小程序这种跨端场景和以往的研发方式也不太一样 在日常开发中往往会因为投放平台的不一样需要进行重新编码 前段时间我们需要在淘
  • SAE安装第三方插件

    参考官网 http sae sina com cn doc python tools html saecloud 首先要安装sae python dev 1 3 2 tar gz 然后把官网的原话copy上来 在应用目录中执行下面的命令安装
  • 点云密度计算方法matlab,点云中的几何计算及matlab源码

    1 计算法向量 2 计算曲率 曲线的曲率 curvature 就是针对曲线上某个点的切线方向角对弧长的转动率 通过微分来定义 表明曲线偏离直线的程度 数学上表明曲线在某一点的弯曲程度的数值 曲率越大 表示曲线的弯曲程度越大 曲率的倒数就是曲
  • jdbc:mysql:replication_使用Mysql的Replication功能实现数据库同步

    本文档仅在于实验Mysql的Replication功能 没有考虑权限等其他问题 用于实验的服务器和客户机请使用没有安装过Mysql的计算机 如果安装过Mysql请卸载 请按照下面的顺序依次进行 改变顺序可能导致实验失败 1 在下面地址下载免
  • 会议OA项目---我的审批(审批&会议签字)

    目录 一 会议审批 二 会议签字 三 签名裁剪 一 会议审批 我的审批 实体类MeetingAudit package com zking entity import java io Serializable import java uti
  • C语言经典例题-贷款余额

    编程计算第一 第二 第三个月还贷后剩余的贷款金额 include
  • Revit二次开发——选集

    选集 选集 用户选集 过滤的用户选集 选集 选择图元后运行外部命令获取选择的内容 Revit API中定义了单选 多选 框选等方式的用户选集 用户可以十分方便的使用鼠标和键盘完成这三种方式的图元选择 Revit API根据三种用户选集各自的
  • 设系统中有三种类型的资源(A,B,C)的五个进程(P1,P2,P3,P4,P5)。A资源的数量为17,B资源的数量为5,C资源的数量为20。在T0时刻系统状态如表所示。

    银行算法应用 题目 设系统中有三种类型的资源 A B C 的五个进程 P1 P2 P3 P4 P5 A资源的数量为17 B资源的数量为5 C资源的数量为20 在T0时刻系统状态如表所示 系统采用银行家算法实施死锁避免策略 试问 1 T0时刻
  • centos7启动服务uthorization not available. Check if polkit service is running or see debug message for

    事件经过 有一次远程帮助别人解决的一个问题 当时那个人给发了一个samba服务启动报错的截图 还有一个翻译图 报错信息中提到了一个polkit服务 下面先普及一下关于这个服务的知识 polkit是一个应用程序级别的工具集 通过定义和审核权限
  • 浅析存储引擎(3)-B-tree

    浅析日志结构的存储引擎 1 bitcask浅析日志结构的存储引擎 2 SSTable和LSM Tree 前面两篇文章介绍了比较好理解的日志结构引擎LSM Tree 但它们不是最常见的索引类型 目前最广泛使用的索引结构是B tree B tr
  • input函数和int函数的使用

    第一 input函数接受一个标准输入数据 返回str类型 第二 int函数可以把str强制转换为整形 第三 int input ps 最近搞深度学习的视频 但是依然需要实操
  • 2023华为OD机试真题-寻找关键钥匙(JAVA、Python、C++)

    题目描述 小强正在参加 密室逃生 游戏 当前关卡要求找到符合给定 密码K 升序的不重复小写字母组成 的箱子 并给出箱子编号 箱子编号为1 N 每个箱子中都有一个字符串s 字符串由大写字母 小写字母 数字 标点符号 空格组成 需要在这些字符串
  • Webview setLayoutAlgorithm

    表示这个东西还是不用的为好 前端工程师会为自己的弹出框设置好位置 不必要手机端再来做弹出框的设置 要不就直接弹出原生弹出框 第一种 java WebSettings settings webView getSettings settings
  • TenSEAL学习笔记二

    文章目录 Training and Evaluation of Logistic Regression on Encrypted Data Download the coronary heart disease dataset Initia
  • 华为机试(JAVA)真题Od【A卷+B卷】2023

    目录 华为OD机试是什么 华为OD面试流程 华为OD机试通过率高吗 华为OD薪资待遇 华为OD晋升空间 大家好 我是哪吒 本专栏包含了最新最全的华为OD机试真题 有详细的分析和Java代码解答 已帮助1000 同学顺利通过OD机考 发现新题
  • gdb+gdbserver远程调试

    gdb gdbserver远程调试 文章目录 gdb gdbserver远程调试 一 gdb gdbserver交叉编译 1 源码下载 2 编译gdb 3 交叉编译gdbserver 二 远程使用gdbserver 1 attach调试运行
  • 为什么闹钟设置了却不响_手机闹钟不响是怎么回事 怎么设置闹钟【图文】

    手机大家都比较了解吧 手机由之前的来款式手机发展到了现在的4G大屏手机 这就是时代进步的见证 手机有很多的功能 但是今天小编给大家介绍的这个功能虽说不是什么 高科 技的功能 但是它确实最实用的 尤其是对于我们这些每天工作或者学习的人来说 这
  • Microsoft Visual C++下载,VC++下载

    Microsoft Visual C 2019 v14 28 29617 Microsoft Visual C Redistributable 系统运行库 简称MSVC VB VC 是Windows操作系统应用程序的基础类型库组件 Micr
  • Nginx反向代理proxy_pass

    一 概述 代理 proxy 即中间人 它代替客户端发送请求给服务器 收到响应后再转给客户端 通常意义上的代理是从用户的角度讲的 用户通过某个代理可以访问多个网站 这个代理是靠近用户的 比如某些公司可能需要限制员工所访问的网站 就会在网络出口