Nginx 的 Javascript 扩展

去年 Nginx 发布了 nginScript,一个基于 Nginx 的 JavaScript 执行环境 可以通过 nginScript 扩展自己的 Nginx 服务器的能力 Nginx 非常强大,通过各种指令可以定义出复杂的配置,但有时可能无法很好的满足我们的需求,毕竟 Nginx 团队和第三方社区开发的模块是有限的 可以自己开发 C 模块,但有一定门槛,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

原文发布于微信公众号 - 性能与架构(yogoup)

原文发表时间:2016-09-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏安恒网络空间安全讲武堂

Python编写渗透工具学习笔记一 | 0x01 目录扫描程序

0x01web目录扫描程序 脚本利用演示 直接输入python DirScan.py会打印出使用说明信息 ? 然后扫描一下 ? 可以看到扫描出了我的服务器的这些...

4677
来自专栏王磊的博客

WebStorm文件类型关联设置

无意中创造了一个没有扩展名的文件,我选择了错误的文件类型关联。是js类型的,我却选成了文本,Ws每次编辑类型就成了txt文本,这个问题让我很苦恼,以下是我的解决...

3776
来自专栏Java成神之路

Tomcat_异常_02_IOException while loading persisted sessions: java.io.EOFException

     EOFException表示输入过程中意外地到达文件尾或流尾的信号,导致从session中获取数据失败。

851
来自专栏企鹅号快讯

使用postman快速建立MOCK使用篇

首先介绍一下Mock,借用一下百度百科解释:mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法, 其...

9835
来自专栏极客猴

pustil - 获取系统信息库

运维工程师经常使用 Python 编写脚本程序来做监控系统运行的状态。如果自己手动使用 Python 的标准库执行系统命令来获取信息,会显得非常麻烦。既要兼容不...

1471
来自专栏EAWorld

十六个有用的Linux命令行技巧

作者 likegeeks 译者 张斌 我们每天都会使用Linux命令行,但由于实践不多,我们可能会忘记一些Linux命令行技巧。在本文中,我将向你展示一些你可能...

3494
来自专栏前端正义联盟

gitflow 开发流程学习(第二部分)

1686
来自专栏GopherCoder

『Ansible 上手指南:2』

2154
来自专栏前端杂货铺

node模块加载层级优化

模块加载痛点 大家也或多或少的了解node模块的加载机制,最为粗浅的表述就是依次从当前目录向上级查询node_modules目录,若发现依赖则加载。但是随着应用...

3758
来自专栏Golang语言社区

如何优化服务器的性能

一、通常服务器的性能会卡在三个地方: cpu 网络IO 磁盘IO 二、在优化性能的时候,首先要判断性能的瓶颈在上述的哪个地方。然后对症下药,按照下面的方法来优化...

4359

扫码关注云+社区

领取腾讯云代金券