Nginx 通过引入 QuickJS 引擎(体积仅 367KB,支持完整的 ES2023 标准),显著扩展了 JavaScript 的应用场景,使其能够处理更复杂的逻辑而无需依赖外部服务。以下是 QuickJS 在 Nginx 中的核心应用场景及优势分析:
1. 动态路由与流量分发
场景:根据请求头(如 User-Agent、Authorization)、IP 地址、时间或设备类型,将请求动态转发至不同后端服务。
示例:
//javascript
async function route(r) {
const isMobile = /Mobile/i.test(r.headersIn['User-Agent']);
if (isMobile) {
r.internalRedirect('/mobile');
} else {
r.internalRedirect('/desktop');
}
}
优势:无需编写复杂的 if-else 或 rewrite 规则,逻辑更清晰且易于维护。
2. 自定义身份验证与鉴权
场景:在请求到达后端前,通过 JavaScript 实现 JWT 验证、Cookie 解析或调用外部认证服务。
示例:
//javascript
async function auth(r) {
const resp = await ngx.fetch('http://auth/validate', {
method: 'POST',
body: JSON.stringify({ token: r.headersIn['Authorization'] })
});
if (resp.status !== 200) {
r.return(401, 'Unauthorized');
}
}
优势:将鉴权逻辑从后端前置到网关层,减少后端负载并提升安全性。
3. 异步日志与监控
场景:根据请求内容动态生成日志,或调用外部监控系统记录关键指标。
示例:
//javascript
async function logRequest(r) {
const logData = {
url: r.uri,
method: r.method,
clientIp: r.remoteAddress
};
await ngx.fetch('http://log/record', {
method: 'POST',
body: JSON.stringify(logData)
});
}
优势:支持异步操作,避免阻塞请求处理流程。
4. 边缘计算与轻量级数据处理
场景:在靠近用户的边缘节点处理部分逻辑,如数据格式转换、缓存键生成或 A/B 测试分流。
示例:
//javascript
function transformResponse(r) {
const data = JSON.parse(r.responseBody);
data.customField = 'processed by Nginx JS';
r.responseBody = JSON.stringify(data);
}
优势:减少数据传输延迟,提升用户体验。
5. 灰度发布与流量控制
场景:根据用户 ID、请求参数或随机数,将部分流量导向新版本服务。
示例:
//javascript
function canaryRelease(r) {
const userId = r.args.userId;
// 20% 流量到新版本
const shouldRoute = userId % 10 < 3;
if (shouldRoute) {
r.internalRedirect('/new-version');
}
}
优势:无需修改后端代码即可实现灵活的流量管理。
6. 协议转换与中间件处理
场景:在 HTTP 与 WebSocket、gRPC 等协议之间转换,或实现自定义中间件逻辑(如 CORS 处理、请求头修改)。
示例:
//javascript
function addCorsHeaders(r) {
r.headersOut['Access-Control-Allow-Origin'] = '*';
r.headersOut['Access-Control-Allow-Methods'] = 'GET, POST';
}
优势:统一处理跨域问题,减少后端重复代码。
技术优势总结
性能:QuickJS 引擎轻量且高效,官方测试显示 QPS 损耗 < 1%,几乎无感知。
开发体验:支持现代 JavaScript 语法(如 async/await、import/export),调试友好(可通过 console.log 输出日志)。
热更新:修改脚本后无需重启 Nginx,通过 nginx -s reload 即可生效。
生态兼容:可复用前端工具链(如 Vite、Bun)或打包 ES Module 供 Nginx 引用。
适用场景建议
推荐使用:边缘逻辑、网关层处理、轻量级中间件。
谨慎使用:复杂业务逻辑仍建议移交后端服务,避免阻塞 Nginx 事件循环。