-
lua语法 略
# 安装LuaJIT(lua代码解释器),版本自行适配
wget http://luajit.org/download/LuaJIT-2.0.2.tar.gz
# 编译安装
make install PREFIX=/usr/local/LuaJIT
# 导入环境变量
export LUAJIT_LIB=/usr/local/LuaJIT/lib
export LUAJIT_INC=/usr/local/LuaJIT/include/luajit-2.0
# 查看环境变量
env
# 下载nginx模块并解压,版本自行适配
# ngx_devel_kit
wget https://github.com/simpl/ngx_devel_kit/archive/v0.3.0.tar.gz
# lua-nginx-module
wget https://github.com/openresty/lua-nginx-module/archive/v0.10.9rc7.tar.gz
# 重新编译nginx
# 执行nginx -V 可以获取当前nginx编译参数,copy这些编译参数并在后面加上
--add-module=/opt/download/ngx_devel_kit-0.3.0 \
--add-module=/opt/download/lua-nginx-module-0.10.9rc7
# 执行编译
make -j 4 && make install
# 使用yum安装nginx:自行下载对应版本源码按照以上步骤编译,最后替换可执行文件
cp -rfp objs/nginx /path/sbin/nginx
# 加载lua库,加入到ld.so.conf文件
echo "/usr/local/LuaJIT/lib" >> /etc/ld.so.conf
ldconfig
# 注意,lua调度redis需要安装openresty工具包
# 以下使用yum安装,path=/usr/local/openresty
yum install yum-utils
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
yum install openresty
-
nginx调用lua模块指令
- 设置lua变量,可以实现负载的赋值逻辑
set_by_lua
set_by_lua_file - 请求访问阶段处理,用于访问控制
access_by_lua
access_by_lua_file - 内容处理器,接收请求处理并输出响应
content_by_lua
content_by_lua_file
- 设置lua变量,可以实现负载的赋值逻辑
-
nginx lua api
- nginx变量:ngx.var
- 获取请求头:ngx.req.get_headers
- 获取url请求参数:ngx.req.get_uri_args
- 重定向:ngx.redirect
- 输出响应内容体:ngx.print
- 输出响应内容体,最后输出一个换行符:ngx.say
- 输出响应头:ngx.header
-
实践-灰度发布(nginx+lua+redis)
-
实践-WAF防火墙(nginx+lua+redis)
-
实践-动态代理(nginx+lua+redis)
# nginx配置
# 在http指令块中添加lua package
lua_package_path "/usr/local/openresty/lualib/?.lua;;";
lua_package_cpath "/usr/local/openresty/lualib/?.so;;";
server
{
listen 80 default_server;
location /
{
set $target '';
access_by_lua_file /usr/local/nginx/conf/lua/redis.lua;
proxy_pass $target;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Real-IP $remote_addr;
}
}
-- lua脚本
-- 关闭redis连接
function close_redis(red)
if not red then
return
end
local ok, err = red:close()
if not ok then
ngx.say("close redis error : ", err)
end
end
-- 建立redis连接
local redis = require("resty.redis")
local red = redis:new()
red:set_timeout(1000)
local ip = "127.0.0.1"
local port = 6379
local ok, err = red:connect(ip, port)
if not ok then
ngx.say("connect to redis error : ", err)
return close_redis(red)
end
-- 获取请求参数
local key = ngx.var.arg_key
local target = ''
-- 调用API获取target
local resp, err = red:get(key)
if not resp then
ngx.say("get msg error : ", err)
return close_redis(red)
end
-- 数据为空处理
if resp == ngx.null then
target = ''
end
target = resp
ngx.var.target = target
close_redis(red)
参考:
nginx lua 教程
openresty installation
nginx lua redis 灰度发布
nginx lua memcache 灰度发布
yum install nginx 新增模块方法
nginx lua redis 读写缓存
git openresty/lua-resty-redis