去年 Nginx 发布了 nginScript,一个基于 Nginx 的 JavaScript 执行环境
可以通过 nginScript 扩展自己的 Nginx 服务器的能力
Nginx 非常强大,通过各种指令可以定义出复杂的配置,但有时可能无法很好的满足我们的需求,毕竟 Nginx 团队和第三方社区开发的模块是有限的
可以自己开发 C 模块,但有一定门槛(腾云科技ty300.com),Nginx 希望为大家提供更加方便的扩展方式,便推出了 nginScript
nginScript 包含2部分:
1. JS VM, Nginx 自定义的JS虚拟机,根据自己的需求定制,轻便高效
2. 配置语法,可以让我们在 Nginx 配置文件中嵌入JavaScript代码片段
示例
- 变量声明指令 js_set
修改配置文件 nginx.conf
http {
...
js_set $msg "
var m = ‘Hello ‘;
m += ‘world!‘;
m;
";
...
server {
...
location /hello {
add_header Content-Type text/plain;
return 200 $msg;
}
...
}
}
保存配置,重启 nginx -s reload,浏览器中访问
通过 js_set 声明了变量 $msg,然后在 location 中调用
- 执行指令 js_run
在 server 块儿中添加:
location /run {
js_run "
var res;
res = $r.response;
res.contentType = ‘text/plain‘;
res.status = 200;
res.sendHeader();
res.send( ‘test run‘ );
res.finish();
";
}
执行效果
js_run 指令在内容生成阶段被执行, 仅能在 location 块中使用
- 请求参数
http {
...
js_set $summary "
var a, s, h;
s = ‘JS summary\n\n‘;
s += ‘Method: ‘ + $r.method + ‘\n‘;
s += ‘HTTP version: ‘ + $r.httpVersion + ‘\n‘;
s += ‘Host: ‘ + $r.headers.host + ‘\n‘;
s += ‘Remote Address: ‘ + $r.remoteAddress + ‘\n‘;
s += ‘URI: ‘ + $r.uri + ‘\n‘;
s += ‘Headers:\n‘;
for (h in $r.headers) {
s += ‘ header \"‘ + h + ‘\" is \"‘ + $r.headers[h] + ‘\"\n‘;
}
s += ‘Args:\n‘;
for (a in $r.args) {
s += ‘ arg \"‘ + a + ‘\" is \"‘ + $r.args[a] + ‘\"\n‘;
}
s;
";
...
server {
...
location /summary {
add_header Content-Type text/plain;
return 200 $summary;
}
...
}
...
}
在 http 块儿中、server块儿外定义变量 $summary,在 server 块儿中添加一个 location
$summary 的作用是演示如何访问各个请求参数,例如 $r.headers 可以访问头信息、$r.args 可以访问Url中的参数,还有上面的例子中使用 $r.response 获得了响应对象
执行效果
安装
$ mkdir -p ~/nginScript
cd ~/nginScript
$ wget http://nginx.org/download/nginx-1.9.5.tar.gz
$ git clone https://github.com/nginScript/nginScript --depth=1
$ tar xfvz nginx-1.9.5.tar.gz
$ cd nginx-1.9.5
$ ./configure --add-module=../nginScript/nginx --prefix=$HOME/nginScript/nginx
$ make
$ make install
稿源:勤快学QKXue.NET