Nginx njs 模块简介与实践
njs(NGINX JavaScript module)是 NGINX 官方推出的动态模块,让你可以用 JavaScript(ECMAScript 5.1 严格模式 + 部分 ES6+ 扩展)直接在 NGINX 内部编写逻辑,而无需编写 C 模块或依赖 Lua/OpenResty。
它极大提升了 NGINX 的可编程性,尤其适合:
- 复杂的访问控制、请求/响应头修改
- 轻量级 API 网关、认证、A/B 测试
- 子请求、异步内容生成、响应过滤
- 与现代 JS 生态结合
最新版本已支持 QuickJS 引擎(完整 ES2023 兼容),性能提升显著,Fetch API、WebCrypto、XML/Zlib 等模块更完善。
一、核心优势(对比 Lua/OpenResty)
| 项目 | njs (NGINX 官方) | OpenResty (Lua) | 选择建议 |
|---|---|---|---|
| 语言 | JavaScript (ES5+ 部分 ES2023) | Lua | 团队熟悉 JS 首选 njs |
| 引擎 | QuickJS / 原生 njs(可选) | LuaJIT | QuickJS 更现代 |
| 模块加载 | 动态模块(无需重编译 NGINX) | 需要 OpenResty 发行版 | njs 更轻便 |
| 官方支持 | NGINX 官方维护 | 第三方 | 稳定性更高 |
| 生态 | Fetch、Crypto、XML、Zlib、共享字典 | 更丰富 Lua 库 | njs 够用且轻量 |
| 性能 | 高(QuickJS 优化后接近原生) | 极高(LuaJIT) | 日常场景差距小 |
| 学习曲线 | 低(前端/全栈开发友好) | 中(Lua 语法不同) | JS 开发者选 njs |
一句话总结:如果你团队偏好 JavaScript,想在原生 NGINX 上加'胶水'逻辑,而不是完整 API 网关,njs 是优雅的选择。
二、快速上手(安装 & Hello World)
1. 安装 njs(主流方式)
Debian/Ubuntu(官方仓库):
apt install nginx-module-njs
Docker(最推荐测试):
docker run -it --rm -p 8080:80 nginx:1.27 njs -V
docker run -p 8080:80 -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro nginxinc/nginx-unprivileged:1.27-njs
从源码(支持 QuickJS):参考官方文档进行源码编译。
2. 最简单 Hello World
创建 http.js:
function hello() {
r.(, );
}
{ hello };

