nginx(八十三)error_page、proxy_intercept_errors深究

news2024/10/6 8:40:10

一  error_page和proxy_intercept_errors深究

强调: 本文只是基于'状态'码的角度来讨论'error_page'、'proxy_intercept_errors'差异性

题外话: 让别人'定位',一定要保留好'事故现场',尽可能的提供更多的'有用'信息

核心: 本文只讨论'错误状态码'的异常处理

遗留: 关于1xx、2xx、3xx、4xx、5xx'状态码'后续再开'几个小节'进行深入探讨

提醒自己: 不要陷入'开源软件'里面无法出来,站在'更高的维度'思考问题

①  知识铺垫

proxy模块上游出现失败时的容错方案

proxy_intercept_errors指令应用

try_files、internal、error_page指令

上游服务器出问题了,nginx 还能获取到响应吗?

error_page案例

②  问题引入

1) 目的:带着'问题'来学习,效率事倍功半

2) 问题1:$status和$upstream_status的'关联'?

  [1]、客户端'显示'的状态码、$status、$upstream_status、后端服务器的'记录'状态码关联

  [2]、nginx'特有'定义的状态码:444、497、498、499

  [3]、没有'建立'连接nginx会自身填充'(一般涉及5xx报错)'

  [4]、后端'回传'了一个nginx'不能识别'的状态码? 

3) 问题2:proxy_intercept_errors on 时,error_page 一定会处理吗?  --> "优先级"

  [1]、不一定,看'条件'

  [2]、proxy_next_upstream'默认'不会截胡,但是可以'显示'的配置'部分'状态码
  
  效果:导致拦截了'状态码',使nginx'重新尝试'与上游的另一台服务器'建立链接'

  [3]:proxy_next_upstream 能处理'tcp层'、'tls/ssl层'、'应用层(http层)'

  [4]:proxy_next_upstream'如果涉及状态码',根据处理阶段,'优先级'比error_page更高

4) 问题3:proxy_next_upstream关于'响应状态码'是针对'$upstream_staus'的吗?

  [1]、'不准确',因为'nginx与后端'可能就'没有'建立链接,但是nginx自身'填充'了相应的'数值'

  常见: 502、504,'4xx'不常见

5) 问题4:error_page 对默认针对'$status'状态码进行处理 

  [1]、error_page 默认处理的是nginx自身的一些错误状态码

  [2]、但是可以通过proxy_intercept_errors on|off控制'是否处理上游'的'错误'状态码

  [3]、error_page常见的几种'处理场景'

    1、给一个常规的静态页面'不改变状态码'

    2、给一个internal重定向'/或@的形式'

    3、'修改'状态码

③  error_page

作用: 是当发生'错误'的时候,nginx通过'状态码'进行'补获',进行'特定'的处理

备注:不一定非得是'发生错误',error_page实际是根据'状态码'进行判断,决定'是否'处理

场景:

  [1]、通常是'是否'传递'4xx和5xx'错误信息到'客户端'

  [2]、以及是否允许nginx使用'error_page'处理'错误'信息

补充: 假定'proxy_intercept_errors off',也即error_page暂时不处理上游的'相应状态码'

 

案例1:当'发生错误'的时候能够显示一个'预定义'的'uri'

备注: 通常会给其一个'静态'页面

说明: 案例1使用'普通uri',也即一旦'补获'会进行'find_location'阶段

 

 

思考: 如果'404.html'页面找不到,是否会陷入'死循环'?

建议: 保证'404.html'的'静态'页面一定存在,避免产生'其它'问题 ps: 这里404.html不存在

备注: 其他人'测试'的话,可以把'$status'也加入到里面

补充: 多个'error_page'不发生错误 ; 可以指定'多个不同的状态码'用'同一个'错误页面展示

遗留: 定义'相同状态码'在不同的error_page处理流程呢?

synax: '不加 =' 为'原错误'的状态码

 

案例2:当'发生错误'的时候能够显示一个'预定义'的'uri',并'显示[=200]'指定'返回状态码'

synax: [=code]

 

 

 

案例3:当'发生错误'的时候能够显示一个'预定义'的'uri',并通过请求'uri'的状态码作为最终状态码

synax: '='

官网'场景': uri导致反向'代理',以'后端的相应状态码'作为'最终'状态码

具体: 后端'返回'的状态码'200, 302, 401 或者 404'可以返回给'用户'

 

说明: 注意与'案例2'的区别

 

案例4:当'发生错误'的时候能够使用'@ named location'的特殊uri进行'处理'

特点: 不改变'$uri'、'request_method'、'$args'

 

 

 

