Nginx高级课程-高效(二)

本文详细介绍了Lua语言的基础语法、数据类型、控制结构,以及如何在Openresty(Nginx+Lua)环境中进行高效编程,包括配置、请求处理、变量获取和HTTP协议操作等。
摘要由CSDN通过智能技术生成

Openresty

Lua
Lua 是由巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组于1993年开发的一种轻量、小巧的脚本语言,用标准 C 语言编写,其设计目的是为了嵌入应用程序中,从而为应用序提供灵活的扩展和定制功能。
官网:http://www.lua.org/
IDE
EmmyLua插件
https://github.com/EmmyLua/IntelliJ-EmmyLua
https://emmylua.github.io/zh_CN/
LDT 基于eclipse
https://www.eclipse.org/ldt/
Lua基础语法
hello world

print("hello world!")

注释

-- 两个减号是行注释
--[[
 这是块注释
这是块注释.
--]]

变量
数字类型
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 i = 0
local max = 10
while i <= max do
print(i)
i = i +1
end

if-else

local function main()
local age = 140
local sex = 'Male'
if age == 40 and sex =="Male" then
print(" 男人四十一枝花 ")
elseif age > 60 and sex ~="Female" then
print("old man!!")
elseif age < 20 then
io.write("too young, too simple!\n")
else
print("Your age is "..age)
end
end
-- 调用
main() 

for循环

sum = 0
for i = 100, 1, -2 do
sum = sum + i
end 

函数

1

 function myPower(x,y)
return y+x
end
power2 = myPower(2,3)
print(power2)

2.

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()) 

返回值

name, age,bGay = "yiming", 37, false, "yimingl@hotmail.com"
print(name,age,bGay) 

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

Table
key,value的键值对 类似 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()
arr = {"string", 100, "dog",function() print("wangwang!") return 1 end}
print(arr[4]())
end
main() 

遍历

arr = {"string", 100, "dog",function() print("wangwang!") return 1 end}
for k, v in pairs(arr) do
print(k, v)
end 

成员函数

local function main()
person = {name='旺财',age = 18}
 function person.eat(food)
print(person.name .." eating "..food)
end
person.eat("骨头")
end
main() 

Openresty Nginx + Lua 

nginx是一个主进程配合多个工作进程的工作模式,每个进程由单个线程来处理多个连接。
在生产环境中,我们往往会把cpu内核直接绑定到工作进程上,从而提升性能。
安装
预编译安装
以CentOS举例 其他系统参照:http://openresty.org/cn/linux-packages.html
你可以在你的 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
源码编译安装
下载
http://openresty.org/cn/download.html
最小版本基于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
服务命令
启动
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>")
';

 

lua-nginx-module
创建配置文件lua.conf

server {
listen 80;
server_name localhost;
location /lua {
default_type text/html;
content_by_lua_file conf/lua/hello.lua;
}
}

在Nginx.conf下引入lua配置
include lua.conf;
创建外部lua脚本
conf/lua/hello.lua
内容:
ngx.say("<p>Hello, World!</p>")
获取Nginx uri中的单一变量

location /nginx_var {
default_type text/html;
content_by_lua_block {
ngx.say(ngx.var.arg_a)
}

获取Nginx uri中的所有变量

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请求时还可以使用
● set_by_lua
修改nginx变量
● rewrite_by_lua
修改uri
● access_by_lua
访问控制
● header_filter_by_lua
修改响应头
● boy_filter_by_lua
修改响应体
● log_by_lua
日志
代码热部署
lua_code_cache off
获取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 

获取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/>") 

  • 43
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狠情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值