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()
  }
}
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号