nginx note
Nginx 变量的创建和赋值操作发⽣在全然不同的时间阶段
Nginx 变量的创建只能发⽣在 Nginx 配置加载的时候, 或者说 Nginx 启动的时候; ⽽赋值操作则只会发⽣在请求实际处理的时候。
Nginx 变量名的可见范围虽然是整个配置, 但每个请求都有所有变量的独⽴副本, 或者说都有各变量⽤来存放值的容器的独⽴副本, 彼此互不⼲扰。 变量值(容器)是相互独立的。
变量名是全局的,变量值是请求处理相关的。
⼀个请求在其处理过程中, 即使经历多个不同的 location 配置块, 它使⽤的还是同⼀套 Nginx变量的副本。
ngx_http_core
内置变量 $uri ,$request_uri
取URI 参数的值的$arg_XXX 变量群
取 cookie 值的$cookie_XXX 变量群
取请求头的 $http_XXX 变量群
取响应头的 $sent_http_XXX 变量群
许多内建变量都是只读的。
$args 可以被修改,修改后影响$arg_XXX 变量群。
Nginx 变量是⽀持绑定“存取处理程序”的 ,类似于面向对象的类的成员变量 的“存取器”(accessor)。
Nginx 模块在创建变量时, 可以选择是否为变量分配存放值的容器, 以及是否提供与读写操作相对应的“存取处理程序”。
不是所有的 Nginx 变量都拥有存放值的容器。 拥有值容器的变量在 Nginx 核⼼中被称为“被索引的”(indexed) ; 反之, 则被称为“未索引的”(non-indexed) 。
Nginx 的请求处理阶段共有 11 个之多 。
post-read、 serverrewrite、 find-config、 rewrite、 post-rewrite、 preaccess、 access、 post-access、 tryfiles、 content 以及 log 。
rewrite 阶段、 access 阶段以及 content 阶段
绝⼤多数 Nginx 模块在向 content 阶段注册配置指令时, 本质上是在当前的 location 配置块中注册所谓的“内容处理程序”(content handler) 。
每⼀个 location 只能有⼀个“内容处理程序”, 因此, 当在 location 中同时使⽤多个模块的content 阶段指令时, 只有其中⼀个模块能成功注册“内容处理程序”。
应当避免在同⼀个 location 中使⽤多个模块的 content 阶段指令。
在⼀个 location 中使⽤ content 阶段指令时, 通常情况下就是对应的 Nginx 模块注册该location 中的“内容处理程序”。
不存在“内容处理程序”时 ,静态资源服务模块就会起作⽤ 。
默认的静态资源服务模块 :ngx_index 模块,ngx_autoindex 模块,ngx_static 模块。
ngx_index 和 ngx_autoindex 模块都只会作⽤于那些 URI 以 / 结尾的请求,⽽对于不以 / 结尾的请求则会直接忽略 。
ngx_static 模块则刚好相反。