openresty nginx+lua
处理参数接口
location /getNameByGender {
default_type '';
add_header Content-Type 'text/html; charset=utf-8';
# default_type 'text/html';
# charset utf-8;
set_by_lua $string "
-- get uri_args
local uri_args=ngx.req.get_uri_args();
local name=uri_args.name;
local gender=uri_args['gender'];
if gender=='1' then
return name..'mister 范德萨';
elseif gender=='0' then
return name..'mistress 放到';
else
return name;
end
";
header_filter_by_lua "
-- ccc必须使用引号,因为是在luajit中
ngx.header.bbb='ccc'
";
return 202 $string;
}
中文会产生乱码, Content-Type 跟上 charset=utf-8 OR 加入配置 charset utf-8;
add_header Content-Type会覆盖charset utf-8;
charset utf-8;必须与default_type配合
操作redis
location /redis {
default_type 'text/plain';
resolver 192.168.8.1;
content_by_lua_block {
local redis=require 'resty.redis' -- import redis module
local obj=redis:new()
obj:set_timeout(1000) -- ms
local res,err=obj:connect('ram2.concerto.com',6379)
if not res then
ngx.say('failed to connect redis, ',err)
return
end
res,err=obj:set('username','adorn') -- 存入数据
if not res then
ngx.say('failed to set username')
return
end
local res,err=obj:get('username') -- read data from redis
if not res then
ngx.say('failed to read username from redis')
return
end
ngx.say(res)
obj:close()
}
}
操作mysql
SQL
create database nginx;
use nginx;
create table users(
id int primary key auto_increment,
username varchar(30),
birthday date,
salary double
);
insert into users(id,username,birthday,salary) values(null,"TOM","1988-11-11",10000.0);
insert into users(id,username,birthday,salary) values(null,"JERRY","1989-11-11",20000.0);
insert into users(id,username,birthday,salary) values(null,"ROWS","1990-11-11",30000.0);
insert into users(id,username,birthday,salary) values(null,"LUCY","1991-11-11",40000.0);
insert into users(id,username,birthday,salary) values(null,"JACK","1992-11-11",50000.0);
lua
查
location /mysql {
add_header content-type 'text/plain';
resolver 192.168.8.1;
content_by_lua_block {
local mysql=require 'resty.mysql';
local db=mysql:new();
local res,err=db:connect {
host='ram2.concerto.com',
port=3306,
user='root',
password='aegean',
database='nginx'
};
if not res then
ngx.say('failed to connect mysql, ',err);
return;
end
db:set_timeout(1000);
db:send_query('select * from users where id=1');
local res,err,errcode,sqlstate=db:read_result();
if not res then
ngx.say('res is empty, ',err);
return
end
ngx.say(res[1].id..','..res[1].username..','..res[1].birthday..','..res[1].salary);
db:close();
}
}
cjson 返回json
location /mysql {
add_header content-type 'text/plain';
resolver 192.168.8.1;
content_by_lua_block {
local mysql=require 'resty.mysql';
local cjson=require 'cjson';
local db=mysql:new();
local res,err=db:connect {
host='ram2.concerto.com',
port=3306,
user='root',
password='aegean',
database='nginx'
};
if not res then
ngx.say('failed to connect mysql, ',err);
return;
end
db:set_timeout(1000);
--db:send_query('select * from users where id=1');
db:send_query('select * from users');
local res,err,errcode,sqlstate=db:read_result();
if not res then
ngx.say('res is empty, ',err);
return
end
ngx.say(cjson.encode(res));
for i,v in ipairs(res) do
ngx.say(v.id..','..v.username..','..v.birthday..','..v.salary);
end
db:close();
}
}
CRUD
location /mysql {
add_header content-type 'text/plain';
resolver 192.168.8.1;
content_by_lua_block {
local mysql=require 'resty.mysql';
local cjson=require 'cjson';
local db=mysql:new();
local res,err=db:connect {
host='192.168.8.1',
port=3306,
user='b',
password='b',
database='nginx',
max_packet_size=1024,
compact_arrays=false
};
if not res then
ngx.say('failed to connect mysql, ',err);
return;
end
db:set_timeout(1000);
local res,err,errcode,sqlstate=db:query("insert into users (id,username,birthday,salary) values (null, 'adorn', '2022-1-22', 12311)"); --insert
local res,err,errcode,sqlstate=db:query('update users set username="vvbb" where id=2') --update
local res,err,errcode,sqlstate=db:query('delete from users where id=3'); --delete
local res,err,errcode,sqlstate=db:query('select * from users');
if not res then
ngx.say('res is empty, ',err);
return
end
ngx.say(cjson.encode(res));
for i,v in ipairs(res) do
ngx.say(v.id..','..v.username..','..v.birthday..','..v.salary);
end
db:close();
}
}
使用ngx_lua模块完成Redis缓存预热。
分析:
(1)先得有一张表(users)
(2)浏览器输入如下地址
http://191.168.200.133?username=TOM
(3)从表中查询出符合条件的记录,此时获取的结果为table类型
(4)使用cjson将table数据转换成json字符串
(5)将查询的结果数据存入Redis中
init_by_lua_block { # location http
redis=require 'resty.redis'
mysql=require 'resty.mysql'
cjson=require 'cjson'
}
location /cache {
default_type 'text/html';
resolver 192.168.8.1;
content_by_lua_block {
-- acquire request arg username
local param=ngx.req.get_uri_args()['username']
local db=mysql:new()
local res,err=db:connect {
host='192.168.8.1',
port=3306,
user='root',
password='aegean',
database='nginx'
}
if not res then
ngx.say('failed connect mysql: ',err)
return
end
db:set_timeout(1000)
local sql=''
if not param then
sql='select * from users'
else
sql='select * from users where username='..'"'..param..'"'
end
local res,err,errcode,sqlstate=db:query(sql)
if not res then
ngx.say('failed to query from mysql: ',err)
end
local obj=redis:new()
result,err=obj:connect('ram2.concerto.com',6379)
if not result then
ngx.say('failed to connect to redis: ',err)
return
end
obj:set_timeout(1000)
for i,v in ipairs(res) do
obj:set("user_"..v.username,cjson.encode(v))
end
ngx.say(cjson.encode(res))
obj:close()
db:close()
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2020-10-08 python-----craftsmanship
2020-10-08 异常处理
2020-10-08 python 索引技巧
2020-10-08 property装饰器的实现 & 描述器的深入思考
2020-10-08 DoubleLinkedList双向链表容器化