推荐使用 Lua 模块(lua-nginx-module)而非 Perl 模块扩展 Nginx;前者现代轻量、非阻塞、生态活跃,支持协程与异步 I/O,而后者老旧、阻塞、维护弱且功能受限。

可以通过 Nginx 的第三方模块,分别引入 Perl 或 Lua 支持,从而在请求处理各阶段执行脚本逻辑。两者定位不同:Perl 模块(ngx_http_perl_module)功能较老、维护弱、仅支持阻塞式操作;Lua 模块(lua-nginx-module)更现代、轻量、非阻塞、生态活跃,是当前主流推荐方案。
用 Perl 模块扩展 Nginx(不推荐新项目)
该模块由 Nginx 官方提供,但需编译时显式启用(默认不开启),且只支持 Perl 5.6+ 的嵌入式解释器,无法调用 CPAN 模块中的 XS 代码,也不能发起网络 I/O(如 HTTP 请求、数据库连接)。
- 编译 Nginx 时添加:
--with-http_perl_module - 配置示例(在
location中运行简单 Perl 逻辑):location /perl-hello { perl 'sub { return [200, {"Content-Type" => "text/plain"}, ["Hello from Perl!"]]; }'; } - 复杂逻辑建议写成独立 .pm 文件,通过
perl_require加载,但要注意变量作用域和线程安全(Nginx 使用多进程 prefork 模型,Perl 解释器在每个 worker 进程中独立实例化)
用 Lua 模块扩展 Nginx(推荐首选)
lua-nginx-module 是 OpenResty 团队开发的高性能模块,深度集成到 Nginx 事件循环中,支持协程、异步非阻塞 I/O(HTTP、MySQL、Redis 等),并可复用大量 Lua 库(如 lua-resty-* 系列)。
- 最简方式:直接安装 OpenResty(已内置该模块及常用库),无需手动编译
- 若需在原生 Nginx 上使用,需下载模块源码,编译时添加:
--add-module=/path/to/lua-nginx-module,并确保系统已安装 LuaJIT 或 Lua 5.1+ 开发包 - 典型用法示例(记录请求时间戳并注入响应头):
location /api { access_by_lua_block { ngx.var.request_time_start = ngx.now() } header_filter_by_lua_block { ngx.header["X-Processed-Time"] = tostring(ngx.now() - ngx.var.request_time_start) } proxy_pass http://backend; } - 支持文件内联(
content_by_lua_file /path/to/script.lua),便于组织复杂逻辑
关键差异与选型建议
Perl 模块适合已有 Perl 脚本遗产、且逻辑极其简单(无外部依赖、无网络调用)的场景;Lua 模块适用于绝大多数动态需求:鉴权、限流、灰度路由、AB 测试、日志增强、API 聚合等。
- 性能:LuaJIT 编译执行,远快于 Perl 解释器;协程模型避免阻塞 worker
- 生态:OpenResty 提供
lua-resty-core、lua-resty-http、lua-resty-limit-traffic等成熟组件 - 调试:支持
ngx.log、print、以及resty-cli交互式测试 - 限制:所有 Lua 代码运行在 Nginx 进程上下文中,不能使用标准 Lua 的
os.execute、io.open(除非明确启用 unsafe API)
快速验证 Lua 是否生效
在 Nginx 配置中加入以下最小测试块:
location /lua-test {
content_by_lua_block {
ngx.say("Lua is working at ", ngx.var.time_iso8601)
}
}重载 Nginx 后访问该路径,若返回带时间戳的文本,说明模块已正确加载并运行。


















