背景
2015年9月,nginx宣布支持类似JavaScript的语言。这意味着开发人员可以更容易、更自由地控制世界上最好的HTTP和反向代理服务器,从中可以衍生出更多有用、有趣的想法。Nginx也在朝着动态配置的下一阶段发展。可以点击链接查看官方介绍。
先简单说一下nginx。
NGX [Engine X]是世界上最受欢迎、最好的web服务器和反向代理服务器。根据第三方公司的统计,目前全球至少有23%的服务器采用了nginx,虽然这个数字还在不断扩大。目前也是中国BAT的首选,所以这也是我们第一次关注它的原因。
Nginx主要可以做到以下几点:
1.工作在TCP第7层,可以分析和处理HTTP协议的所有内容。2.支持lua、perl和JavaScript动态语言3。支持第三方插件。
告诉我更多关于工程脚本的信息。
1.nginScript是JavaScript/ECMAscript的一个子集。它实现了大多数JavaScript语言的能力,不完全符合ECMAScript标准,摒弃了JavaScript的难点。
2.nginScript不是由V8引擎实现的。而是通过更小、能耗更低、更适合nginx应用场景的小虚拟机(VM)来实现。可以理解,nginx已经为其实现了一套词法解析。
3.nginScript在nginx的配置文件中运行。例如,在nginx.conf文件中。因此,nginScript可以完成传统配置文件可以处理的所有事情,同时还可以使配置管理动态化。这也是nginScript出现的最重要原因。
4.nginScript作为nginx插件存在。插件的名称是njs。像其他nginx插件一样,我们需要重新编译nginx来完成安装。
5.nginScript处于研发初期。您可以通过[emailprotected]与nginx团队沟通,提出您的需求。
如何安装nginScript?
只需遵循这里的官方步骤:
//1.下载最新的nginx软件包。地址:wget http://nginx.org/download/nginx-1.9.4.tar.gz, http://nginx.org/en/download.html//2,解压tar-xzvf nginx-1.9.4.tar.gz//3,通过mercurial获取nginScript模块。如果这里没有安装mercurial,您需要首先运行yum install mercurial hgclone http://hg.nginx.org/njs。
//4.编译nginx。此处仅指定了njs模块。记得将其他需要的模块安装在一起。如果你没有编译过nginx,有些依赖模块需要yum安装,请自行搜索。Cd nginx-1.9.4。/configure-add-module=./njs/nginx-prefix=/usr/local make install ok,这就是安装,我们可以开始玩了。
如何具体使用nginScript?
nginScript的使用主要是给nginx的配置系统增加两条指令。具体说明如下:
Js_set,在配置中设置变量值。
Js_run,直接执行配置规则。
1.首先看看js_set在nginx.conf中是如何运行的.
http { js_set $msg' var str='hello,im web ';//JavaScript字符串;';服务器{.location/{ return 200 $ msg;}}}结果:
在上面的例子中,我们可以看到我们可以通过JS随意设置nginx的变量值。而且这些变量在nginx配置中随处可用。示例:proxy _ pass、limit _ req _ zone和sub _ filter。与之前的配置相比,这里的灵活性有了很大的提升。
2.js_run的运行规则和场景。
Js_run在location指令中运行,当指定位置的路径匹配时会执行相应的JavaScript。JS _ RUN通过JavaScript直接生成HTTP返回的内容。下面是一个具体的例子:
location/imweb team { js _ run ' var RES;res=$ r.responseres.status=200res.send('你好,imweb!');RES . finish();”;}这个结果和第一个一样。我在这里不再重复。
3.除了这两个指令,还有一个重要的变量$ r。
通过js_set和js_run,可以对HTTP请求有完全的控制,控制方式是变量$r的使用,通过下面简单的例子可以在$ r中看到什么。
http { js_set $summary ' var a,s,h;s='JS摘要 n n ';s=' Method: ' $ r.method ' ns='HTTP版本$ r.httpVersion ' ns=' Host : ' $ r . headers . host ' n ';s='远程地址: ' $ r . Remote address ' n ';s=' URI: ' $ r.uri ' ns=' Headers: nfor(h in $ r . headers){ s=' header ' ' h ' '为 ' ' $ r . headers[h]' ' n ';} s=' Args: nfor (a in $r.args) { s=' arg '' a ' '为 ' ' $ r . args[a]' ' n ';} s;';服务器{ listen 8000location /imwebteam{ return 200美元摘要;}}结果如图所示:
目前工程脚本存在的问题。
经过以上介绍,相信大家对nginScript已经有了基本的了解。让我们看看这个新生儿有什么问题。
第一,调试方法薄弱。目前还比较原始,以日志的形式显示,错误日志的详细程度不尽如人意。第二,控制力弱。目前nginScript的处理强度仅局限于http请求的处理和响应的返回,无法动态处理nginx请求以外的一些内容,如动态用户数据或动态更新转发配置表。最后,整体实现较弱。整个结构还是比较简单的,js_run和js_set的运行环境不太一致,在js_set执行ok的代码段中js_run会出现一些异常。总的来说,nginScript还是一个有着美好愿望和前景的新生儿。打磨优化需要时间。也希望大家能提供更多的意见和反馈,甚至提交自己的插件。这样它才能长得更好。
为了我们的练习场景。
之前和李晓腾君、donald讨论过的两个主要场景是realLog系统和nohost2.0系统。NginScript在这里对于两种场景来说无疑都是好消息,在现有的系统下规则响应有灵活的处理方式。但是在用户配置的动态加载方面,我们还需要通过其他方式来实现。在这一部分中,我们首先向nginx开发团队提到这个问题,然后在看了具体情况后再和大家进一步讨论和同步。
以上内容都是关于nginScript的,nginx刚刚发布的JavaScript功能。希望对大家有用。