在上个月的 nginx.conf 2015 大会上, 官方宣布已经支持通过 javascript 代码来配置 nginx,并把这个实现称命名为——nginscript。使用 nginscript,可以很轻易得在 niginx 配置文件中通过 js 语法来实现自定义的服务器配置。

安装

# 下载最新版本的 nginx 并解压
curl -O http://nginx.org/download/nginx-1.9.5.tar.gz
tar -xzvf nginx-1.9.5.tar.gz # 下载 nginscript 模块并解压
curl -O http://hg.nginx.org/njs/archive/tip.tar.gz
tar -xzvf tip.tar.gz # 编译并安装 nginx
$ cd nginx-1.9.5
$ ./configure --add-module=刚才解压的nginscript目录
$ make
$ make install

在 nignx.conf 中使用 nginscript

定义变量

使用 js_set 指令可以通过 javascript 代码来定义一个变量:

js_set $msg "
var m = 'Hello ';
m += 'world!';
m;
";

这些变量可以被其他的 nginx 指令使用:

location /hello {
add_header Content-Type text/plain;
return 200 $msg;
}

执行 javascript 代码片段

使用 js_run 指令可以执行指定的 javacript 代码:

location /hello {
js_run "
var res;
res = $r.response; res.contentType = 'text/plain';
res.status = 200;
res.sendHeader(); res.send( 'Hello, world!' );
res.finish();
";
}

大专栏  使用 javascript 配置 nginx"请求对象">请求对象

在 javascript 代码中可以通过 $r 变量来获取到请求对象,请求方相关信息都会保存在这个变量上:

js_set $summary "
var a, s, h; s = 'Request summarynn'; 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;
";

response 响应对象

在 javascript 代码中可以通过 $r.response 来获取到响应对象,用于设置响应内容:

js_run "
var res = $r.response; res.contentType = 'text/plain';
res.status = 200;
res.sendHeader(); res.send( 'Hello, world!' );
res.finish();
";

nginscript 与 javascript 的区别

nginscript 不是完整的 javascript,它只是是实现了一个 ECMAScript 的一个子集, 为了追求效率, 许多 javascript 的内置对象在 nginscript 中并没有实现。我尝试使用了一下 Date、JSON 等对象,都还没有实现。

这便是几乎所有的 nginscript 知识,虽然没有实现完整的 EMCAScript 规范,但是对于配置 nginx 来说,个人感觉也够用了。

最新文章

  1. 复旦大学2014--2015学年第二学期(14级)高等代数II期末考试第八大题解答
  2. ARCGIS9.2安装说明
  3. hdu 5291 dp+优化 ****
  4. mysql学习笔记 第七天
  5. FIM 2010: Kerberos Authentication Setup
  6. sp_sys_ERPTrigger_base
  7. Git权威指南 读笔(2)
  8. Serv-u FTP服务器
  9. Domino 8.5 WebService开发一例
  10. Json数据转换
  11. S3C2440 TFTLCD驱动详解
  12. Android 一个改善的okHttp封装库
  13. 在多个Activity中回传值(startActivityForResult())
  14. 杜教筛 && bzoj3944 Sum
  15. zookeeper curator处理会话过期session expired
  16. CF 2015 ICL, Finals, Div. 1 J. Ceizenpok’s formula [Lucas定理]
  17. iOS开发--XMPPFramework--环境的配置(一)
  18. package.json字段全解
  19. 一脸懵逼学习Hadoop中的序列化机制——流量求和统计MapReduce的程序开发案例——流量求和统计排序
  20. C# 控件置于最顶层、最底层

热门文章

  1. 使用python列出目录下的所有文件
  2. F - Fraction Formula Gym - 102307F
  3. 【线段树】Interval GCD
  4. 大厂面试题:今天复试百度PHP工程师
  5. Spring 的 IOC 和 AOP 的理解
  6. 三十五、lamp经典组合搭建
  7. 02-信贷路由项目rose框架拆分dubbo
  8. Windows可以往外ping,外部却ping不通本机
  9. KUKA机器人常见十大问题及解决方法
  10. java第二节课 java语法基础动手动脑