Maison >php教程 >php手册 >lua nginx 指令顺序

lua nginx 指令顺序

WBOY
WBOYoriginal
2016-06-06 20:13:341503parcourir

十一回来的任务就是学习 lua, agentzh; chaoslawful http://openresty.org/download/agentzh-nginx-tutorials-en.html http://wiki.nginx.org/HttpLuaModule auth_request: auth_request directive discards the response body of the subrequest it manages

十一回来的任务就是学习 lua, agentzh; chaoslawful

 http://openresty.org/download/agentzh-nginx-tutorials-en.html
 http://wiki.nginx.org/HttpLuaModule

auth_request:

   auth_request directive discards the response body of the subrequest it manages, and only checks 
the response status code of the subrequest. When the status code looks good, like 200, 
auth_request will just allow Nginx continue processing the main request; 
otherwise it will immediately abort the main request by returning a 403 error page,   
      location /main {                                                        
        set $var main;                                                      
        auth_request /sub;                                                  
        echo "main: $var";                                                  
    }                                                                       
    location /sub {                                                         
        set $var sub;                                                       
        echo "sub: $var";                                                   
    } 
   curl http://localhost:518/main
   结果:main : sub

nginx 指令顺序:

   location /test {                                                        
        set $a 32;                                                          
        echo $a;                                                            
        set $a 56;                                                          
        echo $a;                                                            
    } 
 curl -i http://locahost:516/test
 56
 56

这个和我接触过的语言有很大的不一样,为什么会导致这种情况呢,这就要看nginx 的请求处理阶段了.

先看三个阶段执行顺序:

  1.rewrite : set;set_unescape_uri;set_by_lua;
  2.access : access_by_lua(tail);
  3.content  : echo;ngx_auth_request;content_by_lua
  rewrite_by_lua :phase->rewrite tail(这个可能会导致你期待的结果和实际结果不一致)
  more_set_input_headers: phase->rewrite tail

nginx 分属于不同阶段处理的配置指令之间是不能穿插运行的

对两个字符串作加法运算会触发 Lua 对加数进行自动类型转换(Lua 会把两个加数先转换为数值类型再求和) 或者使用 tonumber()

即使运行在同一个请求处理阶段,分属不同模块的配置指令也可能会分开独立运行(除非像 ngx_set_misc 等模块那样针对 ngx_rewrite 模块提供特殊支持)

Nginx 的 rewrite 阶段是一个比较早的请求处理阶段,这个阶段的配置指令一般用来对当前请求进行各种修改(比如对 URI 和 URL 参数进行改写),或者创建并初始化一系列后续处理阶段可能需要的 Nginx 变量。当然,也不能阻止一些用户在 rewrite 阶段做一系列更复杂的事情,比如读取请求体,或者访问数据库等远方服务,毕竟有 rewrite_by_lua 这样的指令可以嵌入任意复杂的 Lua 代码。

nginx 内部标准变量:

   $remote_addr 获取字符串形式的 客户端Ip地址

绝大多数 Nginx 模块在向 content 阶段注册配置指令时,本质上是在当前的 location 配置块中注册所谓的“内容处理程序”(content handler)。每一个 location 只能有一个“内容处理程序”,因此,当在 location 中同时使用多个模块的 content 阶段指令时,只有其中一个模块能成功注册“内容处理程序”

proxy_pass 和 echo 不能同时在一个 location 中

Nginx 处理请求的过程一共划分为 11 个阶段,按照执行顺序依次是

   post-read、server-rewrite、find-config、rewrite、post-rewrite、
    preaccess、access、post-access、try-files、content 以及 log.
  1. ngx.arg ,在那个里面的example 有个错误,

    location /foo {
    set $a 32;
    set $b 56;
    set_by_lua $res
        'return tonumber(ngx.arg[1]) + tonumber(ngx.arg[2])'
        $a $b;
    echo $sum;
    } 你自己运行一下就会发现问题了 ,改一下变量名称就可以了,这个错误已经报告给春哥,春哥回复已经修改了
    
  2. ngx.ctx 里面

    location /test {
    rewrite_by_lua '
        ngx.say("foo = ", ngx.ctx.foo)  ---1
        ngx.ctx.foo = 76
    ';
    access_by_lua '
        ngx.ctx.foo = ngx.ctx.foo + 3
    ';
    content_by_lua '
        ngx.say(ngx.ctx.foo)   ---2
    ';
    }
    按照他的我没有得到他介绍的值,我只能单独的到--1,或者--2的值;
    

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn