使用njs的Nginx变量:简单,轻松且通过JavaScript

njs是轻量级Web服务器中的JavaScript解释器,您可以使用它创建新的nginx变量并请求阶段处理程序。 njs有什么用? 什么不能? 他们为什么要这么做呢? 这些问题和其他问题将由Nginx开发人员和njs解释程序的主要开发人员Dmitry Volyntsev( xeioex )解答。



-Dmitry,为什么需要在Nginx配置中编写脚本?


-第一个原因是if指令。 初次见到她的人认为可以强制使用它们。 实际上并非如此-nginx配置是声明性的。 在下面的示例中,您可能认为响应将具有两个标头:X-First和X-Second。 但是只有第二个标头会进入答案,因为nginx是这样排列的:如果我们编写两个if指令,那么将选择最后一个。

 location /only-one-if { set $true 1; if ($true) { add_header X-First 1; } if ($true) { add_header X-Second 2; } 

第二个原因是nginx到现在为止。 以前,它用于缓存静态信息和请求以及负载平衡-一种经典的代理集。 微服务的激增侵蚀了Nginx的范围。 如果较早的配置设置以某些语言在多个后端上的一对位置结束,那么在微服务体系结构中,我们将有更多可移动的部分。 后端已变成一堆小组件。 例如,需要在每个微服务上复制授权逻辑,或者在前端将其取出。 为了实现高级授权,nginx中并不总是有足够的内置解决方案机制。

第三,在nginx中,许多指令接受动态计算的表达式,例如:

 proxy cache bypass $cookie_nocache $arg_nocache; 

您可以将变量彼此或文本字符串连接在一起。 但这还不够,我想拥有更强大的工具,例如,计算散列,使用数字数据,转换为大小写。

要扩展nginx中的所有瓶颈,您需要开发自己的语法或使用现成的东西。 我们得出的结论是,最好采用现有的脚本编程语言。 因此,开发人员无需学习新的语言,这也将节省时间并降低入门门槛。 我们选择了JavaScript。

-为什么要使用JavaScript?


-我们选择JavaScript的原因如下:

  • 现代方言,对于从其他语言切换来的开发人员来说非常有用。
  • C风格。 这很重要,因为nginx配置使用花括号,并且将来我们希望添加在配置内部直接编写JS代码的功能。 花括号将帮助我们。 例如,在Lua中,花括号的作用是由开始和结束执行的-这很不方便。
  • JavaScript模型非常适合nginx架构。

“所以卢阿也被考虑了?” 是因为开始和结束吗?


-已经有一个现成的第三方项目OpenResty。 如果您不详细介绍,则本质上是nginx + Lua,但是它的架构与nginx相反。 我们希望避免与此生态系统相交。 此外,还有其他几个原因:

  • Lua具有类似pascal的语法。
  • 数组从1开始索引。
  • Lua仍然是一种利基编程语言。

-njs与竞争对手相比如何?


-与知名引擎V8和SpiderMonkey相比,我们对njs进行了评级。 它们对nginx内部的任务无效,因为它们会被浏览器锐化并且非常重,并且nginx需要高速。 另外,这两个引擎都在迅速发展,它们的API不稳定。 最后,可以将njs更有效地集成到nginx中:


每秒创建的上下文数

-njs支持哪些标准?


-目前,几乎所有ECMAScript 5.1规范的基本元素都是通过规范6和7的一些元素实现的。也就是说,标准对象,例如Object,Array,String,Number,Date,RegExp,JSON。 完全支持闭包,匿名函数以及使用异常的功能。

我们没有将完全符合语言规范作为首要目标。 因此,目前尚不支持eval() ,到目前为止,我们不打算添加它。 但是我们计划增加对const和let关键字以及箭头功能的支持。


目前什么能够和什么不能njs

重要的是要多提一件事:缺少垃圾收集。 大多数现代语言独立地监视对象的生存期。 如果不再使用该对象,则会自动将其删除。 您不能没有这种机制,但是通常您必须为此付出一些代价-该程序的工作速度变慢甚至停止。 在njs中,只有释放请求对象后,才释放内存。

这种方法有其优点和缺点。 主要缺点是它不允许您有效地处理长查询。 因此,将来我们计划添加垃圾收集作为选项,以根据需要启用它。

-njs不是什么?


-在回答这个问题之前,我想再说一遍,njs的主要任务是扩展功能,以便灵活地配置nginx并解决代理方面的任务。

现在的问题本身。 应该事先考虑什么?
  • njs不能替代Node.js。
  • nginx + njs捆绑包不是应用程序服务器。
  • njs没有完全实现ECMAScript标准,因为不支持eval()。



如果这个主题与您息息相关,并且您想了解更多细节,我们建议您在HighLoad ++ Siberia 2018上观看Dmitry Volintsev的报告的视频录像,他从四面八方透露了这一信息。


我们还邀请所有专业人士将他们的报告提交给11月HighLoad ++ 2018会议,该会议将于11月8日和9日在斯科尔科沃举行。 如果您有独特而有趣的经历,并且愿意分享,请在9月1日之前注册并填写表格

如果您不敢公开演讲,我们有一个所谓的演讲者学校 ,我们在其中免费提供这些技能。

Source: https://habr.com/ru/post/zh-CN420465/


All Articles