【Nginx高级篇】Lua基础语法和OpenResty的安装

这篇具有很好参考价值的文章主要介绍了【Nginx高级篇】Lua基础语法和OpenResty的安装。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、前言

二、Lua基础语法  

hello world

保留关键字

注释

变量

字符串

空值

布尔类型

作用域

控制语句

if-else

for循环

函数

赋值

返回值 

Table

数组

遍历

成员函数

三、openresty的安装

(一)预编译安装

(二)源码编译安装

(三)服务命令

(四)测试lua脚本以文件的形式

代码热部署

获取nginx请求头信息

获取post请求参数

Http协议版本

请求方法

原始的请求头内容

body内容体

(五)Nginx缓存

Nginx全局内存缓存

lua-resty-lrucache

lua-resty-redis访问redis

lua-resty-mysql


一、前言

Lua 是由巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组于1993年开发的一种轻量、小巧的脚本语言,用标准 C 语言编写,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

官网:The Programming Language Lua

学习lua语言之前需要先安装lua版本,并在ideal下载插件,具体的可以看下面这篇文章

Lua环境安装+Idea配置_idea配置lua_xiaowu714的博客-CSDN博客https://blog.csdn.net/xiaowu714/article/details/127763087?spm=1001.2014.3001.5506

二、Lua基础语法  

hello world

在ideal新建lua项目并创建lua文件后输入以下内容

local function main()
    print("Hello world!")
end

main()

运行结果

【Nginx高级篇】Lua基础语法和OpenResty的安装

保留关键字

and break do else elseif end false for function 
if in local nil not or repeat return then true 
until while

注释

-- 两个减号是行注释

--[[

 这是块注释

 这是块注释.

 --]]

变量

数字类型

Lua的数字只有double型,64bits

你可以以如下的方式表示数字

num = 1024​

num = 3.0​

num = 3.1416

​num = 314.16e-2

​num = 0.31416E1

​num = 0xff​

num = 0x56

字符串

可以用单引号,也可以用双引号

也可以使用转义字符‘\n’ (换行), ‘\r’ (回车), ‘\t’ (横向制表), ‘\v’ (纵向制表), ‘\’ (反斜杠), ‘\”‘ (双引号), 以及 ‘\” (单引号)等等

下面的四种方式定义了完全相同的字符串(其中的两个中括号可以用于定义有换行的字符串)

a = 'alo\n123"'

a = "alo\n123\""

a = '\97lo\10\04923"'

