openresty对nginx做了大量的扩展,尤其是增加灵活多样的lua脚本支持,使得openresty可以完成各种各样的业务逻辑处理,大大地提高了应用的灵活性。对于简单的业务需求,还是可以将openresty当作nginx来使用,比如常用的反向代理业务等。也可以把openresty作为nginx的升级版来看待,也就是说,原来nginx支持的功能,openresty都是支持的。
下面以openresty支持的几个常用功能特性来简单说明一下openresty支持的功能特点。
1. 安装openresty
安装过程略。
2. openresty配置
配置过程略。
3. 在nginx添加配置信息:
默认安装情况下,配置文件路径。
/usr/local/openresty/nginx/conf/nginx.conf
vi nginx.conf
http模块添加:#lua 模块
lua_package_path "/usr/local/openresty/lualib/?.lua;;";#c模块
lua_package_cpath "/usr/local/openresty/lualib/?.so;;";server模块添加location /redis {# 默认的响应类型default_type application/json;# 响应结果由lua/item.lua文件来决定content_by_lua_file lua/lua-openresty-redis.lua;}
lua脚本:
-- 引用resty的redis
local redis = require "resty.redis";
local red = redis:new();-- 连接redis
local ok,err = red:connect("127.0.0.1",6379);
if not ok thenngx.say("faild to connect",err);return
end-- 设置Redis密码
ok, err = red:auth("password")
if not ok thenngx.say("认证失败: ", err)return
end-- 查询redis
local resp, err = red:get("dKey")
-- 查询失败处理
if not resp thenngx.log(ngx.ERR, "查询Redis失败: ", err, ", key = " , key)
end-- 得到的数据为空处理
if resp == ngx.null thenresp = nilngx.log(ngx.ERR, "查询Redis数据为空, key = ", key)
end
-- close_redis(red)
ngx.say("dKey get dValue:"..resp)
return-- ok,err = red:set("dKey","dValue");
-- if not ok then
-- ngx.say("failed to set dKey",err);
-- return
-- end
-- ngx.say("dKey set dValue success")
-- return
根据lua文件的执行结果决定返回内容。
4. redis通过set和get值
local redis = require "resty.redis"
local red = redis:new()red:set_timeout(1000) -- 1 秒超时local ok, err = red:connect("127.0.0.1", 6379)
if not ok thenngx.say("连接Redis失败: ", err)return
end-- 设置Redis密码
ok, err = red:auth("your_redis_password")
if not ok thenngx.say("认证失败: ", err)return
end-- 设置一个key
ok, err = red:set("dog", "an animal")
if not ok thenngx.say("设置key失败: ", err)return
end-- 获取刚才设置的key
local res, err = red:get("dog")
if not res thenngx.say("获取key失败: ", err)return
endngx.say("dog: ", res)
读取和设置redis的key值。
5. 本地缓存(变量字符串)
5.1 http配置
lua_shared_dict my_cache 10m;
5.2 location配置
location /testcache {default_type application/json;content_by_lua_block {local mycache = ngx.shared.my_cachelocal mykey = ngx.var.urilocal myvalue = mycache:get(mykey)ngx.log(ngx.ERR, "key:", mykey, "value:", myvalue)if myvalue thenngx.say("from cache: ", myvalue)else-- 模拟从后端获取数据local value = ngx.time()mycache:set(mykey, value)ngx.say("set cache: ", value)end}}
ngx.time是函数,不能直接保存;ngx.time()这样写就是方法调用了,返回方法调用的结果。
6. 本地缓存(常量字符串)
6.1 http配置
lua_shared_dict my_cache 10m;
6.2 location配置
location /localcache {default_type application/json;content_by_lua_block {local cache_dict = ngx.shared.my_cache-- 设置缓存local ok, err = cache_dict:set("my_key", "my_value")if not ok thenngx.log(ngx.ERR, "Failed to set cache: ", err)end-- 获取缓存local value, flags = cache_dict:get("my_key")if value thenngx.say("value: ", value)elsengx.say("no cache found for my_key")end}}
6.3 操作共享词典
-- 获取本地缓存对象local item_cache = ngx.shared.item_cache
-- 存储, 指定key、value、过期时间,单位s,默认为0代表永不过期item_cache:set('key', 'value', 1000)-- 读取
local val = item_cache:get('key')
7. 获取get请求参数
get请求参数通常通过url传递。
7.1 location配置
location /getparam {default_type application/json;content_by_lua_file lua/lua-http-param.lua;}
7.2 lua文件
lua文件lua-http-param.lua:
-- 获取get请求的参数
local arg = ngx.req.get_uri_args();
for k,v in pairs(arg)
dongx.say("key:",k," value:",v);
end
7.3 浏览器访问请求
http://ip:port/getparam?test=1
7.4 输出
key:test value:1
7.5 参数写入redis
-- 获取get请求的参数
local redis = require "resty.redis";
local red = redis:new();
red:connect("127.0.0.1",6379);
-- 省去链接错误的判断,前面课程中有
local arg = ngx.req.get_uri_args();
for k,v in pairs(arg)
dongx.say("key:",k," value:",v);red:set(k,v);
end
测试: http://192.168.182.111/?id=1
8. 获取请求头参数
8.1 location配置
location配置:
location /getheaders {default_type application/json;content_by_lua_file lua/http-header.lua;}
8.2 lua文件
lua文件http-header.lua:
-- 获取header参数
local headers = ngx.req.get_headers();
for k,v in pairs(headers)
dongx.say("[header] key:",k," value:",v);
end
8.3 浏览器请求地址
http://ip:port/getheaders
8.4 浏览器显示
[header] key:user-agent value:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36
[header] key:accept-language value:zh-CN,zh;q=0.9,en-US;q=0.8,en-GB;q=0.7,en;q=0.6
[header] key:connection value:keep-alive
[header] key:accept-encoding value:gzip, deflate
[header] key:upgrade-insecure-requests value:1
8.5 lua文件增加if字符串判断
增加if判断字符串是否相等
-- 获取header参数
local headers = ngx.req.get_headers();
for k,v in pairs(headers)
doif k == 'user-agent' thenngx.say("[header] key:",k," value:",v);end
end
8.6 访问
http://ip:port/getheaders
8.7 输出
[header] key:user-agent value:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36
8.8 lua文件增加md5计算
lua文件配置:
-- 获取header参数
local headers = ngx.req.get_headers();
for k,v in pairs(headers)
doif k == 'user-agent' thenngx.say("[header] key:",k," value:",v);local md5 = ngx.md5(str)ngx.say("md5:",md5," value:",v);end
end
8.9 访问
http://ip:port/getheaders
8.10 输出
[header] key:user-agent value:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36
md5:d41d8cd98f00b204e9800998ecf8427e value:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36
9. 获取post body 键值对 参数
9.1 location配置
location /postbodyparam {default_type application/json;content_by_lua_file lua/http-post-body.lua;}
9.2 lua文件
http-post-body.lua
-- 获取post body kv参数
-- 重要:读取body
ngx.req.read_body();
local postArgs = ngx.req.get_post_args();
for k,v in pairs(postArgs)
dongx.say("[post] key:",k," value:",v);
end
9.3 访问
http://ip:port/postbodyparam
9.4 输出
[post] key:testkey value:testvalue