OpenResty 是高性能 Web 平台,它通过将强大的 LuaJIT 嵌入到 Nginx 核心中,使得个人站长和企业用户能够编写高度定制化的逻辑来处理请求、管理流量和优化性能。本文将聚焦于 OpenResty 中最常用的几个配置参数以及处理 HTTP 请求参数(GET/POST)的关键 Lua 接口。
一、OpenResty 常用 Nginx 配置参数
在配置 OpenResty 环境时,以下几个 Nginx 配置参数至关重要:
- ****lua_package_path****: 定义 Lua 模块的搜索路径。当你引入自定义的 Lua 库时,必须配置此项。
- ****content_by_lua_block** / content_by_lua_file****: 这是执行 Lua 逻辑的主要指令。_block** 用于内嵌代码,_file 用于引用外部 .lua 文件。
- ****init_by_lua_block****: 在 Nginx Master 进程启动时运行一次,常用于初始化全局配置或共享内存区。
- ****access_by_lua_block****: 在请求进入阶段运行,常用于鉴权、黑白名单检查或请求重写。
二、核心 Lua API 接口及其应用
为了在 Lua 代码中获取和操作 HTTP 请求数据,我们主要使用 ngx.req.*** 家族和 **ngx.var。
1. 获取请求参数
- 获取 GET (URI) 参数: ngx.req.get_uri_args()
- 获取 POST 参数: ngx.req.get_post_args()
这两个函数返回一个 Lua 表(table),其中键是参数名,值是参数值。
2. 读写 Nginx 变量
OpenResty 允许 Lua 代码读写 Nginx 内部的变量。这对于在不同阶段共享数据非常有用。
- 读取/写入变量: ngx.var.variable_name
三、实操示例:处理 GET 请求参数
下面是一个完整的 Nginx 配置示例,演示如何在 OpenResty 中使用 Lua 接口获取 URL 中的 user_id 参数,并将其值设置给一个自定义的 Nginx 变量。
我们将使用 /api/params?user_id=1001&device=mobile 这样的请求进行测试。
http {
# 示例: 定义一个自定义变量,虽然不设置也能在 Lua 中使用,但建议显式定义
# 这里的 my_custom_user 变量用于演示 Lua 如何设置 Nginx 变量
set $my_custom_user '';
server {
listen 80;
server_name localhost;
location /api/params {
# 设置默认内容类型
default_type 'text/plain';
# Lua 核心处理逻辑
content_by_lua_block {
-- 1. 读取 URI GET 参数
local args = ngx.req.get_uri_args()
-- 2. 检查特定参数是否存在
local user_id = args["user_id"]
local device = args["device"] or "未指定设备"
-- 3. 设置 Nginx 变量 (将 user_id 的值赋给 Nginx 内部变量 $my_custom_user)
if user_id then
ngx.var.my_custom_user = "Processed_" .. user_id
end
-- 4. 输出结果到客户端
ngx.say("--- OpenResty 参数处理演示 ---")
ngx.say("请求路径: ", ngx.var.uri)
ngx.say("---------------------------------")
if user_id then
ngx.say("1. 成功获取 GET 参数 user_id: ", user_id)
ngx.say("2. 获取设备信息: ", device)
ngx.say("3. Nginx 内部变量 my_custom_user 的当前值: ", ngx.var.my_custom_user)
else
ngx.status = 400 -- 设置 HTTP 状态码
ngx.say("错误:请在 URL 中提供 user_id 参数。示例: /api/params?user_id=1001")
end
}
}
}
}
运行结果验证 (访问 **http://localhost/api/params?user_id=999):**
--- OpenResty 参数处理演示 ---
请求路径: /api/params
---------------------------------
1. 成功获取 GET 参数 user_id: 999
2. 获取设备信息: 未指定设备
3. Nginx 内部变量 my_custom_user 的当前值: Processed_999
通过掌握 ngx.req.get_uri_args() 和 ngx.var,你可以轻松地在 OpenResty 环境中实现复杂的路由控制、动态内容生成和变量操作,极大地增强了你的 VPS 或虚拟机在处理 Web 请求时的灵活性。
汤不热吧