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:重写阶段修改变量或 URI
  • access_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。