js_import http from http.js;
server {
listen 8000;
location / {
js_content http.hello;
}
}
function hello(r) {
r.return(200, "Hello world!\n");
}
export default { hello };
HTTP 请求说明:
js_import http from http.js:导入 njs 脚本js_content http.hello:使用 njs 脚本处理请求function hello(r):定义一个函数,处理 HTTP 请求r.return(200, "Hello world!\n"):返回响应export default { hello }:导出函数HTTP 请求原理:
js_import 指令用于导入 njs 脚本,js_content 指令用于使用 njs 脚本处理请求。hello 函数用于处理 HTTP 请求,r 参数是 HTTP 请求对象,可以使用 r.return() 返回响应。
js_import http from http.js;
server {
listen 8000;
location / {
js_content http.access;
}
}
function access(r) {
if (r.args.token != 'secret') {
r.return(401);
}
}
export default { access };
访问控制说明:
js_import http from http.js:导入 njs 脚本js_content http.access:使用 njs 脚本处理请求function access(r):定义一个函数,处理 HTTP 请求r.args.token != 'secret':检查请求参数r.return(401):返回 401 响应export default { access }:导出函数访问控制原理:
access 函数用于处理 HTTP 请求,r 参数是 HTTP 请求对象,可以使用 r.args.token 访问请求参数。如果请求参数不等于 secret,返回 401 响应。
js_import http from http.js;
server {
listen 8000;
location / {
js_set $res http.headers;
add_header X-Response $res;
proxy_pass http://backend;
}
}
function headers(r) {
return JSON.stringify(r.headersOut);
}
export default { headers };
请求头修改说明:
js_set $res http.headers:设置变量add_header X-Response $res:添加响应头function headers(r):定义一个函数,处理 HTTP 请求JSON.stringify(r.headersOut):序列化响应头export default { headers }:导出函数请求头修改原理:
js_set 指令用于设置变量,headers 函数用于处理 HTTP 请求,r 参数是 HTTP 请求对象,可以使用 r.headersOut 访问响应头。
js_import http from http.js;
server {
listen 8000;
location / {
js_body_filter http.lower;
proxy_pass http://backend;
}
}
function lower(s, chunk) {
return chunk.toLowerCase();
}
export default { lower };
响应体修改说明:
js_body_filter http.lower:使用 njs 脚本过滤响应体function lower(s, chunk):定义一个函数,过滤响应体chunk.toLowerCase():将响应体转换为小写export default { lower }:导出函数响应体修改原理:
js_body_filter 指令用于使用 njs 脚本过滤响应体,lower 函数用于过滤响应体,s 参数是流对象,chunk 参数是响应体块。
性能优化原理: njs 脚本在 Nginx 中执行,会影响 Nginx 的性能。避免在脚本中使用循环,因为循环会影响性能。缓存计算结果,避免重复计算,可以提高性能。使用同步 API,避免异步 API,因为异步 API 会影响性能。
function foo(r) {
try {
var result = r.subrequest('/auth');
var response = JSON.parse(result.responseText);
r.return(200, response);
} catch (e) {
r.return(500, "internal error");
}
}
错误处理说明:
try { ... } catch (e) { ... }:捕获异常r.subrequest('/auth'):发送子请求JSON.parse(result.responseText):解析响应体r.return(200, response):返回响应r.return(500, "internal error"):返回错误响应错误处理原理:
使用 try { ... } catch (e) { ... } 捕获异常,避免脚本错误。使用 r.subrequest() 发送子请求,使用 JSON.parse() 解析响应体。如果发生异常,返回错误响应。
function foo(r) {
r.log("foo");
r.return(200, "OK");
}
日志记录说明:
r.log("foo"):记录日志r.return(200, "OK"):返回响应日志记录原理:
使用 r.log() 记录日志,便于故障排查。