7.9.1 OpenResty架构与组件概览
OpenResty架构与组件概览#
OpenResty 是基于 Nginx 的高性能 Web 平台,将 Nginx 事件驱动模型与 LuaJIT 脚本能力深度结合,适用于 API 网关、动态路由、鉴权与高并发服务场景。本节聚焦架构认知、核心组件、基础安装与最小可运行示例。
架构原理草图
核心组件与作用
- Nginx:事件驱动与连接管理,稳定高并发基础。
- LuaJIT:高性能 Lua 运行时,支持 JIT 与 FFI。
- ngx_lua:在 Nginx 生命周期阶段执行 Lua(rewrite/access/content/log)。
- lua-resty-* 生态库:HTTP、Redis、MySQL、限流、JWT 等能力封装。
- OpenResty Bundle:官方打包集合,避免模块版本不兼容。
安装与版本查看(示例以 Linux x86_64 为例)
# 1) 安装依赖
sudo yum install -y pcre pcre-devel openssl openssl-devel zlib zlib-devel gcc make
# 2) 下载并解压
cd /usr/local/src
wget https://openresty.org/download/openresty-1.21.4.1.tar.gz
tar -xf openresty-1.21.4.1.tar.gz
cd openresty-1.21.4.1
# 3) 编译安装
./configure --prefix=/usr/local/openresty
make -j4 && sudo make install
# 4) 验证版本
/usr/local/openresty/nginx/sbin/nginx -V
命令解释
- ./configure --prefix=...:指定安装目录。
- nginx -V:查看编译参数与内置模块,确认已包含 ngx_lua。
最小可运行示例(验证 OpenResty 可执行 Lua)
文件路径:/usr/local/openresty/nginx/conf/nginx.conf
worker_processes 1;
events { worker_connections 1024; }
http {
lua_shared_dict my_cache 10m;
server {
listen 8080;
location /hello {
content_by_lua_block {
ngx.header.content_type = "text/plain"
ngx.say("Hello OpenResty")
}
}
location /count {
content_by_lua_block {
local dict = ngx.shared.my_cache
local v, _ = dict:incr("hits", 1, 0)
ngx.say("hits=", v)
}
}
}
}
启动与验证:
/usr/local/openresty/nginx/sbin/nginx -t
/usr/local/openresty/nginx/sbin/nginx
curl http://127.0.0.1:8080/hello
curl http://127.0.0.1:8080/count
预期效果
- /hello 返回 Hello OpenResty
- /count 返回 hits=1 递增计数
请求阶段与执行模型(关键点示例)
location /phase {
rewrite_by_lua_block { ngx.var.arg_a = "1" }
access_by_lua_block { ngx.req.set_header("X-Auth", "ok") }
content_by_lua_block { ngx.say("phase ok") }
log_by_lua_block { ngx.log(ngx.INFO, "logged") }
}
rewrite_by_lua_block:重写阶段修改变量或 URIaccess_by_lua_block:鉴权或请求拦截content_by_lua_block:生成响应正文log_by_lua_block:记录额外日志
常见排错与定位
# 1) 检查配置语法
/usr/local/openresty/nginx/sbin/nginx -t
# 2) 查看错误日志(默认路径)
tail -f /usr/local/openresty/nginx/logs/error.log
# 3) 端口冲突定位
ss -lntp | grep 8080
排错提示:
- 若提示 unknown directive "content_by_lua_block":说明未加载 ngx_lua(安装或编译参数不正确)。
- 若 lua_shared_dict 报错:检查是否放在 http {} 作用域内。
练习
1. 将 /hello 改为返回 JSON,并设置 Content-Type: application/json。
2. 增加一个 /time 接口,返回 os.date() 的时间字符串。
3. 在 access_by_lua_block 中判断请求头 X-Token 是否等于 abc,不满足返回 403。