云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

亚马逊云_广州建设网站_安全稳定

小七 141 0

用Lua将Nginx推向极限

使用Lua将Nginx推到极限

在CloudFlare,Nginx是我们工作的核心。它是我们反向代理服务的基础。除了内置的Nginx功能之外,我们还使用了一系列定制的C模块,这些模块是我们的基础设施特有的,包括负载平衡、监视和缓存。最近,我们增加了更简单的服务。它们几乎都是用Lua写成的。我想分享更多关于我们如何使用Lua来增强Nginx的新功能,并提供一些示例,以便您也能这样做。什么是Lua?Lua是一种脚本语言。具体来说,它是一种功能齐全的多范式语言,语法和语义与JavaScript或Scheme类似。Lua还有一个有趣的故事,因为它是一个新兴国家中唯一一种具有全球影响力的语言。LUA总是意味着嵌入更大的系统,用其他语言编写(如C和C++),并且在保持极少且易于集成的情况下蓬勃发展。因此,Lua在视频中很受欢迎游戏、面向安全的软件等等最近,维基百科。Lungia+Lungia的好处Nginx+Lua是一个独立的web服务器,嵌入了脚本语言Lua。强大的应用程序可以直接在Nginx中编写,而不需要使用cgi、fastcgi或uwsgi。通过在现有的Nginx配置文件中添加一些Lua代码,可以很容易地添加一些小特性。为了让您自己看看,在本文的末尾,我包含了一些可以添加到任何现有配置中的日志代码。Nginx+Lua的一个核心优点是它是完全异步的。Nginx+Lua继承了使Nginx成为web服务器流行选择的相同事件循环模型。"异步"只是指Nginx可以在等待阻塞操作(例如传出连接或读取文件)时中断您的代码,并运行另一个传入HTTP请求的代码。所有Lua代码都是按顺序编写的。异步逻辑对Nginx+Lua程序员是隐藏的。如果您熟悉其他事件驱动的web服务器,这意味着没有回调。此外,Nginx+Lua非常快,利用了LuaJIT解释器。安装Nginx+Lua您可以通过使用现有nginx编译lua nginx模块从源代码处安装它。如果您选择了这条路径,那么您还需要一个Lua解释器。建议使用LuaJIT-2.0.0。或者,您可以使用测试过的ngx_openresty捆绑包。ngx_openresty自带Nginx、第三方模块、Lua库和其他好东西。如果你已经在不使用第三方模块的情况下使用Nginx,例如,在Linux发行版中,您可以安全地用ngx_openresty替换它。(向我的CloudFlare同事张一春(Yichun Zhang)大声喊道,他写了ngx_openresty。谢谢,伊春!)局限性Nginx以及Nginx+Lua真正快速的原因是Nginx所依赖的异步模型和事件循环。为了保持这种模式,Nginx之外的传出通信必须小心处理。不建议您使用经典的LuaSocket,而是建议您依赖于内置的ngx_lua插座。然而,由于有大量的openresty库可以"讲"SQL、memcached和Redis,而且DNS是建立在ngx_lua套接字之上的,所以在实践中这并不是一个真正的问题。一个可以尝试的例子:Nginx日志聚合下面是一个如何为Nginx构建和运行一个简单的日志聚合器的示例。您可以将其添加到任何现有配置中。这是将聚合的日志导入时间序列系统后的输出:

使用Lua将Nginx推到极限

此特定的示例图显示了CloudFlare基础结构的某些节点上每秒的平均请求数。把代码给我看看!假设您在Nginx中已经有了一个正常工作的webapp,或者您使用proxy_pass指令来上游到Apache服务器。首先,在Nginx conf中添加一些行来查看.lua文件,并在Nginx工作线程之间使用1MB的共享内存空间。($prefix是相对于Nginx安装的)。http协议{#Lua配置lua_package_path"$prefix/?。卢阿;;";lua峎分享峎dict log_dict 1M;查看原始吉斯特文件1.sh托管❤ 通过GitHub接下来,添加一个小Lua片段来计算每个请求的请求时间,并使用可用的日志库将其聚合到共享内存中。这是我构建的一个简单的日志库。这个代码片段可以直接在Nginx conf中使用,使用logbylua指令。显示/收集聚合日志完成示例的最后一步是创建一个收集和/或显示日志的系统。在完整的示例中,我们将聚合设置为监听不同端口的独立服务器。现在您应该在您的环境中运行Nginx+Lua修改。使用Lua而不是定制的C模块这个例子展示了Lua是如何在CloudFlare上进入我们的系统的,但是我们很快意识到它不仅仅局限于聚合和打印日志。使用Nginx为处理HTTP请求而设置的相同阶段,可以向Nginx添加有趣的新功能,几乎与定制C模块一样多的控制,同时也很愉快,易于编写。例如,访问阶段可以看作是一个编程的.htaccess,甚至更多。而内容阶段则是web应用程序的发展阶段。NGIXX+LUA已经成为我在CuldFLARE工作的基础。作为一个长期的C开发人员,我经常被Lua的强大和极强的表现力所打动,同时也很简单和平易近人。有时候,简单就是美丽。PS-我们正在招聘对极限规模工作感兴趣的Lua程序员。如果你感兴趣,请查看我们职业页面上的系统工程师列表。