OpenResty相比Nginx在哪些核心能力上有所超越?

摘要:一、本质区别 1.1 基本定义 Nginx: 高性能HTTP和反向代理服务器 OpenResty: 基于Nginx + LuaJIT的全功能Web平台 1.2 架构差异 Nginx核心架构: ┌──────────────
一、本质区别 1.1 基本定义 Nginx: 高性能HTTP和反向代理服务器 OpenResty: 基于Nginx + LuaJIT的全功能Web平台 1.2 架构差异 Nginx核心架构: ┌─────────────────────────────────┐ │ Nginx (C语言编写) │ │ ┌─────────┐ ┌─────────┐ │ │ │ 模块系统 │ │配置语言 │ │ │ └─────────┘ └─────────┘ │ └─────────────────────────────────┘ OpenResty架构: ┌─────────────────────────────────┐ │ OpenResty平台 │ │ ┌─────────────────────────┐ │ │ │ Nginx核心 │ │ │ ├─────────────────────────┤ │ │ │ LuaJIT引擎 │ │ │ ├─────────────────────────┤ │ │ │ lua-nginx-module │ │ │ ├─────────────────────────┤ │ │ │ 大量Lua模块库 │ │ │ └─────────────────────────┘ │ └─────────────────────────────────┘ 二、OpenResty独有能力 2.1 完整的Lua编程能力 原生Nginx的限制 # Nginx配置是声明式的 location /api { proxy_pass http://backend; limit_req zone=api burst=5; add_header X-Cache $upstream_cache_status; } OpenResty的编程能力 -- 完整的Lua脚本控制 location /api { access_by_lua_block { -- 复杂的业务逻辑 local user_id = get_user_from_token() local rate_limit_key = "rate:" .. user_id -- 动态决策 if is_blacklisted(user_id) then ngx.exit(403) end -- 自定义限流 local limiter = limit.conn("my_limit", 10, 100, 0.5) local delay, err = limiter:incoming(user_id, true) -- 请求改写 ngx.req.set_header("X-User-ID", user_id) } proxy_pass http://backend; } 2.2 请求处理阶段的完全控制 OpenResty的11个处理阶段 -- 完整的请求生命周期控制 init_by_lua_block -- Nginx启动时执行 init_worker_by_lua_block -- Worker进程启动时 set_by_lua_block -- 变量赋值阶段 # 请求处理流程 rewrite_by_lua_block -- 重写阶段 access_by_lua_block -- 访问控制阶段 ✔ content_by_lua_block -- 内容生成阶段 header_filter_by_lua_block -- 响应头过滤 body_filter_by_lua_block -- 响应体过滤 balancer_by_lua_block -- 负载均衡决策 timer -- 定时任务 log_by_lua_block -- 日志记录阶段 实际应用场景 -- 1. 启动时初始化 init_by_lua_block { req
阅读全文