Nginx 集成 lua 模块扩展功能,以及遇到的一些问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx 集成 lua 模块扩展功能,以及遇到的一些问题相关的知识,希望对你有一定的参考价值。

参考技术A 时间 2021-11-18

文章中使用的服务器环境为 CentOS 7.6 阿里云的镜像, nginx 为 yum 安装的1.20.1版本, luajit 这个是lua 的编译器 版本为 2.0.2, lua-nginx-module 版本为0.10.15

成功打印hello word

nginx + lua 可以直接把nginx的可扩展性拉上了一个不敢想象的层次,你可以使用各种lua的模块来实现一些复杂的功能,使nginx成为一个可以都独当一面的存在。喜欢折腾而且nginx已经运行一段时间的可以使用以上的方法,如果初次接触nginx就有这方面的需求的话建议直接使用 OpenResty® - 中文官方站 国人大佬开发的一个基于 nginx + lua 的web平台,可以省去折腾的麻烦。

Lua学习与Nginx整合

Openresty简介

OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

OpenResty通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。

OpenResty的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。

Openresty安装

Centos为例

预编译安装

yum install yum-utils
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
yum install openresty

源码编译安装

1. 下载源码包 http://openresty.org/cn/download.html
2. 解压后,进入目录执行配置命令
	./configure
3. 执行编译命令后,出现目录/usr/local/openresty
	make && make install

使用入门

  1. 修改/etc/profile,配置nginx环境变量
    PATH=/usr/local/openresty/nginx/sbin:$PATH
    export PATH

  2. 使profile生效
    source /etc/profile

  3. 启动nginx

    nginx

  4. 修改配置文件/usr/local/openresty/nginx/conf/nginx.conf

    server 
            listen 8080;
            location / 
                default_type text/html;
                content_by_lua_block 
                    ngx.say("<p>hello, world</p>")
                
            
        
    
  5. 重启nginx

    nginx -s reload

  6. 测试

    curl http://localhost:8080
    

使用进阶

引入lua脚本

在conf目录中新建lua/hello.lua

ngx.say("<h1>Hello Lua!!</h1>")

修改nginx.conf

server 
        listen 8080;
        location /lua 
            default_type text/html;
            content_by_lua_file conf/lua/hello.lua;
        
    

获得URI中的单个变量

修改hello.lua

ngx.say(ngx.var.arg_a)

arg_a能获得参数a的值

http://192.168.7.188:8080/lua?a=zhangsan

获得URI中的所有变量

修改hello.lua

local uri_args = ngx.req.get_uri_args()  
for k, v in pairs(uri_args) do  
    if type(v) == "table" then  
        ngx.say(k, " : ", table.concat(v, ", "), "<br/>")  
    else  
        ngx.say(k, ": ", v, "<br/>")  
    end  
end

可以在网页输出所有参数列表

http://192.168.7.188:8080/lua?a=22&b=33&c=88

获得请求头信息

local headers = ngx.req.get_headers()                         
ngx.say("Host : ", headers["Host"], "<br/>")  
ngx.say("user-agent : ", headers["user-agent"], "<br/>")  
ngx.say("user-agent : ", headers.user_agent, "<br/>")
for k,v in pairs(headers) do  
    if type(v) == "table" then  
        ngx.say(k, " : ", table.concat(v, ","), "<br/>")  
    else  
        ngx.say(k, " : ", v, "<br/>")  
    end  
end  

获得POST请求的参数

ngx.req.read_body()  
ngx.say("post args begin", "<br/>")  
local post_args = ngx.req.get_post_args()  
for k, v in pairs(post_args) do  
    if type(v) == "table" then  
        ngx.say(k, " : ", table.concat(v, ", "), "<br/>")  
    else  
        ngx.say(k, ": ", v, "<br/>")  
    end  
end

获得其他内容

http协议版本

ngx.say("ngx.req.http_version : ", ngx.req.http_version(), "<br/>")

请求方法

ngx.say("ngx.req.get_method : ", ngx.req.get_method(), "<br/>")  

原始的请求头内容

ngx.say("ngx.req.raw_header : ",  ngx.req.raw_header(), "<br/>")  

body内容体

ngx.say("ngx.req.get_body_data() : ", ngx.req.get_body_data(), "<br/>")

以上是关于Nginx 集成 lua 模块扩展功能,以及遇到的一些问题的主要内容,如果未能解决你的问题,请参考以下文章

Lua学习与Nginx整合

Lua学习与Nginx整合

Lua学习与Nginx整合

使用Openresty实现WAF防火墙功能

安装OpenResty(Nginx+Lua)开发环境

Nginx-- Nginx的扩展-OpenRestry