案例5:当'发生错误'的时候,进行'[http|https]重定向地址跳转'

synax: error_page xxx ...  [=[30(1|2|3|7|8)]] http[s]xxx

④  error_page深入探究

recursive_error_pages

案例1: error_page死循环'10'次

1) 默认'error_page'在一次请求中'只能响应一次',这也就是'案例1'没有进入'死循环'的原因

2) 通过'recursive_error_pages on' 控制error_page能否在一次请求中'触发多次'

备注:用'案例1'也可以做'demo'

 

案例2: error_page 也支持'497'等nginx自身定义的状态码

场景: 同一个端口'同时支持'http和https

nginx实现一个对外端口同时支持http和https协议访问 

 

案例3: 移除nginx 内置 '301' 重定向行为

说明: error_page能'处理'任何'nginx'能识别的状态码,只是通常处理'非错误'状态码无意义

 

  

案例4: 设置了limit_req的'流量'限制,导致许多请求返回503错误代码,给用户'友好'提示

这里:为提高'用户体验',希望返回'正常code 200',且返回'操作频繁'的信息

淘宝limit_req_zone细讲

 

④  error_page和proxy_next_upstream混合使用

强调: proxy_next_upstream 这个指令可以在'上游服务器出现失败'的时候选择'其他'服务器

备注: 上游失败的判定有'以下'几种方式

原意: proxy_intercept_errors on 'on | off'   --> 开启之后

  [1]、当被代理的后端服务器的'响应状态码(HTTP层面)'大于300时;

  [2]、决定是否'直接'将后端响应的内容直接'不经加工'的吐出发送给客户端

  [3]、还是将响应转发给nginx由'error_page'来处理

  备注: error_page只能处理'部分'响应状态码

1) 本节只关注 500、'502'、503、504、403、'404'、429  --> 只支持'若干个'状态码

2) $upstream_satus为'502'是什么意思? --> 此时是'error'层面的还是'http'层面的

3) 疑问: 上游服务器出问题了,nginx 还能'获取'到响应吗?

4) 本文只要探究,开启'proxy_intercept_errors on',为什么'error_page'不生效

  [1]、就没有建立链接,导致'$upstream_status 502',这种是nginx填充的502

   备注: 从语意上来说应该是'error'报错,所以nginx与新上游服务器建立连接,error_page不生效

  [2]、后端'返回404',但是定义'http_404',proxy_next_upstream 优先级比 error_page高

   备注: 遇到过镜像的第一次'认证'鉴权,由于默认proxy_next_upstream

    --> 导致error_page错误'补获',进入/4xx.html,导致/被匹配,进入新的upstream

5) 明天上述三个案例'遗留'讲解

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

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

相关文章

信息系统设计与分析

系统分析师作用 1. 业务需求 现有组织结构、组织目标、管理模式 部门业务、业务流程、业务规则 业务数据、业务过程与业务管理直接关系 业务优化与业务再造要求 2. 用户需求分析 新系统改进业务要求 对新系统的愿景与期望 对新系统使用要求 3. 系统需求分析 系统应具有哪些功能…

【JavaSE】Java(五十三):核心要点总结

文章目录 1. 简要说下什么是反射2. 什么是java序列化,什么情况下需要序列化3. 为什么需要克隆,如何实现克隆,深拷贝和浅拷贝区别4. throw 和 throws 区别5. final、finaly、finalize 区别 1. 简要说下什么是反射 Java反射是指在运行时获取类信…

chatgpt赋能python:Python安装dialog介绍

Python安装dialog介绍 Dialog是一个命令行工具,可以帮助用户在Linux系统中创建自定义对话框。它可以与多种编程语言一起使用,其中包括Python。在本文中,我们将详细介绍如何在Python中安装Dialog。 安装Dialog前的准备工作 在安装Dialog之前…

Git 命令行提交代码详细操作

Git 命令行提交代码操作(安装git后,鼠标右键打开Git Bash) 1、查看本地git绑定的用户名和邮箱: git config user.name git config user.email 2、① 修改本地git绑定的用户名和邮箱(全局): git config --global user.name “Your_userName” …

案例28:基于Springboot毕业设计系统开题报告设计

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

视频直播播放器弹幕功能API

POLYV播放器拥有弹幕功能,可以增加观看视频时的互动性。 功能API 参数 参数名类型默认值说明danmuEnablebooleanfalse是否开启弹幕功能showDanmubooleantrue开启弹幕功能后,弹幕初始显示状态。false则一开始不显示弹幕。banDanmuBtnbooleanfalse为true时…

【Vue】三:Vue组件: 组件使用和组件嵌套

文章目录 1.第一个组件1.1不使用组件前1.2创建组件1.3注册组件1.4使用组件1.5 细节 2.组件嵌套 1.第一个组件 1.1不使用组件前 1.2创建组件 Vue.extends({该配置项和new Vue的配置项几乎相同})区别: (1)创建Vue组件的时候,不能使…

MySQL 查询分析

一个低效查询引发的思考 上次在做银行对账,上传对账单后,出现对账超时的情况。查看日志发现,最后一条日志记录停在了对 c2c_zwdb.t_file_count 的查询 sql 上。使用 show processlist 命令来查看当前 SQL 的执行情况,如下&#x…

说说验证码功能的实现

前言 大家好,我是 god23bin,今天说说验证码功能的实现,相信大家都经常接触到验证码的,毕竟平时上网也能遇到各种验证码,需要我们输入验证码进行验证我们是人类,而不是机器人。 验证码有多种类型&#xff…

chatgpt赋能python:使用Python安装Gensim:简单而强大的自然语言处理库

使用Python安装Gensim:简单而强大的自然语言处理库 Gensim是一个Python库,它为自然语言处理任务和文本处理任务提供了简单而强大的接口。它可以用于文本相似性计算、主题建模、词嵌入和其他自然语言处理任务。Gensim库的优点之一是其简单性和易用性。在…

评述:量子传感器正掀起一场商业革命

光子盒研究院出品 量子传感器利用原子和光的基本属性来对世界进行测量。粒子的量子状态对环境极为敏感,这对传感来说是一个优点、但对制造量子计算机来说则是一个问题。使用粒子作为探针的量子传感器可以比设计的或基于化学或电信号的经典设备更精确地量化加速度、磁…

4.3 - 信息收集 - 端口扫描,操作系统识别

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「专栏简介」:此文章已录入专栏《网络安全快速入门》 端口&系统版本 一、端口扫描1、telnet2、Nmap3、Masscan 二、操作系统…

【链表的分类】

链表是一种常用的数据结构,它由一系列节点组成,每个节点包含一个数据元素和指向下一个节点的指针。根据节点的连接方式和节点的性质,链表可以分为多种类型。 单向链表(Singly Linked List) 单向链表是最基本的链表类…

Rust每日一练(leetDay0023) 二进制求和、左右对齐、平方根

目录 67. 二进制求和 Add Binary 🌟 68. 文本左右对齐 Text Justification 🌟🌟🌟 69. x 的平方根 Sqrt x 🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Pytho…

低压安全用电云平台隐患故障的应用设计 安科瑞 许敏

前言:低压安全用电系统是保障用电质量的重要依托,也是增强用电安全性的根本依据。而在其中应用物联网技术,可进一步提升监测效率。在此之上,文章简要分析了低压安全用电系统的设计基准与监测内容,并通过科学制定系统建…

IMX6ULL裸机篇之I2C实验之从设备代码实现

一. I2C实验 本文介绍 I2C实验,关于 从设备 AP3216C传感器的I2C代码实现。 AP3216C从设备是 三合一传感器,即作为 I2C通信中从设备使用。 以下文章是关于 I2C实验,关于主控制器(即主设备)端的 I2C代码实现&#xff…

LinkedList源码

介绍 基于双向链表实现线程不安全插入删除效率较高&#xff0c;但不支持随机查找 public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, java.io.Serializable常量&变量 // 元素数量transient…

秒杀抢购案例,基于 Redis 实现

目录 1、关于全局唯一 ID 生成器 1.1 需要满足的特性 1.2 代码实现 1.3 其他的唯一 ID 生成策略 2、实现秒杀下单 2.1 超卖问题的产生 2.2 超卖问题的分析与解决 2.21 悲观锁与乐观锁 2.22 乐观锁中的两种常用方案 ▶️version 版本控制方案 ▶️CAS方案 2…

AIGC资源整理

这几个月我深入研究了AIGC&#xff0c;同时业翻阅和搜集了大量的资料&#xff0c;累计也花了1000去买了各种信息源 为了方便我的好朋友们学习&#xff0c;我将那些优质的免费信息源和工具&#xff0c;都进行了整理。 如果你也想学习AIGC、ChatGPT相关的内容&#xff0c;那么我很…

深入探索:在std::thread中创建并管理QEventLoop的全面指南

深入探索&#xff1a;在std::thread中创建并管理QEventLoop的全面指南 1. 前言&#xff1a;理解QEventLoop和std::thread的基本概念1.1 QEventLoop的基本概念和工作原理1.2 std::thread的基本概念和工作原理1.3 QTimer的基本概念和工作原理 2. 在std::thread中创建QEventLoop&a…