nginx(八十三)error_page、proxy_intercept_errors深究

这篇具有很好参考价值的文章主要介绍了nginx(八十三)error_page、proxy_intercept_errors深究。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一  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暂时不处理上游的'相应状态码'

nginx(八十三)error_page、proxy_intercept_errors深究 

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

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

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

nginx(八十三)error_page、proxy_intercept_errors深究 

nginx(八十三)error_page、proxy_intercept_errors深究 

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

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

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

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

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

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

nginx(八十三)error_page、proxy_intercept_errors深究 

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

synax: [=code]

nginx(八十三)error_page、proxy_intercept_errors深究 

nginx(八十三)error_page、proxy_intercept_errors深究 

nginx(八十三)error_page、proxy_intercept_errors深究 

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

synax: '='

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

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

nginx(八十三)error_page、proxy_intercept_errors深究

nginx(八十三)error_page、proxy_intercept_errors深究 

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

nginx(八十三)error_page、proxy_intercept_errors深究 

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

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

nginx(八十三)error_page、proxy_intercept_errors深究 

nginx(八十三)error_page、proxy_intercept_errors深究 

nginx(八十三)error_page、proxy_intercept_errors深究 

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

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

nginx(八十三)error_page、proxy_intercept_errors深究

④  error_page深入探究

recursive_error_pages

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

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

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

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

nginx(八十三)error_page、proxy_intercept_errors深究 

nginx(八十三)error_page、proxy_intercept_errors深究

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

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

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

nginx(八十三)error_page、proxy_intercept_errors深究

nginx(八十三)error_page、proxy_intercept_errors深究 

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

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

nginx(八十三)error_page、proxy_intercept_errors深究 

nginx(八十三)error_page、proxy_intercept_errors深究  

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

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

淘宝limit_req_zone细讲

nginx(八十三)error_page、proxy_intercept_errors深究

nginx(八十三)error_page、proxy_intercept_errors深究 

④  error_page和proxy_next_upstream混合使用

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

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

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

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

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

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

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

nginx(八十三)error_page、proxy_intercept_errors深究

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) 明天上述三个案例'遗留'讲解

文章来源地址https://www.toymoban.com/news/detail-474084.html

到了这里,关于nginx(八十三)error_page、proxy_intercept_errors深究的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 知识笔记(八十三)———链式语句中cache和comment用法

    cache方法用于查询缓存操作,也是连贯操作方法之一。 cache 可以用于 select 、 find 、 value 和 column 方法,以及其衍生方法,使用 cache 方法后,在缓存有效期之内不会再次进行数据库查询操作,而是直接获取缓存中的数据,关于数据缓存的类型和设置可以参考缓存部分。 下面举

    2024年01月21日
    浏览(36)
  • 软考高级系统架构设计师系列论文八十三:论软件设计模式的应用

    软考高级系统架构设计师系列之:面向构件的软件设计,构件平台与典型架构

    2024年02月11日
    浏览(67)
  • nginx(八十五)nginx的启动流程

    一    如何控制nginx ①  基础知识 kill -l信号列表   信号列表 ②  控制nginx nginx热更新涉及的信号量 reload流程 nginx: worker process is shutting down 资源不释放 reload的热部署和日志切割  从压测碰到的诡异断连问题聊聊nginx的连接管理  ③  nginx命令行参数 二    nginx的启动流程 ①

    2024年02月07日
    浏览(37)
  • Android14之Selinux报错:unknown type qemu_device at token (一百八十三)

    简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏: Audio工程师进阶系列 【 原创干货持续更新中…… 】🚀 优质专栏: 多媒体系统工程师系列 【 原创干货持续更新中…… 】🚀 人生格言: 人生从来没有捷径

    2024年03月13日
    浏览(59)
  • 微软用它取代了`Nginx`吞吐量提升了百分之八十!

    Azure应用服务用YARP取代了Nginx,获得了80%以上的吞吐量。他们每天处理160B多个请求(1.9 m RPS)。这是微软的一项了不起的技术创新。 首先我们来介绍一下什么是Yarp YARP(Yet Another Reverse Proxy)是一个开源的、高性能的反向代理库,由Microsoft开发,使用C#语言编写。它旨在作为.NE

    2024年02月02日
    浏览(44)
  • Android笔记(二十三):Paging3分页加载库结合Compose的实现分层数据源访问

    在Android笔记(二十二):Paging3分页加载库结合Compose的实现网络单一数据源访问一文中,实现了单一数据源的访问。在实际运行中,往往希望不是单纯地访问网络数据,更希望将访问的网络数据保存到移动终端的SQLite数据库中,使得移动应用在离线的状态下也可以从数据库中

    2024年01月16日
    浏览(39)
  • 微软用它取代了 Nginx 性能提升了百分之八十!这也也太牛逼了吧

    戳下方名片,关注并 星标 ! 回复“ 1024 ”获取 2TB 学习资源! 大家好,我是民工哥! 提到反向代理软件,大家肯定第一时间想到是:Nginx,没错,Nginx确实是一款非常优秀的反向代理软件,很多大厂都在使用,比如:微软。 不过,目前微软用它取代了 Nginx ,使得吞吐量提升

    2024年01月16日
    浏览(43)
  • Error: module ‘pages下某.js‘ is not defined 微信小程序

    解决问题: 【1】In strict mode code, functions can only be declared at top level or inside a block解决微信小程序中pages下某js文件is not defined问题 【2】解决微信小程序中pages下某js文件is not defined问题 报错结果如下:  问题代码:  问题在于在此代码外没有Page({ }),导致了严格模式下出现错

    2024年02月13日
    浏览(39)
  • selenium:Message: unknown error : session deleted because of page crash

    使用 Python selenium 写的代码,在服务器上运行报错: Python 3.10.6 CentOS Stream 8 feapder==1.8.3 selenium==4.6.0 crawlab v0.6.0-2 添加如下参数即可! 这将强制 Chrome 改为使用该/tmp目录。这可能会减慢执行速度,因为将使用磁盘而不是内存。

    2024年02月14日
    浏览(41)
  • 解决错误Whitelabel Error Page This application has no explicit mapping for /error(Method Not Allowed405)

    在提交表单数据的时候,由于控制器controller中mapper处理头映射错误,导致出现PUT405错误代码。 修复的方法有: ①修改URL映射链接和映射方式 ②如果URL没问题的话,可能是没有添加springboot的全局扫描,导致映射失败. 进入SpringbootApplication代码中查看是否添加全局扫描@MapperS

    2024年02月11日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包