• 通过lua扩展nginx


    1、 安装

    准备主要的三个安装包,分别是

    nginx-1.15.9.tar.gz

    LuaJIT-2.0.5.tar.gz

    lua-nginx-module-0.10.14.tar.gz

    相关版本可以去官网下载,放在自定义目录并解压:

    先安装LuaJIT

    下面需要配置一下LuaJIT的环境变量,编译nginx时需要。

    再将nginxlua-nginx-module一起编译,先执行configure

    然后make

     

    然后install

     

    启动nginx

    报错了,执行如下操作:

    执行完后,启动成功。

    2、常用逻辑

    1)直接返回

    2)获取url参数

     

    3)获取request body

     

    4)子请求转发

    ngx.location.capture:是一个同步非阻塞的nginx子请求uringinx的子请求提供了一个非常强大的方式去实现非阻塞的内部请求,这些子请求仅仅是模拟HTTP请求,但是并没有额外的HTTP/TCP,它只能请求到相对于当前nginx服务器的路径,不能使用绝对路径进行访问。

     

    5POST请求修改消息体

    3、常用指令介绍

    lua_code_cache:

    设置是否缓存lua file的代码,默认是on,即开启缓存,生产环境强烈建议开启缓存,否则会大大影响性能,但是自己开发调试时候可以关闭缓存,这样不需要reload nginx也可以是代码生效。

    在调用过一次后,修改赋值内容为test_content_file_1,不需重启nginx,可以看到返回值不一样。

    lua_package_path设置 set_by_lua*content_by_lua* 和 其他脚本对 Lua 模块的查找路径。路径字符串是标准 Lua 路径格式,特殊标识 ;; 可被用来代表原始搜索路径。

    lua_package_cpath设置 set_by_lua*content_by_lua* 和其他脚本对 Lua C 模块的查找路径。 cpath 路径字符串是标准 Luacpath 路径格式,特殊标识;; 可被用来代表原始 cpath 路径。

    init_by_lua_blockNginx master进程加载Nginx配置文件时,在全局的Lua虚拟机上运行<lua-script-str>指定的Lua代码。通常,我们可以在服务启动时注册Lua全局变量或预加载Lua模块。

    init_by_lua_file把上面的处理部分转到lua文件,并且指定文件路径,其他的一样。

    set_by_lua_block将处理结果返回到预定义入参,该指令被设计为执行短小、快速的代码块,因为代码执行时Nginx的事件循环是被阻塞的,因此应避免耗时的代码处理。

    set_by_lua_file已文件方式使用上述说明。

     

    content_by_lua_block

    为每个请求执行<lua script str>中指定的lua代码,Lua代码可以进行API调用,并在独立的全局环境中作为新生成的协程执行,不要在同一位置使用此指令和其他内容处理程序指令。例如,此指令和proxy-pass指令不应在同一位置使用。

    举例见上面常用逻辑里的图。

    content_by_lua_file以文件方式使用content_by_lua

     

    rewrite_by_lua_block:作为一个rewrite阶段的处理程序,为每个请求执行由<lua-script-str>指定的Lua代码。这些Lua代码可以调用全部 API,并作为一个新的协程,在一个独立的全局环境中执行,注意这个处理过程总是在标准ngx_http_rewrite_module的后面。

    重写URL

    rewrite_by_lua_filerewrite_by_lua的文件表示。

    access_by_lua_blockaccess阶段处理,对每次请求执行在<lua-script-str>中指名的Lua代码,这些Lua代码可以调用 全部 API,并作为一个新的协程,在一个独立的全局环境中执行,本指令的处理总是在标准ngx_http_access_module的后面,access_by_lua不能运行在子请求中。

     

    如果child返回200,则:

    修改child转发的url,转发到不存在的地址:

     

    access_by_lua_fileaccess_by_lua的文件表示。

    header_filter_by_lua_block<lua-script-str>中指名的lua代码,来完成应答消息头部的过滤。

     

    header_filter_by_lua_fileheader_filter_by_lua的文件表示。

    body_filter_by_lua_block使用<lua-script-str>指定的Lua代码定义一个输出应答体过滤器。输入数据块是ngx.arg[1]Lua的字符串形式),结束标识"eof"是应答体数据最后一位ngx.arg[2]Lua的布尔值形式)。

    body_filter_by_lua_filebody_filter_by_lua的文件表示。

    balancer_by_lua_block该指令执行上游的负载均衡Lua代码,代码配置在upstream {}小节中。Lua 负载均衡能完全忽略配置在upstream {}小节中定义的服务列表,并且从一个完全动态的服务列表中挑选一个节点,所有这些均是通过lua-resty-core库的ngx.balancer完成。

    8080,8081分别启动相同的服务,通过传入的index完成服务端选择:

    balancer_by_lua_filebalancer_by_lua_block的文件表示。

    有人翻译了lua-nginx-module,地址如下:

    https://github.com/iresty/nginx-lua-module-zh-wiki#ssl_certificate_by_lua_block

  • 相关阅读:
    BZOJ.2199.[USACO2011 Jan]奶牛议会(2-SAT)
    BZOJ.1997.[HNOI2010]Planar(2-SAT)
    POJ.3648.Wedding(2-SAT)
    POJ.3678.Katu Puzzle(2-SAT)
    POJ.3207.Ikki's Story IV-Panda's Trick(2-SAT)
    洛谷.4180.[模板]次小生成树Tree(Kruskal LCA 倍增)
    BZOJ.4766.文艺计算姬(Prufer)
    zabbix 微信告警机制
    网络地址
    tcp与udp的区别
  • 原文地址:https://www.cnblogs.com/small-office/p/10658777.html
Copyright © 2020-2023  润新知