Nginx ≥1.19.5 可直接启用内置 njs,无需重编译;需确认模块加载、js_import 引入脚本、按场景选用 js_content/js_filter/js_set 等指令,脚本须 export default 导出函数,运行于受限沙箱中。

不需要重编 Nginx 源码,只要 Nginx 版本 ≥ 1.19.5(官方内置 njs),就能直接启用并扩展逻辑功能。关键在于确认模块已加载、正确引入脚本、按场景选用合适指令。
确认 njs 模块是否已就绪
运行 nginx -V 2>&1 | grep -o 'njs',若输出 njs,说明已内置支持;若无输出,但系统为 Ubuntu/Debian,可直接安装动态模块:
sudo apt install libnginx-mod-http-js- 在
nginx.conf最顶部添加:load_module modules/ngx_http_js_module.so;
CentOS/RHEL 用户若未编译过,推荐用官方预编译包或升级到较新版本(如 1.25.x),避免手动编译依赖。
用 js_import 引入外部 JS 文件
在 http 块中声明脚本位置,路径需为绝对路径或相对于配置文件的相对路径:
js_import /etc/nginx/conf.d/auth.js;- 脚本内必须用
export default { funcName }导出函数 - 不支持
require或 Node.js 内置模块(如 fs、net),但可使用crypto.subtle等 webcrypto API
按用途选对执行指令
不同指令触发时机和能力差异大,不能混用:
-
js_content:完全由 JS 生成响应,适合简单 API 或健康检查页 -
js_filter:在 location 匹配后、proxy_pass 前执行,可中断请求(如鉴权失败r.return(403)) -
js_set:用于变量赋值,例如生成 trace-id:js_set $trace_id 'Date.now() + "-" + Math.random().toString(36).substr(2, 9)'; -
js_header_filter和js_body_filter:分别修改响应头与响应体,注意需配合清除Content-Length
写脚本时避开常见陷阱
njs 是无状态、单次调用的沙箱环境,不是 Node.js:
- 不要在函数外定义变量存状态(如计数器),每次请求都是全新上下文
- 禁止同步耗时操作(如循环上万次),控制在毫秒级,否则阻塞 worker
- 日志统一用
r.warn('msg')或r.error('msg'),console.log不输出 - 改请求头读
r.headersIn,但要发给上游需靠proxy_set_header配合,njs 本身不能直接写入 upstream headers











