【网络架构】介绍NGINX单位
此博客文章是来自nginx.conf 2017的NGINX团队成员的六个主题演讲之一。这些博客文章共同介绍了NGINX应用程序平台,新产品以及产品和战略更新。
博客文章是:
- Keynote: “Speeding Innovation”, Gus Robertson (video here)
- NGINX Product Roadmap, Owen Garrett (video here)
- Introducing NGINX Controller, Chris Stetson and Rachael Passov (video here)
- This post: Introducing NGINX Unit, Igor Sysoev and Nick Shadrin (video here, in‑depth demo here, integration with the OpenShift Service Catalog here)
- The Future of Open Source at NGINX, Ed Robinson and Owen Garrett (video here)
- NGINX Amplify is Generally Available, Owen Garrett (video here)
Nick Shadrin:现代应用已发生变化。 他们从非常小的网站,从设计为一件事的简单应用程序,到非常大而复杂的网络属性,发展壮大。 今天,它们由多个部分组成:您创建小型服务,然后将它们连接在一起。 随着基础架构的新变化,您还可以轻松地上下扩展。 您可以创建新容器 - 云中的新计算机 - 以及与应用程序的连接。 应用程序部件之间的连接非常重要。
作者:Matt Britt [CC BY 2.5]来自Wikimedia Commons
使用NGINX,您已经知道如何连接到您的应用程序。 您知道应用程序的工作原理以及与其连接的工作方式。 但是通过Unit项目,我们进一步深入到应用程序代码。 它为您提供了运行应用程序和运行应用程序代码的平台。
我们研究了现有的解决方案,发现它们缺乏一些基础技术。 其中许多都很大,很慢,并且不适合云原生应用程序。
NGINX Unit从头开始构建。 它是由核心工程团队使用NGINX工程的核心原则构建的。 Unit是NGINX应用平台的重要组成部分。 对于单片应用程序和微服务应用程序,它的工作方式相同。 它为您提供了从旧式应用程序迁移和分离服务的方法。 它为您提供了一种统一的方式,不仅可以连接到您当前正在构建的应用程序,还可以连接到明天将要构建的应用程序。
我们来谈谈NGINX Unit为您提供的功能。
首先,它是一个专为云原生应用程序设计的全动态应用程序服务器。
“动态”是什么意思?使用NGINX,您熟悉众所周知的重载命令。你可能已经经常重装了。
当重新加载完成后,你就不会失去联系。你很好 - 应用程序正在运行。您可以通过重新加载整个服务器继续进行更改。但是,重新加载有时会对服务器资源造成负担,而且我们的许多大用户和客户都无法像他们希望的那样频繁地重新加载。
使用Unit,系统不会重新加载进程,它只会更改其内存的一部分以及特定更改所需的进程部分。它给你的是能够随时随地进行更改。
接下来是它是如何配置的。它是通过一个简单的API配置的。
今天,每个人都喜欢进行API调用以配置服务器。每个管理系统都了解这一点,我们构建了一个非常易于理解的API,它基于行业标准的JSON。
非常重要的是这个API可以远程使用。当您无法以远程方式配置服务器时,您在做什么?您正在构建一个小代理 - 一种各种类型的代理 - 以执行这些配置步骤。
使用Unit,您可以将API公开给您的专用网络和远程代理,以便以非常简单,本机和远程方式进行配置。
接下来,Unit是多语言。
它了解多种语言。我们支持PHP,Python和Go,其他语言即将推出。这给你的是能够在同一台服务器上同时运行用这些语言编写的任何代码。但更有趣的是,您可以在同一台服务器上运行同一语言的多个版本。
您是否曾将旧的PHP应用程序从PHP 5迁移到PHP 7?现在,它就像一个API调用一样简单。您是否曾尝试在Python 2.7和Python 3.3中运行相同的应用程序?我看到有些人在观众中大笑。是的,有时甚至不起作用。现在,我们为您提供了相同的平台,可以使用该应用程序理解的语言和语言版本来运行应用程序。有趣的是,这是如何实现的。
我会请NGINX的原作者Igor Sysoev到舞台上讨论NGINX Unit的架构。 Igor具有惊人的品质:Igor以一种基本的方式构建应用程序。他在更深层次上看待问题。当他在研究如何构建应用程序时,他没有任何先入为主或妥协。
伊戈尔,请上台。我们来谈谈NGINX Unit的架构。
Igor Sysoev:早上好。我的名字是Igor Sysoev。我是NGINX的原作者,NGINX公司的联合创始人,以及我们新项目Unit的架构师。
这是Unit的架构方案:所有部件都是一个系统中的独立过程。 出于安全原因,这些过程是隔离的; 只有主进程以root身份运行。 其他进程可以作为非特权用户运行。
这个架构非常复杂,所以我将详细介绍最重要的部分。
Unit的关键特性是动态配置。 性能与现有应用程序服务器相当。
“动态配置”是什么意思? 这意味着根本没有实际的配置文件。 您使用UNIX域套接字或TCP套接字上的RESTful JSON API与Controller进程进行交互。 您可以一次上传整个配置,也可以只上传一部分。
您可以更改或删除配置的任何部分,Unit不会重新加载整个配置 - 只重新加载相关部分。 这意味着您可以根据需要随时更改配置。 当Controller进程接受更改配置的请求时,它将更新[full stored]配置并将相应的部分发送到路由器和主进程。
路由器进程有几个与客户端交互的工作线程。它们接受客户端的请求,将请求传递给应用程序进程,从应用程序获取响应,并将响应发送回客户端。每个工作线程都会轮询epoll或kqueue,并且可以异步处理数千个同时连接。
当Controller向路由器发送新配置时,路由器的工作线程开始使用新配置处理新的传入连接,而现有(旧)连接继续由工作线程根据先前的配置进行处理。
因此路由器工作线程可以与几代配置同时工作而无需重新加载。
当路由器收到尚未启动的应用程序的请求时,它会要求主进程启动该应用程序。目前,应用程序进程仅在需要时启动。稍后,我们将添加prefork功能。
因此,主进程分叉新进程,在新进程中动态加载所需的应用程序模块,设置适当的凭据,然后在新进程中运行应用程序代码。
模块系统允许您在一台服务器中运行不同类型的应用程序,甚至在一台服务器中运行不同版本的PHP或Python。
Go应用程序是不同的动物。典型的Go应用程序自己侦听HTTP端口。您必须在应用程序中构建所有内容,包括所有网络和管理功能。使用Unit,您可以在没有此附加代码的情况下控制应用程序。
对于PHP或Python应用程序,您根本不需要更改代码[使用Unit运行它]。对于Go应用程序,您进行了一些微小的更改:您必须为Unit导入Go包,在Go应用程序的源代码中仅更改两行(调用Unit包而不是标准HTTP包),并构建Go应用程序包。
当主进程需要运行Go应用程序时,它会分叉一个新进程并在新进程中执行静态构建的Go应用程序。
Unit包与标准Go HTTP包兼容,因此您的应用程序仍可作为独立的HTTP服务器运行,或作为Unit服务器的一部分运行。当它独立运行时,它会侦听HTTP端口并像往常一样处理HTTP请求。
当Go运行Go应用程序时,它不会侦听HTTP端口。相反,它与Unit路由器进程通信,该进程处理所有HTTP请求并在内部与Go应用程序通信。
路由器和应用程序进程通过Unix套接字对和几个共享内存段进行通信。 套接字对和共享内存段对于每个应用程序进程都是私有的,因此如果应用程序进程异常退出,路由器进程将正常处理此故障,并且不会影响其他进程和连接。
当Go应用程序由Unit运行时,它将与路由器进程通信。 路由器进程将处理所有HTTP请求,并在内部与应用程序的线程套接字对和共享段内存进行通信。
现在,Nick Shadrin将告诉您有关Unit API配置和未来路线图的更多信息。
尼克沙德林:谢谢,伊戈尔。
我是否告诉您使用NGINX Unit API很容易? 嗯,是的,确实如此。
在这里,您可以看到Unit API的一个简单示例。我想谈谈它是如何配置的,以及如何使用此API对环境进行更改。
您可以定义的第一个对象是[在配置的应用程序部分中]的应用程序对象。您可以为其提供一个友好,用户友好的名称,并将应用程序的类型定义为语言和语言版本。然后,您可以根据应用程序类型为应用程序定义其他参数。 PHP应用程序有一些特定的参数。 Go应用程序将具有一些其他参数。
您还可以使用UNIX系统中组名称的不同用户名定义应用程序,以便在您的环境中出于安全原因将它们分开。
除了定义应用程序之外,您还将定义侦听器,侦听器将是应用程序的IP地址和/或端口。
然后指定特定侦听器如何绑定到您定义的应用程序。您可以创建许多侦听器和许多应用程序,并以您喜欢的方式将它们绑定在一起。
现在,你如何做出改变?第一种也是最简单的方法是重新加载服务器。你可能不想这样做。您可以将整个JSON有效负载作为PUT请求发送到NGINX Unit控件套接字,或者您可以逐个进行更改,通过自己的URL分别访问每个对象和每个字符串。我们为您提供灵活的变更方式。
这就是你现在拥有的。我们来谈谈这个项目的计划。
昨天,我们在开源中发布了NGINX Unit。它可以在公共测试版中使用。我们鼓励每个人尝试并使用它。
我们现在的首要任务是为您提供稳定版本和稳定代码的记录,我们希望您对NGINX装置的信心与NGINX一样。
我们将向Unit添加一长串新语言,但我们将要开发的第一批语言是Java和Node.js.一旦我们从社区获得更多语言和更多不同语言的贡献,您将看到扩展NGINX单元以支持您喜欢的应用程序语言非常容易。
接下来,我们将围绕HTTP / 2和更多HTTP功能添加功能。对于服务网格和服务到服务通信,我们将直接向NGINX单元添加代理和网络功能。
昨天,我们将代码上传到GitHub并公开发布给所有人。我们已经在社交媒体上看到了数百条评论。我们是这个项目的黑客新闻的头条新闻。
我们有数百颗星。我们已经在GitHub仓库中创建了拉取请求和问题。社区的反应非常热烈,自项目发布以来只有24小时。
我们鼓励您前往GitHub开始浏览代码,阅读并为其做出贡献。 我们将与您一起制作此软件,NGINX Unit核心工程团队将与您一起处理拉取请求和GitHub问题。
现在,让我们看看我们准备了哪些其他资源,以便您可以开始使用NGINX Unit。
我们在unit.nginx.org上传了文档,代码也可以在我们的标准Mercurial存储库和GitHub存储库中找到。您可以使用众所周知的处理NGINX项目的过程或使用GitHub过程来为代码做出贡献。
今天,在休息之后,我们将在这个会议室的NGINX部门进行深度探讨。在深度潜水课程中,我们不会有任何幻灯片。当我们处理项目的现场演示时,我们发现为了向您展示所有功能以及如何使用它,演示实际上将采用整个会话。
准备好看到很多命令行输出和许多在同一服务器上运行多个PHP,Python和Go应用程序的新方法。如果您想在邮件列表中与我们合作,请发送电子邮件至unit@nginx.org。它已经可用,您可以通过网络订阅,也可以发送电子邮件至unit-subscribe@nginx.org。
对于我们的NGINX Plus商业用户来说更令人惊奇的是,他们已经在NGINX的NGINX技术表上拥有了这个惊人的通信渠道。如果您对NGINX Unit有疑问,可以使用您已知的相同支持渠道询问他们。
这就是我今天对你有关NGINX Unit的看法。让我们一起构建软件,让我们看看它是如何工作的,让我们看看如何使用Unit运行新的应用程序。谢谢。
原文:https://www.nginx.com/blog/introducing-nginx-unit/
本文:http://pub.intelligentx.net/introducing-nginx-unit
讨论:请加入知识星球或者小红圈【首席架构师圈】
- 40 次浏览