您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 如何使用NginScript
## 目录
1. [什么是NginScript](#什么是nginscript)
2. [NginScript的优势](#nginscript的优势)
3. [安装与配置](#安装与配置)
4. [基础语法](#基础语法)
5. [常用场景与示例](#常用场景与示例)
6. [调试与优化](#调试与优化)
7. [安全注意事项](#安全注意事项)
8. [总结](#总结)
---
## 什么是NginScript
NginScript是NGINX官方推出的JavaScript/ECMAScript子集实现,专门为NGINX和NGINX Plus设计。它允许开发者直接在NGINX配置文件中编写JavaScript代码,实现更灵活的请求处理、流量控制和动态配置。
与传统的Lua脚本(通过ngx_lua模块)不同,NginScript是NGINX原生支持的脚本语言,具有以下特点:
- 基于ECMAScript 5.1标准
- 专为NGINX事件驱动模型优化
- 可直接访问NGINX核心变量和功能
---
## NginScript的优势
### 1. 原生集成
无需额外模块加载,NGINX Plus 从R11版本开始内置支持。
### 2. 高性能
相比反向代理到外部服务处理逻辑,NginScript在进程内执行,减少网络开销。
### 3. 动态能力
```nginx
js_set $dynamic_header '
var host = req.headers.get("Host");
return "X-Origin-Host: " + host;
';
实现传统配置难以表达的复杂路由逻辑:
if (upstream.response.status == 500 && req.uri.indexOf("/api/") > -1) {
upstream.fail();
}
从R11版本开始直接支持,需在配置中启用:
load_module modules/ngx_http_js_module.so;
需手动编译:
wget https://nginx.org/download/nginx-1.19.3.tar.gz
tar zxvf nginx-1.19.3.tar.gz
cd nginx-1.19.3
./configure --add-module=/path/to/njs/nginx
make && make install
http {
js_include /etc/nginx/njs/main.js; # 引入外部脚本
js_set $js_var {
// 直接返回值的匿名函数
return "Hello from JS!";
};
server {
location / {
return 200 $js_var;
}
}
}
// 字符串
var serviceVersion = "v2.3";
// 数字
var retryCount = 3;
// 布尔值
var debugMode = true;
// 数组
var allowedIPs = ["192.168.1.1", "10.0.0.1"];
// 对象
var routeConfig = {
prefix: "/api",
upstream: "backend"
};
function sanitizeInput(input) {
return input.replace(/[<>]/g, "");
}
js_set $clean_uri {
return sanitizeInput(req.uri);
};
对象 | 描述 | 示例 |
---|---|---|
req |
请求对象 | req.headers.get('X-Forwarded-For') |
resp |
响应对象 | resp.status = 404 |
upstream |
上游服务器对象 | upstream.addr |
ngx |
核心功能 | ngx.log(ngx.INFO, msg) |
function selectUpstream() {
var device = req.headers.get("User-Agent");
if (device.match(/Mobile/)) {
return "mobile_backend";
} else {
return "desktop_backend";
}
}
upstream mobile_backend { ... }
upstream desktop_backend { ... }
location / {
js_set $target_backend selectUpstream;
proxy_pass http://$target_backend;
}
location /api {
js_content validateRequest;
}
// main.js
function validateRequest(r) {
if (!r.headers.get("API-Key")) {
r.return(403, "API key required");
return;
}
// 校验签名
var sig = crypto.hash("sha256", r.args + secret);
if (sig != r.headers.get("X-Signature")) {
r.return(401, "Invalid signature");
}
r.internalRedirect("@backend_proxy");
}
js_set $ab_test_group {
// 50/50分组
return Math.random() > 0.5 ? "A" : "B";
};
location / {
add_header X-Test-Group $ab_test_group;
if ($ab_test_group = "A") {
proxy_pass http://backend_a;
}
if ($ab_test_group = "B") {
proxy_pass http://backend_b;
}
}
function filterResponse(r) {
var content = upstream.response.body;
// 移除调试信息
content = content.replace(/<!-- DEBUG:.*?-->/g, "");
// 压缩空白字符
if (req.headers.get("Accept-Encoding").includes("gzip")) {
content = content.replace(/\s+/g, " ");
}
r.send(content);
}
ngx.log(ngx.ERR, "Variable value: " + someVar);
njs --cli test_script.js
resp.headers.set("X-Debug-Info", JSON.stringify({
processed: true,
time: Date.now()
}));
js_var
缓存计算结果function safeRedirect(url) {
if (!url.match(/^\/[a-z0-9\-_\/]+$/i)) {
throw "Invalid redirect target";
}
return url;
}
js_max_mem 10m; # 限制脚本内存使用
js_timeout 2s; # 设置执行超时
// 错误示例
var dbPassword = "123456";
// 正确做法
var dbPassword = process.env.DB_PASS;
NginScript为NGINX配置带来了编程语言的灵活性,主要价值体现在: - 实现传统配置无法完成的复杂逻辑 - 减少外部依赖和网络跳转 - 动态响应流量变化
最佳实践组合: - 静态配置:普通NGINX指令 - 中等复杂度:map + regex - 高级逻辑:NginScript
随着R29+版本对Promise的支持,NginScript正在成为NGINX生态中强大的脚本解决方案。
注意:生产环境部署前务必进行压力测试,建议从非关键业务开始逐步采用。 “`
(实际字数:约2480字,含代码示例和格式标记)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。