a = [[alo

123"]]

空值

C语言中的NULL在Lua中是nil,比如你访问一个没有声明过的变量,就是nil

布尔类型

只有nil和false是 false

数字0,‘’空字符串(’\0’)都是true

作用域

lua中的变量如果没有特殊说明,全是全局变量,那怕是语句块或是函数里。

变量前加local关键字的是局部变量。

控制语句

while循环

local function main()

    local i = 0
    local max = 10
    while i <= max do
        print(i)
        i = i + 1
    end
end

main()

运行结果

【Nginx高级篇】Lua基础语法和OpenResty的安装

if-else

local function main()

    local age = 30

    local sex = 'Malee'

    if age <= 40 and sex == "Male" then
        print("男人四十一枝花")
    elseif age > 40 and sex ~= "Female" then -- ~=  等于 !=
        io.write("old man")
    elseif age < 20 then
        print("too young too simple")
    else
        print("Your age is "..age)   --Lua中字符串的连接用..

    end

end

main()

for循环

local function main()

    for i = 10, 1 , -1 do   -- i<=1, i--
        print(i)
    end
    for i = 1, 10 , 1 do    -- i<=10, i++
        print(i)
    end

end

main()

函数

local function main()

    function myPower(x,y) -- 定义函数

        return      y+x

    end

    power2 = myPower(2,3)  -- 调用

    print(power2)
end

main()
local function main()

    function newCounter()

        local i = 0
        return function()     -- anonymous function(匿名函数)

            i = i + 1

            return i

        end
    end



    c1 = newCounter()

    print(c1())  --> 1

    print(c1())  --> 2

    print(c1())
end

main()

赋值

local function main()
    name, age,bGay = "yiming", 37, false, "yimingl@hotmail.com" -- 多出来的舍弃

    print(name,age,bGay)
end

main()

【Nginx高级篇】Lua基础语法和OpenResty的安装

返回值 

local function main()
    function isMyGirl(name)
        return name == 'xiao6' , name
    end

    local bol,name = isMyGirl('xiao6')

    print(name,bol)
end

main()

 【Nginx高级篇】Lua基础语法和OpenResty的安装

Table

KV形式,类似map

local function main()
    dog = {name='111',age=18,height=165.5}

    dog.age=35

    print(dog.name,dog.age,dog.height)

    print(dog)

end

main()

数组

local function main()
    local function main()
        arr = {"string", 100, "dog",function() print("wangwang!") return 1 end}

        print(arr[4]())
    end
    main()
end

main()

【Nginx高级篇】Lua基础语法和OpenResty的安装

遍历

local function main()
    arr = {"string", 100, "dog",function() print("wangwang!") return 1 end}

    for k, v in pairs(arr) do

        print(k, v)
    end
end

main()

【Nginx高级篇】Lua基础语法和OpenResty的安装

成员函数

local function main()

person = {name='旺财',age = 18}

  function  person.eat(food)

    print(person.name .." eating "..food)

  end
person.eat("骨头")
end
main()

三、openresty的安装

(一)预编译安装

以CentOS举例 其他系统参照:OpenResty - OpenResty® Linux 包

你可以在你的 CentOS 系统中添加 openresty 仓库,这样就可以便于未来安装或更新我们的软件包(通过 yum update 命令)。运行下面的命令就可以添加我们的仓库:

 yum install yum-utils

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

然后就可以像下面这样安装软件包,比如 openresty:

 yum install openresty

如果你想安装命令行工具 resty,那么可以像下面这样安装 openresty-resty 包:

 sudo yum install openresty-resty

(二)源码编译安装

官网下载tar.gz包

OpenResty - 下载

最小版本基于nginx1.21

./configure

然后在进入 openresty-VERSION/目录, 然后输入以下命令配置:

./configure

默认, --prefix=/usr/local/openresty 程序会被安装到/usr/local/openresty目录。

依赖 gcc openssl-devel pcre-devel zlib-devel

安装:yum install gcc openssl-devel pcre-devel zlib-devel postgresql-devel

您可以指定各种选项,比如

./configure --prefix=/opt/openresty \

            --with-luajit \

            --without-http_redis2_module \

            --with-http_iconv_module \

            --with-http_postgres_module

试着使用 ./configure --help 查看更多的选项。

make && make install

查看openresty的目录

【Nginx高级篇】Lua基础语法和OpenResty的安装

(三)服务命令

启动

Service openresty start

停止

Service openresty stop

检查配置文件是否正确

Nginx -t

重新加载配置文件

Service openresty reload

查看已安装模块和版本号

Nginx -V

测试Lua脚本

在Nginx.conf 中写入
   location /lua {

        default_type text/html;
        content_by_lua '
           ngx.say("<p>Hello, World!</p>")
         ';
      }

启动nginx

./nginx -c /usr/local/openresty/nginx/conf/nginx.conf

【Nginx高级篇】Lua基础语法和OpenResty的安装

(四)测试lua脚本以文件的形式


       location /lua {

        default_type text/html;
        content_by_lua_file lua/hello.lua;
      }

 在nginx目录下创建lua目录并写入hello.lua文件,文件内容

ngx.say("<p>hello world!!!</p>")

【Nginx高级篇】Lua基础语法和OpenResty的安装

代码热部署

hello.lua脚本每次修改都需要重启nginx,很繁琐,因此可以通过配置开启热部署

 lua_code_cache off;

 会提示开启该功能可能影响nginx的性能

【Nginx高级篇】Lua基础语法和OpenResty的安装

获取nginx请求头信息

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  

 【Nginx高级篇】Lua基础语法和OpenResty的安装

获取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

 【Nginx高级篇】Lua基础语法和OpenResty的安装

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缓存

Nginx全局内存缓存

nginx配置文件的http块中添加

lua_shared_dict shared_data 1m; # 申请一兆内存作为内存缓存,该内存可以被所有的进程进行共享的且可以保持原子性

hello.lua脚本内容

local shared_data = ngx.shared.shared_data  

  

local i = shared_data:get("i")  

if not i then  

    i = 1  

    shared_data:set("i", i)  

    ngx.say("lazy set i ", i, "<br/>")  
end  
 

i = shared_data:incr("i", 1)  

ngx.say("i=", i, "<br/>")

【Nginx高级篇】Lua基础语法和OpenResty的安装

接下来每次都会从访问ii都会+1

【Nginx高级篇】Lua基础语法和OpenResty的安装

lua-resty-lrucache

Lua 实现的一个简单的 LRU 缓存,适合在 Lua 空间里直接缓存较为复杂的 Lua 数据结构:它相比 ngx_lua 共享内存字典可以省去较昂贵的序列化操作,相比 memcached 这样的外部服务又能省去较昂贵的 socket 操作

https://github.com/openresty/lua-resty-lrucache

引用lua文件

       location /lua {

        default_type text/html;
#        content_by_lua_file lua/hello.lua;

            content_by_lua_block {
                require("my/cache").go()
            }
      }

当不知道nginx是在哪个文件下查找时可以先重启nginx,然后访问报错试一下,然后在error.log文件中可以看到默认在哪些文件下查找

【Nginx高级篇】Lua基础语法和OpenResty的安装

我们在lualib下创建my目录,并在my目录下创建cache.lua脚本,脚本内容如下:

local _M = {}


lrucache = require "resty.lrucache"

c, err = lrucache.new(200)  -- allow up to 200 items in the cache
ngx.say("count=init")


if not c then
    error("failed to create the cache: " .. (err or "unknown"))
end

function _M.go()

count = c:get("count")


c:set("count",100)
ngx.say("count=", count, " --<br/>")


if not count then  


    c:set("count",1)

    ngx.say("lazy set count ", c:get("count"), "<br/>")  

else


c:set("count",count+1)
 


ngx.say("count=", count, "<br/>")
end


end
return _M

记得开启lua_code_cache,即代码缓存,不然每次代码都会重复执行,永远都拿不到count的值

【Nginx高级篇】Lua基础语法和OpenResty的安装

【Nginx高级篇】Lua基础语法和OpenResty的安装

lua-resty-redis访问redis

官网:GitHub - openresty/lua-resty-redis: Lua redis client driver for the ngx_lua based on the cosocket API

常用方法

local res, err = red:get("key")

local res, err = red:lrange("nokey", 0, 1)

ngx.say("res:",cjson.encode(res))

创建连接

red, err = redis:new()

ok, err = red:connect(host, port, options_table?)

timeout

red:set_timeout(time)

keepalive

red:set_keepalive(max_idle_timeout, pool_size)

close

ok, err = red:close()

pipeline

red:init_pipeline()

results, err = red:commit_pipeline()

认证

    local res, err = red:auth("foobared")

    if not res then

        ngx.say("failed to authenticate: ", err)

        return
end

nginx的配置

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    lua_code_cache off;
    lua_shared_dict shared_data 1m;
    server {
        listen       888;
        server_name  localhost;

       location /lua {

        default_type text/html;
        content_by_lua_file lua/redis.lua;

        }
        location / {
            root   html;
            index  index.html index.htm;
        }


        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

redis.lua脚本

  local redis = require "resty.redis"
                local red = redis:new()

                red:set_timeouts(1000, 1000, 1000) -- 1 sec

  local ok, err = red:connect("127.0.0.1", 6379)
  local res, err = red:auth("zjy123...000")

    if not res then

        ngx.say("failed to authenticate: ", err)

        return
  end
 if not ok then
                    ngx.say("failed to connect: ", err)
                    return
                end

                ok, err = red:set("dog", "an animal")
                if not ok then
                    ngx.say("failed to set dog: ", err)
                    return
                end

                ngx.say("set result: ", ok)

                local res, err = red:get("dog")
                if not res then
                    ngx.say("failed to get dog: ", err)
                    return
                end

                if res == ngx.null then
                    ngx.say("dog not found.")
                    return
                end


              ngx.say("dog: ", res)

访问结果

【Nginx高级篇】Lua基础语法和OpenResty的安装

 验证

【Nginx高级篇】Lua基础语法和OpenResty的安装

总结

lua-resty-redis直接访问redis可以节省原本的一些步骤,比如:

客户端请求--nginx--tomcat--redis--tomcat--nginx--客户端

优化为:

客户端请求--nginx--redis--nginx--客户端

对于一些不常更新的放在redis的资源可以使用该方式,节省了不必要的步骤

lua-resty-mysql

官网: GitHub - openresty/lua-resty-mysql: Nonblocking Lua MySQL driver library for ngx_lua or OpenResty

配置文件

    charset utf-8;
    lua_code_cache off;
    lua_shared_dict shared_data 1m;
    server {
        listen       888;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;


       location /lua {

        default_type text/html;
        content_by_lua_file lua/mysql.lua;

       }
    }

 mysql.lua

local mysql = require "resty.mysql"
                local db, err = mysql:new()
                if not db then
                    ngx.say("failed to instantiate mysql: ", err)
                    return
                end

                db:set_timeout(1000) -- 1 sec


                local ok, err, errcode, sqlstate = db:connect{
                    host = "192.168.102.100",
                    port = 3306,
                    database = "atguigudb1",
                    user = "root",
                    password = "123456",
                    charset = "utf8",
                    max_packet_size = 1024 * 1024,
                }


                ngx.say("connected to mysql.<br>")



                local res, err, errcode, sqlstate = db:query("drop table if exists cats")
                if not res then
                    ngx.say("bad result: ", err, ": ", errcode, ": ", sqlstate, ".")
                    return
                end


                res, err, errcode, sqlstate =
                    db:query("create table cats "
                             .. "(id serial primary key, "
                             .. "name varchar(5))")
                if not res then
                    ngx.say("bad result: ", err, ": ", errcode, ": ", sqlstate, ".")
                    return
                end

                ngx.say("table cats created.")



                res, err, errcode, sqlstate =
                    db:query("select * from student")
                if not res then
                    ngx.say("bad result: ", err, ": ", errcode, ": ", sqlstate, ".")
                    return
                end

                local cjson = require "cjson"
                ngx.say("result: ", cjson.encode(res))


                local ok, err = db:set_keepalive(10000, 100)
                if not ok then
                    ngx.say("failed to set keepalive: ", err)
                    return
                end
 

【Nginx高级篇】Lua基础语法和OpenResty的安装文章来源地址https://www.toymoban.com/news/detail-445189.html

到了这里,关于【Nginx高级篇】Lua基础语法和OpenResty的安装的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • openresty 安装, nginx与 openresty

    openresty VS nginx Nginx 是一款高性能的 Web 服务器和反向代理服务器,具备基础的功能如HTTP服务、负载均衡、反向代理以及动静分离等。它是许多互联网应用的核心组件,因其模块化和可扩展的设计而受到欢迎。1 OpenResty 是基于 Nginx 的 Web 平台,它通过Lua脚本语言扩展了Nginx的功

    2024年01月25日
    浏览(22)
  • 黑马Redis视频教程高级篇(安装OpenResty)

    目录 一、安装 1.1、安装开发库 1.2、安装OpenResty仓库 1.3、安装OpenResty 1.4、安装opm工具 1.5、目录结构 1.6、配置nginx的环境变量 二、启动和运行 三、备注 首先你的Linux虚拟机必须联网。 首先要安装OpenResty的依赖开发库,执行命令: 你可以在你的 CentOS 系统中添加 openresty 仓库

    2024年02月08日
    浏览(32)
  • 使用openresty替换线上nginx网关之openresty安装细节

    线上跑了多年的一个网关业务,随着部门的拆分,逐渐有了一个痛点。该网关业务主要处理app端请求,app端发起的请求,采用http协议,post方法,content-type采用 application/x-www-form-urlencoded ,表单中有一个固定的字段,叫功能号,即funcNo=1000100这样,然后表单中其他业务字段就根

    2024年02月07日
    浏览(29)
  • lua基础语法篇一

    单行注释 多行注释 Lua有8种基本类型,如下表 类型 说明 nil 空值,只包含一个nil boolean 布尔类型 number 数值类型 string 字符串,用单引号或双引号表示 table Lua中的表,其实是一个关联数组,数组的索引可以是数字、字符串或表类型 function 函数,由C或Lua编写的函数 userdata 表示

    2024年02月02日
    浏览(32)
  • OpenResty安装-(基于Nginx的高性能Web平台,可在Nginx端编码业务)

    首先你的Linux虚拟机必须联网 首先要安装OpenResty的依赖开发库,执行命令: 你可以在你的 CentOS 系统中添加 openresty 仓库,这样就可以便于未来安装或更新我们的软件包(通过 yum check-update 命令)。运行下面的命令就可以添加我们的仓库: 如果提示说命令不存在,则运行:

    2024年02月07日
    浏览(52)
  • 多级缓存架构(三)OpenResty Lua缓存

    通过本文章,可以完成多级缓存架构中的Lua缓存。 在 docker/docker-compose.yml 中添加nginx服务块。 删除原来docker里的 multiCache 项目并停止 springboot 应用。 nginx 部分配置如下,监听端口为 8080 ,并且将请求反向代理至 172.30.3.11 ,下一小节,将 openresty 固定在 172.30.3.11 。 重新启动

    2024年01月16日
    浏览(38)
  • openResty+lua+redis实现接口访问频率限制

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

    2024年02月11日
    浏览(37)
  • Openresty原理概念篇(九)LuaJIT分支和标准Lua有什么不同

    一  LuaJIT分支和标准Lua有什么不同 ①  背景 luajit官方   标准lua官方   openresty自身维护的luajit  编译luajit ②  LuaJIT 在 OpenResty 整体架构中的位置 ③   标准 Lua 和 LuaJIT 的 关系 ④  为什么 选择LuaJIT ⑤  lua特别之处 pairs和ipairs看table的内部结构 nil、ngx.null、cjson.null、user

    2024年02月11日
    浏览(27)
  • Nginx安装Lua

    Nginx安装Lua 1.安装Lua(两个二选一) yum install readline-devel (CentOS) sudo apt-get install libreadline-dev (Ubuntu) sudo apt-get install libncurses5-dev (Ubuntu) wget -O LuaJIT-2.0.4.tar.gz http://luajit.org/download/LuaJIT-2.0.4.tar.gz tar -zxvf LuaJIT-2.0.4.tar.gz make make install wget -O lua-5.1.5.tar.gz http://www.lua.org/ftp/lua-5.1.5.tar.gz

    2024年02月21日
    浏览(23)
  • Openresty(二十二)ngx.balance和balance_by_lua终结篇

    一  灰度发布铺垫 ①  init_by_lua* init_by_lua    init_by_lua_block    当配置重载时,init_by_lua* 不会清空其内的lua_shared_dict共享数据 lua执行系统命令方法os.execute和io.popen      init_by_lua_file不能连接redis init_by_lua_file  ②  init_worker_by_lua* init_worker_by_lua init_worker_by_lua_block  ngx.worker

    2024年02月07日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包