• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

njs: nginScript njs nJScript fork

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称:

njs

开源软件地址:

https://gitee.com/ngwsx2008/njs

开源软件介绍:

Configure nginx with HTTP and Stream JavaScript modules using the --add-module
option:

    ./configure --add-module=<path-to-njs>/nginx

Alternatively, you can build a dynamic version of the modules

    ./configure --add-dynamic-module=<path-to-njs>/nginx

and add the following lines to nginx.conf to load them

    load_module modules/ngx_http_js_module.so;
    load_module modules/ngx_stream_js_module.so;

Please report your experiences to the NGINX development mailing list
[email protected] (http://mailman.nginx.org/mailman/listinfo/nginx-devel).


HTTP JavaScript module
----------------------

Each HTTP JavaScript handler receives two arguments - request and response.

    function foo(req, res) {
        ..
    }

The following properties are available:

req
    - uri
    - method
    - httpVersion
    - remoteAddress
    - headers{}
    - args{}
    - variables{}
    - log()

res
    - status
    - headers{}
    - contentType
    - contentLength
    - sendHeader()
    - send()
    - finish()


Example nginx.conf:

    # load dynamic HTTP JavaScript module
    load_module modules/ngx_http_js_module.so;

    worker_processes 1;
    pid logs/nginx.pid;

    events {
        worker_connections  256;
    }

    http {
        # include JavaScript file
        js_include http.js;

        server {
            listen 8000;

            location / {
                # create $foo variable and set JavaScript function foo()
                # from the included JavaScript file as its handler
                js_set $foo foo;

                add_header X-Foo $foo;

                # register JavaScript function bar() as content handler
                js_content baz;
            }

            location /summary {
                js_set $summary summary;

                return 200 $summary;
            }
        }
    }


http.js:

    function foo(req, res) {
        req.log("hello from foo() handler");
        return "foo";
    }

    function summary(req, res) {
        var a, s, h;

        s = "JS summary\n\n";

        s += "Method: " + req.method + "\n";
        s += "HTTP version: " + req.httpVersion + "\n";
        s += "Host: " + req.headers.host + "\n";
        s += "Remote Address: " + req.remoteAddress + "\n";
        s += "URI: " + req.uri + "\n";

        s += "Headers:\n";
        for (h in req.headers) {
            s += "  header '" + h + "' is '" + req.headers[h] + "'\n";
        }

        s += "Args:\n";
        for (a in req.args) {
            s += "  arg '" + a + "' is '" + req.args[a] + "'\n";
        }

        return s;
    }

    function baz(req, res) {
        res.headers.foo = 1234;
        res.status = 200;
        res.contentType = "text/plain; charset=utf-8";
        res.contentLength = 15;
        res.sendHeader();
        res.send("nginx");
        res.send("java");
        res.send("script");

        res.finish();
    }


Stream JavaScript module
------------------------

Each Stream JavaScript handler receives one argument - stream session object.

    function foo(s) {
        ..
    }

The following properties are available in the session object:

     - remoteAddress
     - eof
     - fromUpstream
     - buffer
     - variables{}
     - log()
     - OK
     - DECLINED
     - AGAIN
     - ERROR
     - ABORT


Example nginx.conf:

    # load dynamic Stream JavaScript module
    load_module modules/ngx_stream_js_module.so;

    worker_processes 1;
    pid logs/nginx.pid;

    events {
        worker_connections  256;
    }

    stream {
        # include JavaScript file
        js_include stream.js;

        server {
            listen 8000;

            # preread data with qux()
            js_preread qux;

            # create $foo and $bar variables and set JavaScript
            # functions foo() and bar() from the included JavaScript
            # file as their handlers
            js_set $foo foo;
            js_set $bar bar;

            # echo-server: return preread data
            return foo;
        }

        server {
            listen 8001;

            # check access in xyz()
            js_access xyz;

            proxy_pass 127.0.0.1:9000;

            # add JavaScript filter baz() from the included
            # JavaScript file
            js_filter baz;
        }
    }

    http {
        server {
            listen 9000;
            location / {
                return 200 $http_foo\n;
            }
        }
    }


stream.js:

    var req = '';
    var matched = 0;
    var line = '';

    function qux(s) {
        n = s.buffer.indexOf('\n');
        if (n == -1) {
            return s.AGAIN;
        }

        line = s.buffer.substr(0, n);
    }

    function foo(s) {
        return line;
    }

    function bar(s) {
        var v = s.variables;
        s.log("hello from bar() handler!");
        return "foo-var" + v.remote_port + "; pid=" + v.pid;
    }

    // The filter processes one buffer per call.
    // The buffer is available in s.buffer both for
    // reading and writing.  Called for both directions.

    function baz(s) {
        if (s.fromUpstream || matched) {
            return;
        }

        // Disable certain addresses.

        if (s.remoteAddress.match('^192.*')) {
            return s.ERROR;
        }

        // Read HTTP request line.
        // Collect bytes in 'req' until request
        // line is read.  Clear current buffer to
        // disable output.

        req = req + s.buffer;
        s.buffer = '';

        n = req.search('\n');

        if (n != -1) {
            // Inject a new HTTP header.
            var rest = req.substr(n + 1);
            req = req.substr(0, n + 1);

            addr = s.remoteAddress;

            s.log('req:' + req);
            s.log('rest:' + rest);

            // Output the result and skip further
            // processing.

            s.buffer = req + 'Foo: addr_' + addr + '\r\n' + rest;
            matched = 1;
        }
    }

    function xyz(s) {
        if (s.remoteAddress.match('^192.*')) {
            return s.ABORT;
        }
    }

--
NGINX, Inc., http://nginx.com

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap