nginx(八十二)try_files、content阶段深入探究

一  try_files、content阶段、outfilter再探

①  哪些人适合阅读

适合: 拿nginx作为'静态服务器'网站'前端'人员必备,后端程序员可以'选择性的忽略'

备注: 该篇一个'阶段性'的总结,后续'不再'探讨该部分

补充: 按照'try_files'、'content'阶段的'模块指令'的'执行顺序'讲解

强调: 本文'不具有实际意义',只是试图从'应用层现象'来解读运行机制

①  相关博客系列

备注:学习要有一个'过程',不可能'一蹴而就',下面的博客记录了我的'成长史',某一个时刻就'豁然开朗'

root、alias、index、try_files关系指令再探

precontent阶段的模块学习 核心try_files指令

content阶段index和autoindex模块学习

content阶段static模块学习

filter模块处理

章亦春大神的nginx权威参考

③  content阶段涉及模块指令处理顺序

1) 本次'只探讨'try-files、content阶段,附加'filter'系列模块

2) content 阶段是'所有请求处理阶段中'最为'重要'的一个

特点: 因为运行在'这个阶段'配置指令一般都肩负着生成"内容(content)"并输出'HTTP 响应'的使命

强调: 当存在"content handler 内容处理程序"的指令时,'静态资源服务模块'并'不会'起作用

3) 绝大多数 'nginx 模块'在向 'content 阶段' 主动'注册配置指令'时

重点: 本质上是在'当前的 location 配置块'中'注册'所谓的"内容处理程序(content handler)"

常见: ngx_echo模块 ["echo指令"]、ngx_proxy ["proxy_pass"]

强调: 
 
  [1]、每一个 location 只能有一个"内容处理程序"

  [2]、当在 location 中同时'使用多个模块'的 content 阶段指令时

  [3]、只有'其中一个模块'能成功注册"内容处理程序"

4) 如果location中'没有'使用在 content 阶段'注册的'模块指令,也即没有'content handler'

  [1]、处理权便'自动'落到了在 content 阶段"垫底"的那 '3个'静态资源服务模块

  [2]、首先运行的 'ngx_index' 和 'ngx_autoindex' 模块

  特点: 如果'当前请求的uri'是'以 / 结尾',就会使用对应'index'和'autoindex'指令

  [3]、否则直接'弃权',将处理权转给了最后运行的 'ngx_static' 模块

  特点: ngx_static 模块根据 '(root|alias) 指令'将'请求$uri' 映射为'文件系统'路径 

  备注: 这个模块主要实现'服务静态文件'的功能,也是nginx作为'web服务器'的核心

  [4]、在确认'磁盘中'文件'存在'后,将它们的内容分别作为响应体输出,并自动设置'相应'响应头

  备注: 如果'文件不存在',则返回'404',这才是'资源不存在'

5) 有的'模块'指令是'默认提供的',有的模块'没有指定',则'跳过'这个模块

备注:有些指令作用'对应地方'也能改变'11个阶段'

6) nginx '变量'则经常扮演着在'指令间'乃至'模块间'传递'小份数据'的角色

7) ngx_index、ngx_autoindex、ngx_static模块执行'顺序'和'处理特点'对比:

  [1]、ngx_index 和 ngx_autoindex 模块都'只会'作用于那些$uri以'/结尾'的请求

  [2]、对于'不以/结尾的请求'则会直接'忽略',同时把处理权移交给'ngx_static 模块'

  [3]、而'ngx_static 模块'则刚好相反,直接'忽略'那些 $uri 以 '/ 结尾'的请求

    1、'真正'把相应的'内容(正常|异常)'发送出去,还是得靠这个 'ngx_static 模块'来完成

    2、所作的操作:即把'该文件的内容'作为响应体数据输出,并设置相应的'响应头'

④  try_files指令再探

知识铺垫

1)precontent'阶段':

  特点: 这个阶段'专门'用于实现标准配置指令'try_files'的功能,'不'支持nginx模块注册处理程序

  默认: '没有'指定'try_files',所以'precontent'阶段默认'不存在'

2) 语法: try_files file1 file2 ... '(uri|=code)'

  本文: 对'try_files'各种行为的探究

  备注: 支持'@location'这种'uri'

  补充: 这里的'file1,file(n-1)'等指的是'资源对象(file|directory)'

  最佳实践: try_files $uri $uri/ @wzj;

3) 细节点:'try_files'通过'alias|root'、'$uri'、'location'来判断文件系统对象是否存在

4) 探究案例:

 [1]、文件资源'存在'

 [2]、文件'不'存在,'目录资源'存在

 [3]、前'N-1'个都不存在,'uri|=code'进行匹配

 备注: 读者应该'注意'各个案例的'前提条件[上下文]'

 观察: 'debug日志'输出,并'分析'

案例1:try_files file '文件'存在时,使用'content handler'和'默认content'行为'对比'实验

+++++++++++++++++++++ "分割线" +++++++++++++++++++++

案例2: try_files file '目录资源对象'存在时

备注: 使用'content handler'和'默认content'行为'对比'实验

++++++++++++++++ "分析过程" ++++++++++++++++

1) nginx 在 try-files 阶段发现'第一个参数 /wzj' 对应的'文件 file'不存在

2) 就会转向检查'第二个参数 /wzj/'对应的'文件系统对象'

3) 由于'此目录'存在,并且'$uri'不是以'/'结尾的

细节: 此时nginx就会把当前请求'uri 改写'为第'二个参数的值(不带末尾/)',即$uri为'/wzj'

注意: try_files '原始'参数值是 /wzj/,但 try_files 会自动'去除末尾'的'斜杠/'字符

4) 由于是一个'目录'资源,nginx会进行'301重定向',并返回'Location: $uri/'

过程:此时$uri不是以'/'结尾,所以'index、autoindex'指令对应的模块不起作用,ngx_static处理

强调:

  [1]、实际'try_files 非internal命中',还是会向下'处理','index、autoindex'被忽略

  [2]、ngx_static会不是以'/'结尾的'$uri'映射的'文件'或'目录'做不同处理

备注: 理解上可以认为'约等于' 'rewrite ^ $uri/ permanent;'这种'相对'重定向

5) 接着'基于新的url',从客户端重新发起'重定向'请求

6) 在'try_files'由于'第二个参数 /wzj/'匹配判断是'目录',并且$uri是以'/'结尾

7) 此时转交到'ngx_index'模块,由于'此时映射的系统文件不存在',继续'ngx_autoindex'模块

8) 由于上述处理'/'结尾的'$uri'的两个模块没作用,'ngx_static'模块又处理不了以'/'结尾$uri

9) 此时返回'默认'内置的'403'的页面

说明: 下面的是'重定向'请求的'error.log'日志

备注: 同时给出了'$uri以/'结尾,并且'try_files directory'匹配的场景

 

对比实验: 基于'案例2',前提'条件不变',修改'相对重定向'的策略,观察结果

双层nginx 转发下的 try_files 指令 301 返回错误的 location 地址    try_files导致301

  

对比实验: 基于'案例2',使用'content handler'

强调: 

  1) 即使是'try_files $uri/'判断'目录资源存在',也会继续进行'content'阶段的处理

  2) 所不同的是经过模块注册的'content handler',还是'nginx内置默认的content'

对比实验: 基于'案例2',基于'Location 301'使用'exact location'

案例3: 最后一个'uri'起作用

备注: 

  1) '普通uri'         --> '$args'会丢失     -->   'rewrite ^ /java? last'

  2) '命名location'    --> '$args'不会丢失    -->  'rewrite ^ /java last'

1)  try_files 指令本质上只是'有条件'地改写当前'请求的 URI'

2)  这里说的"条件"其实就是文件系统上的'对象(file|directory)是否存在'

3)  当"条件"都不满足时,它就会无条件地发起一个指定的"内部跳转"

备注: 除了无条件地发起'内部跳转'之外,try_files指令还支持直接返回指定状态码'HTTP 错误页'

案例4: 最后一个'=code'起作用,观察'add_header'行为

说明: 从语义上来说,一般使用'404'返回指定状态码的 'HTTP 错误页'

思考: try_files可以指定'哪些'状态码? 

备注: 自己尝试过'401'、'301(没有Location)'、使用'20(0|6)'不报错但'阻塞'、'204'是ok

遗留: 如果指定'error_page' 相同'状态码'是否能补获?  --> "会"

⑤  index指令再探

思考1: 什么场景会触发'index'指令的执行?  --> 假定在一个'location'内

  前提: 没有其它模块注册'content handler',并且'$request_uri'以'/'结尾

  [1]、'$request_uri'中以'/'结尾,但'没有'指定'try_files'

    补充: 'try_files directory'映射系统资源'存在',虽然会改变'$uri',但是会去掉末尾的'/'

  强调: 上述是'触发 index'的充分不必要条件,并不意味着'index ...'能命中,只是'有机会'执行

  附加: ngx_index 和 ngx_autoindex 模块都只会作用于那些 '$request_uri以/结尾'的请求

思考2: index指令是'如何执行'的?

  [1]、依次判定'指定的首页文件'是否存在?  --> 基于'(root|alias)'判定

  [2]、如果全都'不存在'则进行'ngx_autoindex'模块,要不返回'文件列表',要么返回'403'

  [3]、如果存在'指定的首页文件',则基于该'$uri$index_value'发起'internal'内部跳转

    备注: 此时index 后续的'value'不再执行,并且'该次内部请求'的'后续阶段'也不再执行

问题1: 为什么我配置的'index'首页却不生效?

  原因: 

       1) 由于'location'优先级原因,进不到之前的'location'中导致异常

       2) index 指定的'首页'

  场景: 'ngx_index 模块'主要用于在'文件系统目录中'自动查找'指定的首页'文件

  思考: 如何才能真正'设置首页'与我们的'预期相符'呢?

案例:

  1)案例1:'index .. 匹配不上',观察行为   --> 才有可能轮到'autoindex'指令执行

  2)案例2:'index .. 匹配上',只使用一个'location'观察行为

  3)案例3:'index .. 匹配上','定义新的 location',观察匹配行为

merge_slashes 

 

1) 'try_files directory[/kafka/]' 改变了'$uri',同时导致301 'Location $uri/'

2) 继续发起请求'/kafka/'进行'index index.html'匹配,'文件'存在

3) index改变'$uri'为'/kafka/index.html',此时不以'/'结尾,autoindex即使配置也无法处理

4) 最后交给'ngx_static'处理

 

与'案例1'的对比实验: 由于'location的'优先级,导致非预期的'首页'

 

与'案例1'的对比实验: index 配置的值以'/'结尾,同时'autonindex on'开启观察

 1) 第一次'index /wzj/' 查找系统资源为'目录'

   强调: 只有'index file'匹配,才会改变'$uri'

 2) 导致'$uri'变为'/kafka/wzj/',继续进行'internal'重定向行为

   官方: 只有'index (file|dir)'不存在,才会执行'autoindex',index'优先级'高
   
   大白话: 只要'index (file|dir)'匹配上,永远不会执行'autoindex'
       
 3) 通过'add_header或error.log'观察

   说明: 'index dir'场景

 

 

与上述的'对比'实验: 配置文件'不变',改变'前提条件',请求url'不变'

说明: 注意'autoindex on'执行的'条件',是一个'备胎'

 

 

原文地址:https://blog.csdn.net/wzj_110/article/details/131013665

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读3.7k次,点赞2次,收藏5次。Nginx学习笔记一、Nginx 简介1. 什么是Nginx2. 反向代理3. 负载均衡4. 动静分离二、Nginx基本使用1. Nginx常用的操作命令2. Nginx的配置文件提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、Nginx 简介1. 什么是Nginx2. 反向代理3. 负载均衡4. 动静分离二、Nginx基本使用1. Nginx常用的操作命令2. Nginx的配置文件一、Nginx 简介1. 什么是Nginx  Nginx(“engine x”)是一个_nginx代理
文章浏览阅读1.7w次,点赞14次,收藏61次。我们在使用容器的过程中需,有时候需要对容器中的文件进行修改管理,如果不做文件映射的化,我们使用docker exec -it 容器ID/容器名 /bin/bash 才能进入nginx中的文件里面如图。架设在客户机与目标主机之间,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将原本要直接发送到web服务器上的http请求发送到代理服务器中。A想要组C的房子,但是A并不认识C所以租不到,但是B认识C,A找B帮忙租到了C的房子。客户端代理服务器服务器。_docker nginx 配置
文章浏览阅读1.4k次。当用户在访问网站的过程中遇到404错误时,通常情况下应该显示一个友好的错误页面,而不是仅仅显示一个简单的错误提示。在Nginx中,可以通过配置来实现404错误自动跳转到首页的功能。如果您的网站使用动态内容生成页面(如PHP或其他服务器端语言),则应相应地修改配置以适应您的网站架构。这样,当用户访问一个不存在的页面时,Nginx会自动将其重定向到首页。为了使配置生效,需要重新加载Nginx配置。首先,需要打开Nginx的配置文件。现在,当用户访问一个不存在的页面时,Nginx会自动将其重定向到首页。_nginx 404 重定向
文章浏览阅读2.7k次。docker 和 docker-compose 部署 nginx+mysql+wordpress 实战_docker wordpress mariadb
文章浏览阅读1.3k次。5:再次启动nginx,可以正常启动,可以在任务管理器中查看到nginx的进程。重新启动下 直接访问8090端口 ok 访问成功。1 :查看80端口占用情况,pid的值为3960。3:在运行中输入regedit打开注册表编辑器。2: 通过以下命令查看3960所对应的服务名称。4:找到Start,右键修改将其制改为4。_nginx80端口无法访问
文章浏览阅读3.1w次,点赞105次,收藏182次。高性能:Nginx 被设计为能够处理大量并发连接而不显著增加系统负担。它采用异步事件驱动的架构,可以有效地处理高流量的 Web 请求。负载均衡:Nginx 支持负载均衡,可以将请求分发到多个后端服务器,以提高网站性能和可用性。反向代理:Nginx 可以充当反向代理,将客户端请求转发到后端服务器,隐藏后端服务器的真实 IP 地址,增加安全性和可扩展性。静态文件服务:Nginx 可以高效地提供静态文件(如 HTML、CSS、JavaScript、图像等)的服务,减轻应用服务器的负担。
文章浏览阅读976次。nginx作为常用的web代理服务器,某些场景下对于性能要求还是蛮高的,所以本片文章会基于操作系统调度以及网络通信两个角度来讨论一下Nginx性能的优化思路。我们的大学教程大部分讲述七层模型,实际上现代网络协议使用的都是四层模型,如下图,应用层报文经过四层的首部封装到对端。对端链路层拆开首部查看mac地址是自己在网上,拆开ip首部查看目的地址是不是自己,然后到达传输层应用层完成报文接收。文章是基于原有个人知识基础上,对旧知识进行巩固,以及新知识实践学习。
文章浏览阅读5.4k次,点赞9次,收藏15次。最后再说一种情况,就是后端处理了跨域,就不需要自己在处理了(这里吐槽下,某些后端工程师自己改服务端代码解决跨域,但是又不理解其中原理,网上随便找段代码黏贴,导致响应信息可能处理不完全,如method没添加全,headers没加到点上,自己用的那个可能复制过来的并不包含实际项目所用到的,没有添加options请求返回状态码等,导致Nginx再用通用的配置就会可能报以下异常)里面的就好了,因为这里如果是预检请求直接就ruturn了,请求不会再转发到59200服务,如果也删除了,就会报和情况1一样的错误。_nginx 允许跨域
文章浏览阅读2.5k次。项目配置了多个域名,如下,php 代码中有获取的值。当访问a.demo.com时,其获取的值是符合预期的。但是当访问b.demo.com时,其获取的值还是a.demo.com,导致代码中的判断出现错误。_nginxservername多个域名
文章浏览阅读1k次,点赞2次,收藏5次。采用YAML manifest的方式来安装ingress-nginx,用registry.lank8s.cn镜像库来替换 registry.k8s.io的库。_ingress-nginx安装
文章浏览阅读1.6k次,点赞2次,收藏2次。在windows平台编译nginx_windows 编译nginx
文章浏览阅读5.8k次,点赞2次,收藏18次。nginx [engine x] 是 HTTP 和反向代理服务器、邮件代理服务器和通用 TCP/UDP 代理服务器。nginx 的特点是占有内存少,并发能力强,事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。在高连接并发的情况下,nginx是Apache服务器不错的替代品,能够支持高达50000个并发连接数的响应。使用epoll and kqueue作为开发模型。_nginx
文章浏览阅读2k次。Linux启动(systemctl start nginx)nginx服务时出现:Failed to start nginx.service: Unit not found._为什么nginx的systemctl start nginx.service不能使用
文章浏览阅读1.3k次。重启之后,打开浏览器,输入http://localhost:8900/myBaidu,这时候就会自动的跳转到百度的页面。按照我们不同的需求修改nginx文件夹中的nginx-1.16.1conf里面的nginx.conf文件。启动nginx:打开nginx的文件夹,然后双击nginx.exe文件,启动nginx。打开之后假设我们需要跳转到百度则在配置文件nginx.conf中的下面加上。1、打开任务管理器关闭nginx的进程。端口在配置文件的(下图)进行查看nginx端口。_nginx 代理百度
文章浏览阅读5.7k次,点赞5次,收藏3次。nginx重定向问题解决(rewrite or internal redirection cycle)_rewrite or internal redirection cycle while internally redirecting to "/inde
文章浏览阅读1.3k次。请注意,上述命令假设 Nginx 已经在系统的 PATH 环境变量中配置。如果没有,请提供正确的 Nginx 安装路径,或者在命令中使用完整的路径来替换。将该命令与所有 Nginx 进程的 PID 一起使用,以终止所有正在运行的 Nginx 进程。此命令将启动一个新的 Nginx 进程来重新加载配置文件并重新启动服务器。使用以下命令来终止所有 Nginx 进程(使用上面的 PID 替换。的进程以及它们的 PID。打开命令提示符(CMD)。此命令将列出所有名为。选项来强制终止进程。_windows 怎么关闭nginx
文章浏览阅读2.7k次,点赞2次,收藏7次。包括 Netflix、GitHub 和 WordPress。Nginx 可以用作 Web 服务器、负载均衡器、反向代理和 HTTP 缓存等。_ubuntu安装nginx
文章浏览阅读915次。轻松搭建短域名短链接服务系统,可选权限认证,并自动生成证书认证把nginx的http访问转换为https加密访问,完整步骤和代码。_nginx 短链代理
文章浏览阅读1.1k次,点赞35次,收藏24次。流媒体方案之Nginx——实现物联网视频监控项目Nginx是什么Nginx在流媒体方案中的位置软硬件准备移植编译Nginx运行Ngnix测试流媒体方案浏览器播放_nginx-rtmp-module
文章浏览阅读1.9k次。nginx 配置 wss 协议转发 ws 服务器_nginx 配置wss