阿小信大人的头像
做你说过的,说你能做的 阿小信大人

Nginx配置-指令的执行顺序笔记2014-09-26 19:50

worker_processes auto;
daemon off;

events {
worker_connections 256;
}

http {

server {
    listen 8080;

    # nginx的请求处理阶段共有11个(依次是post-read、server-rewrite、find-config、rewrite、post-rewrite、preaccess、access、post-access、try-file、content、log),
    # 比较常见的3个阶段是rewrite阶段, access阶段, content阶段
    # 不同处理阶段的配置指令之间是不能穿插着运行




    # 最先执行的post-read阶段在Nginx读取并解析完请求头之后就立即开始运行。
    # ngx_realip模块就是运行在post-read阶段的模块

    # 来自127.0.0.1的所有请求,都将来源地址改写为请求头中X-My-IP的值
    # Ps.没有指定X-My-IP请求头或者X-My-IP的值不是合法的 IP 地址时不会对来源地址进行改写
    # set_real_ip_from 127.0.0.1;
    # real_ip_header   X-My-IP;

    # location /addr {
    #    set $addr $remote_addr;
    #    echo "from: $addr";
    #}


    # ngx_rewrite模块的指令写在server配置块中时就会运行在server-rewrite阶段

    # find-config阶段是在根据请求匹配location配置块


    # ngx_rewrite/set写在location中时就是是rewrite阶段; ngx_echo/echo是content阶段,content阶段负责生成内容并输出HTTP响应

    location /test {
    set $a "hello";
    echo $a;        # hi

    set $a "hi";
    echo $a;        # hi
    }


    # “内部跳转”本质上其实就是把当前的请求处理阶段强行倒退到find-config阶段,以便重新进行请求URI与location配置块的配对,这个倒退动作就发生在post-rewrite阶段。


    # 标准模块ngx_limit_req和ngx_limit_zone运行在preaccess阶段,前者可以控制请求的访问频度,而后者可以限制访问的并发度


    # access阶段运行的配置指令多是执行访问控制性质的任务,比如检查用户的访问权限,检查用户的来源 IP地址是否合法等
    location /hello {
    # allow 127.0.0.1;
    deny all;           # 403

    echo "hello world";
    }

    location /hello1 {
    set $a 'hi';
    access_by_lua '
        if ngx.var.remote_addr == "127.0.0.1" then
        ngx.var.a = "hello"
        return
        end

    ';

    echo "$a world";
    }


    # post-access阶段主要用于配合access阶段实现标准ngx_http_core模块提供的配置指令ngx_core/satisfy的功能
    # 对于多个 Nginx 模块注册在access阶段的处理程序,ngx_core/satisfy配置指令可以用于控制它们彼此之间的协作方式。
    # 比如模块A和B都在access阶段注册了与访问控制相关的处理程序,那就有两种协作方式,一是模块A和模块B都得通过验证才算通过,二是模块A和模块B只要其中任一个通过验证就算通过。第一种协作方式称为all,第二种方式称为any。默认是all

    location /satisfy {
    satisfy all;  # 检验方式, all时deny不满足会被拒绝,any时,by_lua满足可以访问

    deny all;  # 总是拒绝访问
    access_by_lua 'ngx.exit(ngx.OK)'; #总是允许访问

    echo something important;
    }



    # try-files阶段专门用于实现标准配置指令ngx_core/try_files的功能
    root /home/ashin/projects/tests/nginx-lua/;
    location /try {
    try_files /t1 /t2/ /t3;
    # try_files依次检查除了最后一个参数以外的所有参数所对应的root下文件系统对象是否存在,/结尾的表示目录,其他表示文件,nginx只会检查文件系统,并不会执行uri于location之间的匹配。而最后一个参数不论是否对应文件对象总是会直接向指定的uri发起内部跳转。
    # 如果前面参数发现文件存在则立即把当前请求的uri改写为这个参数值,并不在检查后面的参数
    # 最后一个参数也可以设置为http状态码,无法匹配成功时放回HTTP错误页
    echo "uri: $uri";
    }

    location /t1 {
    echo t1;
    }

    location /t2/ {
    echo t2;
    }

    location /t3 {
    echo t3;
    }




    # 绝大多数nginx模块在向content阶段注册配置指令时,每一个location只能使用一个模块,当在location中同时使用多个模块的content阶段指令时,只有其中一个模块能成功
    location /test1 {
    echo hello;
    content_by_lua 'ngx.say("world")';
    # echo和content_by_lua属于不同的模块,所以只会有一个成功,但是不确定会是哪一个
    # content_by_lua指令只能在同一模块中使用一次
    # proxy_pass也是content阶段的指令,所以也不能同时和他们一起使用
    }


    # 当一个location中未使用任何content阶段的指令时,nginx会把当前请求的 URI 映射到文件系统的静态资源服务模块。
    # Nginx一般会在content阶段安排三个静态资源服务模块,它们在content阶段的运行顺序依次是ngx_index模块,ngx_autoindex模块,ngx_static模块。
    # ngx_index和ngx_autoindex模块都只会作用于以/结尾的URI,对于不以/结尾的请求会直接忽略,同时把处理权移交给content阶段的下一个模块。
    # 而ngx_static模块则刚好相反,直接忽略以/结尾的URI,即返回各种静态文件的内容。
    # ngx_index模块主要用于在文件系统目录中自动查找指定的首页文件

    # 当用户请求/地址时,Nginx会自动在ngx_core/root配置指令指定的文件系统目录下依次寻找index.htm和index.html这两个文件。如果index.htm文件存在,则直接发起“内部跳转”(ngx_echo/echo_exec指令和ngx_rewrite/rewrite指令可以发起“内部跳转”)到/index.htm;
    # 而如果不存在,则继续检查index.html是否存在,若仍然不存在,则进入content阶段的下一个模块指令

    location / {  # 只能是/, 内部跳转到/index.html
    root /home/ashin/projects/tests/nginx-lua/;
    index index.htm index.html;
    autoindex on;  #如果index网页不存在,则自动生成“目录索引”网页
    }

    # location /index.html { # 内部跳转使请求/显示a = 32
    #    set $a 32;
    #    echo "a = $a";
    # }
}

}

如果您觉得从我的分享中得到了帮助,并且希望我的博客持续发展下去,请点击支付宝捐赠,谢谢!

若非特别声明,文章均为阿小信的个人笔记,转载请注明出处。文章如有侵权内容,请联系我,我会及时删除。

#WEB/前端#   #nginx
分享到:
阅读[2088] 评论[4]

你可能也感兴趣的文章推荐

本文最近访客

发表评论

#1 网友121.*.*.156[成都]956 :
不能选填个人信息喃
2014-09-27 23:40 回复
#3 小草222.*.*.51[上海]16368 :
抄的真不干净。。。http://wiki.nginx.org/NginxDirectiveExecOrderTutorialCn01
2015-07-11 18:56 回复
#4 网友116.*.*.2[上海]15877 回复 #3 小草222.*.*.51[上海] :
笔记而已 抄值得抄的
2015-07-13 10:33 回复