一.penResty介绍
OpenResty 是我们构建高性能、高并发 Web 架构时不可或缺的利器。它不仅仅是一个 Web 服务器,更是一个基于 Nginx 与 Lua 的高性能 Web 平台。
简单来说,OpenResty 将 Nginx(高性能反向代理/负载均衡器)与 LuaJIT(高性能即时编译器)以及一系列 Lua 模块完美集成,让你能够直接在 Nginx 内部编写业务逻辑,而无需依赖后端应用服务器(如 Java, Go, Python)来处理所有请求。
1.核心架构与原理
OpenResty 的核心在于 Nginx + LuaJIT + 丰富模块 的组合:
- Nginx 基础:继承了 Nginx 的事件驱动、异步非阻塞 I/O 模型和多进程架构(Master/Worker),能够轻松应对高并发连接 1。
- LuaJIT 加速:内置了 LuaJIT(Lua Just-In-Time Compiler),它将 Lua 脚本编译成机器码直接执行,性能比标准 Lua 快数倍,几乎消除了脚本语言的开销 3。
- 11 个执行阶段:OpenResty 完美映射了 Nginx 的 11 个 HTTP 处理阶段(如
rewrite,access,content,log等),允许你在每个阶段注入 Lua 代码来拦截、修改或生成响应
2.核心特性与优势
超高并发性能:
- 利用 Nginx 的非阻塞 I/O,单个 Worker 进程可处理数万并发连接。
- LuaJIT 的即时编译使得 Lua 代码的执行效率接近 C 语言,响应时间通常减少 40-60% 1。
动态内容生成:
- 无需启动后端应用,直接在 Nginx 层通过 Lua 生成动态页面或 API 响应,极大降低延迟。
灵活的请求处理:
丰富的内置模块:
3. 典型应用场景
作为运维,OpenResty 常用于以下场景:
API 网关:
- 实现统一的鉴权(JWT 校验)、限流(基于 IP 或用户 ID)、熔断降级。
- 动态路由:根据版本号(
/api/v1,/api/v2)将请求分发到不同后端 2。
高性能缓存层:
- 利用
lua_shared_dict实现进程间共享内存缓存,减少数据库压力。 - 直接连接 Redis 缓存热点数据,实现“边缘缓存” 2。
- 利用
动态负载均衡:
- 根据后端服务器的健康状态、负载情况,动态调整权重或剔除故障节点。
协议适配与转换:
- 将 HTTP 请求转换为内部 RPC 调用,或将 TCP 流量(如游戏服)进行逻辑处理。
安全防御:
第一步:下载与安装 OpenResty
- 下载: 前往 OpenResty 官网下载页。
- 选择版本: 选择 Win64 版本(例如 openresty-1.29.2.1-win64.zip)。
- 解压: 将其解压到你服务器的路径,例如 D:\openresty-1.29.2.1-win64
第二步:准备 JWT 插件库
OpenResty 需要一个 Lua 库来处理 JWT。
- 下载 lua-resty-jwt 里的 jwt.lua 和 hmac.lua、string.lua。
下载地址:
https://raw.githubusercontent.com/SkyLothar/lua-resty-jwt/master/lib/resty/jwt.lua
https://raw.githubusercontent.com/openresty/lua-resty-string/master/lib/resty/string.lua
https://raw.githubusercontent.com/jkeys089/lua-resty-hmac/master/lib/resty/hmac.lua
手动创建evp.lua
1 | local ffi = require "ffi" |
将这些 .lua 文件放入 D:\openresty-1.29.2.1-win64\lualib\resty 目录下。
- 注意:如果该目录没有这些文件,你可以直接新建。
第三步:配置 HTTPS 证书
在D:\openresty-1.29.2.1-win64\conf\ssl 目录下放置你的 server.crt 和 server.key。
(如果没有,参考使用 OpenSSL 生成自签名证书)。
1 | openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout server.key -out server.crt |
第四步:编写核心配置文件 nginx.conf
编辑 D:\openresty-1.29.2.1-win64\conf\nginx.conf,清空内容并粘贴以下配置。该配置实现了:强制 HTTPS + API Key 校验 + JWT 令牌校验。
1 | worker_processes auto; |
第五步:编写auth_jwt.lua
在D:\openresty-1.29.2.1-win64\conf\lua下创建auth_jwt.lua,同时需要更改成自己的秘钥。
1 | -- ========================================== |
生成秘钥python脚本:
1 | pip install PyJWT |
1 | #!/usr/bin/env python3 |
配置完成后启动D:\openresty-1.29.2.1-win64中的nginx即可。
The End