openresty和nginx有什么本质区别,导致它们在性能和功能上有所不同?
摘要:OpenResty vs Nginx 对比笔记 📌 核心定位差异 特性 Nginx OpenResty 本质 Web服务器反向代理负载均衡器 基于Nginx的应用开发平台 编程模型 静态配置驱动 Lua脚
OpenResty vs Nginx 对比笔记
📌 核心定位差异
特性
Nginx
OpenResty
本质
Web服务器/反向代理/负载均衡器
基于Nginx的应用开发平台
编程模型
静态配置驱动
Lua脚本驱动
扩展性
需编写C模块
直接编写Lua脚本
动态能力
有限
强大(运行时逻辑)
学习曲线
较低
中等(需学Lua)
🏗️ 架构对比
Nginx架构
Nginx核心 (C语言)
├── HTTP模块
├── 事件驱动模块
├── Mail模块
└── 第三方C模块(需编译集成)
配置方式:纯文本配置文件 (nginx.conf)
修改生效:需重载配置
逻辑处理:有限的变量和条件语句
OpenResty架构
Nginx核心
├── **LuaJIT虚拟机**(高性能Lua运行时)
├── **lua-nginx-module**(核心桥梁)
├── 大量内置Lua库
├── 第三方Lua模块
└── 标准Nginx模块
编程接口:Lua脚本嵌入配置文件
动态执行:请求处理各阶段注入逻辑
生态丰富:100+高质量Lua库
🎯 功能特性对比
Nginx核心功能
静态文件服务
反向代理
负载均衡(轮询、IP Hash、最少连接)
HTTP缓存
SSL/TLS终止
基本的访问控制
Gzip压缩
简单的Rewrite规则
OpenResty增强功能
全阶段Lua脚本控制(11个执行阶段)
cosocket API(非阻塞网络通信)
共享内存字典(高效进程间通信)
定时器功能
子请求(内部请求其他location)
动态SSL证书加载
内置模板引擎
JSON/Protobuf编解码
📊 执行阶段对比
Nginx处理流程
客户端请求
↓
Nginx配置解析
↓
静态规则匹配
↓
模块处理
↓
响应返回
配置静态,运行时不可变
逻辑固定,灵活性低
OpenResty处理流程
客户端请求
↓
init_by_lua* ← Lua全局初始化
↓
rewrite_by_lua* ← URL重写阶段
↓
access_by_lua* ← 访问控制阶段
↓
content_by_lua* ← 内容生成阶段
↓
header_filter_by_lua* ← 响应头过滤
↓
body_filter_by_lua* ← 响应体过滤
↓
log_by_lua* ← 日志记录阶段
每个阶段都可注入Lua逻辑
动态决策,运行时可修改行为
💻 代码示例对比
场景:动态路由
Nginx实现(静态配置):
# 需提前知道所有规则
map $arg_user_type $backend {
default backend_default;
vip backend_vip;
admin backend_admin;
}
location / {
proxy_pass http://$backend;
}
OpenResty实现(动态逻辑):
location / {
access_by_lua_block {
-- 从Redis读取路由规则
local redis = require "resty.redis"
local red = redis:new()
red:connect("127.0.0.1", 6379)
local user_type = ngx.var.arg_user_type
local backend = red:get("route:" .. user_type)
if backend then
ngx.var.target_backend = backend
else
-- 默认后端
ngx.var.target_backend = "backend_default"
end
}
proxy_pass http://$target_backend;
}
🔌 网络通信能力
Nginx的限制
上游通信:仅限proxy_pass, fastcgi_pass等
外部服务:需第三方模块或外部程序
并发请求:需多个location配置
OpenResty的cosocket
-- 并发请求多个外部服务
