1. 为什么值得入手?
Nginx 作为现在使用最广泛的高性能后端服务器,Openresty 为之提供了动态预言的灵活,当性能与灵活走在了一起,无疑对于被之前陷于臃肿架构,苦于提升性能的工程师来说是重大的利好消息,本文就是在这种背景下,将初入这一未知的领域之后的一些经验与大家分享一下,若有失言之处,欢迎指教。
2. 安装
现在除了能在 [Download](http://openresty.org/en/download.html )里面下载源码来自己编译安装,现在连预编译好的[包](http://openresty.org/en/linux-packages.html)都有了, 安装也就分分钟的事了。
3. hello world
/path/to/nginx.conf`, `conftent_by_lua_file 里面的路径请根据 lua_package_path 调整一下。
“`
location / {
content_by_lua_file ../luablib/hello_world.lua;
}
“`
`/path/to/openresty/lualib/hello_world.lua`
“`
ngx.say(“Hello World”)
“`
访问一下, Hello World~.
“`
HTTP/1.1 200 OK
Connection: keep-alive
Content-Type: application/octet-stream
Date: Wed, 11 Jan 2017 07:52:15 GMT
Server: openresty/1.11.2.2
Transfer-Encoding: chunked
Hello World
“`
基本上早期的 Openresty 相关的开发的路数也就大抵如此了, 将 lua 库发布到 lualib 之下,将对应的 nginx 的配置文件发布到 nginx/conf 底下,然后 reload 已有的 Openresty 进程(少数需要清空 Openresty shared_dict 数据的情况需要重启 )。
如果是测试环境的话,那更是简单了,在 http 段将 lua_code_cache 设为 off , Openresty 不会缓存 lua 脚本,每次执行都会去磁盘上读取 lua 脚本文件的内容,发布之后就可以直接看效果了(当然如果配置文件修改了,reload 是免不了了)。是不是找到一点当初 apache 写 php 的感觉呢:)
4. 开发语言 Lua 的大致介绍
环境搭建完毕之后,接下来就是各种试错了。关于 Lua 的介绍,网上的资料比如:Openresty 最佳实践(版本比较多,这里就不放了)写的都会比较详细,本文就不在这里过多解释了,只展示部分基础的Lua的模样。
下面对 lua 一些个性有趣的地方做一下分享,可能不会涉及到 lua 语言比较全面或者细节的一些部分,作为补充,读者可以翻阅官方的<<Programing in Lua>>。
“`lua
— 单行注释以两个连字符开头
–[[
多行注释
–]]
— 变量赋值
num = 13 — 所有的数字都是双精度浮点型。
s = ‘单引号字符串’
t = “也可以用双引号”
u = [[ 多行的字符串
]]
— 控制流程,和python最明显的差别可能就是冒号变成了do, 最后还得数end的对应
— while
while n < 10 do
n = n + 1 — 不支持 ++ 或 += 运算符。
end
— for
for i = 0, 9 do
print(i)
end
— if语句:
f n == 0 then
print(“no hits”)
elseif n == 1 then
print(“one hit”)
else
print(n .. ” hits”)
end
–只有nil和false为假; 0和 ”均为真!
if not aBoolValue then print(‘false’) end
— 循环的另一种结构:
repeat
print(‘the way of the future’)
num = num – 1
until num == 0
— 函数定义:
function add(x, y)
return x + y
end
— table 用作键值对
t = {key1 = ‘value1’, key2 = false}
print(t.key1) — 打印 ‘value1’.
— 使用任何非nil的值作为key:
u = {[‘@!#’] = ‘qbert’, [{}] = 1729, [6.28] = ‘tau’}
print(u[6.28]) — 打印 “tau”
— table用作列表、数组
v = {‘value1’, ‘value2’, 1.21, ‘gigawatts’}
for i = 1, #v do — #v 是列表的大小
print(v[i])
end
— 元表
f1 = {a = 1, b = 2} — 表示一个分数 a/b.
f2 = {a = 2, b = 3}
— 这会失败:
— s = f1 + f2
metafraction = {}
function metafraction.__add(f1, f2)
local sum = {}
sum.b = f1.b * f2.b
sum.a = f1.a * f2.b + f2.a * f1.b
return sum
end
setmetatable(f1, metafraction)
setmetatable(f2, metafraction)
s = f1 + f2 — 调用在f1的元表上的__add(f1, f2) 方法
— __index、__add等的值,被称为元方法。