• openresty ngx_lua执行阶段



    openresty ngx_lua执行阶段

           

                    

                                    

    nginx http执行阶段

              

    nginx http执行阶段

    1. # ngx_http_core_module.h
    2. typedef enum {
    3. NGX_HTTP_POST_READ_PHASE = 0,
    4. NGX_HTTP_SERVER_REWRITE_PHASE,
    5. NGX_HTTP_FIND_CONFIG_PHASE,
    6. NGX_HTTP_REWRITE_PHASE,
    7. NGX_HTTP_POST_REWRITE_PHASE,
    8. NGX_HTTP_PREACCESS_PHASE,
    9. NGX_HTTP_ACCESS_PHASE,
    10. NGX_HTTP_POST_ACCESS_PHASE,
    11. NGX_HTTP_PRECONTENT_PHASE,
    12. NGX_HTTP_CONTENT_PHASE,
    13. NGX_HTTP_LOG_PHASE
    14. } ngx_http_phases;

              

    执行阶段说明

    1. NGX_HTTP_POST_READ_PHASE = 0,
    2. * 接受并读取请求
    3. NGX_HTTP_SERVER_REWRITE_PHASE,
    4. * 修改url阶段,通常有重定向、变量设置
    5. NGX_HTTP_FIND_CONFIG_PHASE,
    6. * 查找url对应的配置,如匹配location
    7. NGX_HTTP_REWRITE_PHASE,
    8. * 匹配到location后,可能会再次进入NGX_HTTP_SERVER_REWRITE_PHASE
    9. NGX_HTTP_POST_REWRITE_PHASE,
    10. * 检查url是否执行过阶段4,如果执行了,再次进入阶段3
    11. * 最大检查次数为10,超过会报错
    12. NGX_HTTP_PREACCESS_PHASE,
    13. * 请求资源限速等操作
    14. NGX_HTTP_ACCESS_PHASE,
    15. * 访问控制,如限制ip访问
    16. NGX_HTTP_POST_ACCESS_PHASE,
    17. * 验证NGX_HTTP_ACCESS_PHASE(访问控制)结果,如果通过则继续
    18. NGX_HTTP_PRECONTENT_PHASE,
    19. * try_files指令时生效
    20. NGX_HTTP_CONTENT_PHASE,
    21. * 处理http请求内容,一般需要与后端应用进行交互
    22. NGX_HTTP_LOG_PHASE
    23. * 日志输出

            

                 

                                    

    ngx_lua 执行阶段

             

                  

            

    执行顺序

    1. init_by_lua_block
    2. init_worker_by_lua_block
    3. set_by_lua_block
    4. rewrite_by_lua_block
    5. access_by_lua_block
    6. content_by_lua_block
    7. header_filter_by_lua_block
    8. body_filter_by_lua_block
    9. log_filter_by_lua_block

                

    init_by_lua_block:nginx初始化、重启时执行,在http模块中设置

    1. http {
    2. include mime.types;
    3. default_type application/octet-stream;
    4. init_by_lua_block {
    5. local uuid = require 'resty.jit-uuid';
    6. uuid.seed();
    7. }
    8. ...
    9. }

              

    init_by_lua_file:作用与init_by_lua_block相同,代码块保存在文件中

    1. http {
    2. include mime.types;
    3. default_type application/octet-stream;
    4. init_worker_by_lua_file /usr/local/nginx/conf/init.lua
    5. ...
    6. }
    7. # /usr/local/nginx/conf/init.lua 文件内容
    8. local uuid = require 'resty.jit-uuid';
    9. uuid.seed();

               

    init_worker_by_lua_block:master进程启动后,执行相关代码块,在http模块中设置

    1. # 可用来执行定时任务、后端健康检查
    2. http {
    3. include mime.types;
    4. default_type application/octet-stream;
    5. init_worker_by_lua_block {
    6. ...
    7. }
    8. ...
    9. }

                  

    set_by_lua_block:执行代码块,并将结果返回,在server、location语句块中设置

    1. 语法格式:set_by_lua_block $result {...}
    2. * 该命令是阻塞命令,执行的语句块尽可能短、快,避免耗时过多
    3. * 语句块中禁用:ngx.say()、ngx.exit()、ngx.sleep()等命令
    4. server {
    5. listen 80;
    6. server_name localhost;
    7. set $a "";
    8. set_by_lua_block $a {
    9. return "1";
    10. }
    11. location / {
    12. root /usr/local/openresty/nginx/html;
    13. index index.html index.htm;
    14. }
    15. ...
    16. }

                  

    rewrite_by_lua_block:重写阶段执行,可在http、server、location中设置

    1. 语法格式:rewrite_by_lua_block {...}
    2. * 语句块会在最后执行,可通过rewrite_by_lua_no_postpone(默认off)改变执行顺序
    3. * 可调用所有ngx api
    4. # a的值为2
    5. server {
    6. listen 80;
    7. server_name localhost;
    8. set $a "1";
    9. rewrite_by_lua_block {
    10. ngx_var_a="2";
    11. }
    12. set $a "3"
    13. location / {
    14. root /usr/local/openresty/nginx/html;
    15. index index.html index.htm;
    16. }
    17. ...
    18. }
    19. # http阶段配置:rewrite_by_lua_no_postpone on
    20. # a的值为3
    21. server {
    22. listen 80;
    23. server_name localhost;
    24. set $a "1";
    25. rewrite_by_lua_block {
    26. ngx_var_a="2";
    27. }
    28. set $a "3"
    29. location / {
    30. root /usr/local/openresty/nginx/html;
    31. index index.html index.htm;
    32. }
    33. ...
    34. }

                 

    access_by_lua_block:access阶段执行语句块(权限检查、黑白名单),在http、server、location中设置

    1. 语法格式:access_by_lua_block {...}
    2. * 语句块会在最后执行,可通过access_by_lua_no_postpone(默认off)改变执行顺序
    3. * 可调用所有ngx api
    4. * 应用:将黑白名单存放在redis、共享内存中,动态设置黑白名单

             

    content_by_lua_block:内容处理阶段执行,设置输出内容,在location中设置

    1. 语法格式:content_by_lua_block {...}
    2. * 可调用所有ngx api
    3. * 若与其他内容执行阶段语句同时使用,content_by_lua_block可能不会执行
    4. location / {
    5. content_by_lua_block {
    6. ngx.say("hello gtlx");
    7. }
    8. echo "test" #只会输出test,不会输出hello gtlx
    9. }

                   

    content_by_lua_file:与content_by_lua_block相同,语句保存在文件中,在location中设置

    1. 语法格式:content_by_lua_file file
    2. * 可调用所有ngx api
    3. location / {
    4. content_by_lua_file /usr/local/openresty/file/test.lua
    5. }
    6. # 文件:/usr/local/openresty/file/test.lua
    7. hello gtlx

                

    balancer_by_lua_block:内容处理阶段执行,在upstream语句中使用

    1. 语法格式:balancer_by_lua_block {...}
    2. * upstream使用的ip为balancer_by_lua_block中设置的地址
    3. * 禁用的api:cosockets、light threads
    4. upstream web-server {
    5. server 172.18.0.2 #会忽略server设置的ip地址
    6. balancer_by_lua_block {
    7. ... #真是使用的ip地址
    8. }
    9. }

                      

    header_filter_by_lua_block:响应阶段添加、删除响应头,在http、server、location中设置

    1. 语法格式:header_filter_by_lua_block {...}
    2. * 禁用的api:ngx.say()、ngx.redirect()、ngx.exec()等
    3. # 添加响应头
    4. location {
    5. header_filter_by_lua_block {
    6. ngx.header.test="hello gtlx"
    7. }
    8. echo "hello"
    9. }

               

    body_filter_by_lua_block:响应阶段修改响应体,在http、server、location中设置

    1. 语法格式:body_filter_by_lua_block {...}
    2. * 禁用的api:ngx.say()、ngx.redirect()、ngx.exec()等
    3. # 将相应数据转换为大写(ngx.arg[1]获取响应数据,ngx.arg[2]响应结束符)
    4. # 输出:HELLO
    5. location {
    6. body_filter_by_lua_block {
    7. ngx.arg[1] = string.upper(ngx.arg[1]);
    8. }
    9. echo "hello"
    10. }

            

    log_by_lua_block:输出日志,可在http、server、location中设置

    1. 语法格式:log_filter_by_lua_block {...}
    2. * 在access_log之前执行,不会替换当前的access_log日志
    3. * 禁用的api:ngx.say()、ngx.redirect()、ngx.exec()等
    4. location {
    5. log_filter_by_lua_block {
    6. ngx.log("hello gtlx")
    7. }
    8. echo "hello"
    9. }

                

                       

  • 相关阅读:
    四、RocketMq本地集群搭建
    剑指 Offer II 033. 变位词组
    【Pytorch深度学习开发实践学习】Pytorch实现LeNet神经网络(3)predict.py
    .gitignore
    极客日报:微信、支付宝个人收款码可继续使用;苹果或将推出7款新Mac;Swift之父正式退出Swift核心团队|极客头条
    双机热备综合实验(VRRP+OSPF+VTP+NAT+DHCP)
    在MAUI中使用Masa Blazor
    【React】React绑定事件
    [机缘参悟-77]:深度思考-职场中注意事项-管理者版
    06. Web大前端时代之:HTML5+CSS3入门系列~HTML5 画布
  • 原文地址:https://blog.csdn.net/weixin_43931625/article/details/125598166