Nginx JavaScript (njs) 是一个嵌入式的 JavaScript 解释器,用于在 Nginx HTTP 和 Stream 模块中编写动态脚本。njs 提供了一种灵活的方式来扩展 Nginx 的功能,而无需编译复杂的 C 模块。以下是一个详细的 njs 入门手册。
安装 njs
njs 通常与 Nginx 一起发布,但你可能需要确保你的 Nginx 版本支持 njs。你可以从源代码编译 njs,也可以通过包管理器安装。
从源代码编译
-
下载并编译 njs:
git clone https://hg.nginx.org/njs cd njs ./configure make sudo make install
-
下载并编译 Nginx,启用 njs 模块:
git clone https://github.com/nginx/nginx.git cd nginx ./auto/configure --add-module=../njs/nginx make sudo make install
使用包管理器安装
在基于 Debian 的系统(如 Ubuntu)上:
sudo apt-get install nginx-module-njs
在基于 Red Hat 的系统(如 CentOS)上:
sudo yum install nginx-module-njs
配置 njs
确保在 Nginx 配置文件中启用 njs 模块。
load_module modules/ngx_http_js_module.so;
然后,在 Nginx 配置文件中添加 js_include
指令来引入 JavaScript 文件。
http {
js_include /path/to/script.js;
...
}
编写 njs 脚本
创建一个简单的 njs 脚本,例如 script.js
:
function hello(r) {
r.return(200, "Hello, njs!");
}
export default {hello};
在 Nginx 中使用 njs 脚本
在 Nginx 配置中调用 njs 脚本:
http {
js_include /path/to/script.js;
server {
listen 80;
location /hello {
js_content hello;
}
}
}
重启 Nginx:
sudo systemctl restart nginx
现在,访问 http://your_server_ip/hello
将返回 “Hello, njs!”.
njs 常用 API
njs 提供了一些常用 API 来处理请求和响应。以下是一些基本示例:
处理请求头
function log_headers(r) {
for (var header in r.headersIn) {
r.log(header + ": " + r.headersIn[header]);
}
r.return(200, "Check the logs for request headers.");
}
export default {log_headers};
设置响应头
function set_headers(r) {
r.headersOut['Content-Type'] = 'text/plain';
r.return(200, "Headers set!");
}
export default {set_headers};
处理查询参数
function get_query_param(r) {
var param = r.args['param'] || 'default';
r.return(200, "Query parameter: " + param);
}
export default {get_query_param};
调试 njs
使用 r.log
方法记录调试信息:
function debug_example(r) {
r.log("Debugging njs script");
r.return(200, "Check the logs for debug info.");
}
export default {debug_example};
查看 Nginx 错误日志以获取调试信息:
sudo tail -f /var/log/nginx/error.log
进阶使用
njs 支持更多高级功能,如子请求、变量操作、事件处理等。以下是一些进阶示例:
发起子请求
function subrequest_example(r) {
r.subrequest('/other', function(reply) {
r.return(200, "Subrequest response: " + reply.responseText);
});
}
export default {subrequest_example};
操作 Nginx 变量
function variable_example(r) {
var var_value = r.variables.my_variable || 'not set';
r.return(200, "Variable value: " + var_value);
}
export default {variable_example};
参考资料
通过以上内容,你可以快速入门 njs 并开始使用它来扩展 Nginx 的功能。如果有任何问题或需要进一步帮助,请随时提问。