社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  NGINX

《开源软件架构》--nginx基本介绍(一)

并发编程网 • 5 年前 • 149 次点击  

nginx基本介绍

nginx(发音为“engine x”)是由俄罗斯软件工程师Igor Sysoev编写的免费开源Web服务器。

自2004年公开发布以来,nginx一直专注于高性能,高并发性和低内存消耗。Web服务器功能之上的其他功能,如负载均衡,缓存,访问和带宽控制,以及与各种应用程序高效集成的能力,有助于使nginx成为现代网站架构的不错选择。目前,nginx是互联网上第二大最受欢迎的开源Web服务器。

  •  为什么高并发性很重要?

如今,互联网如此广泛和无处不在,我们很难想象它十年前还并不存在 。从简单的HTML生成可点击文本,基于NCSA,然后是Apache Web服务器,到全球超过20亿用户使用的永远在线的通信媒体,它已经有了很大的发展。随着永久连接的个人电脑,移动设备和最近的平板电脑的普及,互联网格局正在迅速变化,整个经济已经实现数字化连接。在线服务变得更加精致,明显偏向即时的实时信息和娱乐。运行在线业务的安全方面也发生了重大变化。因此,网站现在比以前复杂得多,通常需要更多工程师的努力使网站变得健壮和可扩展。

对于一个网站架构师来说,最大的挑战之一就是并发。自web服务出现以来,并发等级一直在不断提高。一个受欢迎的网站同时为数十万甚至数百万的用户提供服务并不罕见。十年前,并发的主要原因是客户端速度慢——使用ADSL或拨号连接的用户。现在,并发性是由移动客户端和较新的应用程序架构的组合引起的,这些架构通常基于维护长连接来允许客户端实时接收新闻、推文、好友动态等更新。导致并发性增加的另一个重要因素是现代浏览器行为的改变,这些浏览器同时打开4到6个到网站的连接,以提高页面加载速度。

为了说明慢客户端的问题,设想一个简单的基于Apache的web服务器,它产生相对较短的100KB 的响应——一个带有文本或图像的web页面。生成或检索此页面只需零点几秒,但是将其传输到带宽为80kbps (10 KB/s)的客户端需要10秒。本来,web服务器提取100 KB的内容是相对快速地,然后它需要10秒钟缓慢地将这些内容发送到客户端之后才能释放连接 。现在假设你有1,000个同时连接的客户端,它们请求类似的内容。如果每个客户端只额外分配了1 MB的内存,那么就会产生1000 MB(约1 GB)的额外内存,专门用于为1000个客户端提供100 KB的内容。实际上,一个典型的基于Apache的web服务器通常为每个连接分配超过1 MB的额外内存,遗憾的是,几十kbps仍然通常是移动通信的有效速度。尽管在某种程度上,通过增加操作系统内核套接字缓冲区的大小,可以改善将内容发送到较慢的客户端的情况,但这不是问题的通用解决方案,而且可能会产生不良的副作用。

对于长连接,处理并发的问题更加明显,因为为了避免建立新的HTTP连接相关的延迟,客户端将保持连接,并且对于每个连接的客户端,web服务器将分配一定数量的内存。

因此,为了处理由于受众的增长带来的增加的工作负载以及因此导致的更高的并发等级(并且能够持续地处理),网站应该基于许多非常有效的构建模块。虽然等式的其他部分,如硬件(CPU、内存、磁盘)、网络容量、应用程序和数据存储体系结构也很重要,但客户端连接是在web服务器软件中接收和处理的。因此,web服务器应该能够随着每秒同步连接和请求数量的增加情况来扩展,而非线性地扩展。

  • Apache不合适吗?

Apache,这种web服务器软件在20世纪90年代初就有了自己的根基,直到今天仍然在很大程度上主宰着互联网。最初,它的架构与当时已有的操作系统,硬件相匹配,同时也与互联网当时发展的情况相匹配,当时的网站通常是运行单个Apache实例的独立物理服务器。到2000年代初,很明显,独立的web服务器模型不能通过简单的复制来满足不断增长的web服务的需求。尽管Apache为未来的开发提供了坚实的基础,但它的架构是为每个新连接生成自身的副本,这并不适合网站的非线性可伸缩性。最终,Apache成为了一个通用的web服务器,它专注于拥有许多不同的特性、各种第三方扩展以及普遍适用于几乎任何web应用程序开发。然而,任何东西都是有代价的,在单个软件中拥有如此丰富和通用的组合工具的缺点是可伸缩性较差,因为每个连接的CPU和内存使用量都在增加。

因此,当服务器硬件、操作系统和网络资源不再是网站增长的主要制约因素时,全世界的web开发人员开始寻找一种更有效的运行web服务器的方法。大约十年前,著名软件工程师 Daniel Kegel 宣称,“是时候让web服务器同时处理1万个客户端了”,并预言了我们现在所说的互联网云服务。 Kegel 的 C10K 清单激发了许多解决web服务器优化问题的尝试,以同时处理大量客户端,nginx是其中最成功的一个。

为了解决10,000个并发连接的C10K问题,nginx采用了一种不同的体系结构——这种体系结构更适合于同时连接数和每秒请求数量的非线性扩展。nginx是基于事件的,所以它不遵循Apache为每个web页面请求生成新进程或线程的风格。最终结果是,即使负载增加,内存和CPU使用仍然是可控的。nginx现在可以在使用典型硬件的服务器上处理数万个并发连接。

当nginx的第一个版本发布时,它打算与Apache一起部署,这样nginx就可以处理HTML、CSS、JavaScript和图像等静态内容,从而从基于Apache的应用服务器上卸载并发和延迟处理。在其开发过程中,nginx通过使用FastCGI、uswgi或SCGI协议以及分布式内存对象缓存系统( 如memcached ),增加了与应用程序的集成。还添加了其他有用的功能,如具有负载均衡和缓存的反向代理。这些额外的特性使nginx成为构建可伸缩web基础设施的有效组合工具。

2012年2月,Apache 2.4.x 分支公开发布。尽管Apache的最新版本添加了新的多处理核心模块和新的代理模块,旨在增强扩展性性和性能,但是现在就判断其性能、并发性和资源利用率是否与纯事件驱动的web服务器持平或更好还为时过早。不过,如果Apache应用服务器能在新版本中更好地扩展,那就太好了,因为它可能会缓解后端瓶颈,这在典型的nginx + Apache web配置中通常仍然没有得到解决。

  • 使用nginx还有哪些优势?

以高性能和高效率处理高并发一直是部署nginx的主要优点。然而,还有更多有趣的好处。

在过去的几年中,web架构师已经接受了将应用程序基础架构与web服务器分离的思想。然而,以前存在的基于 LAMP (Linux、Apache、MySQL、 PHP、Python或Perl ) 的网站形式,现在可能变成不仅仅是基于 LEMP (“E”代表“ Engine x ”)的形式,而是越来越多的将web服务器推向基础设施的边缘,并以不同的方式围绕它集成相同或经过改进的应用程序和数据库工具集。

nginx是非常适合,因为它提供了所需的关键功能方便地卸载并发,延迟处理,SSL(安全套接层),静态内容,压缩和缓存、连接和请求的限制,甚至HTTP流媒体从应用程序层到更有效的边缘web服务器层。它还允许直接与memcached / Redis或其他“NoSQL”解决方案集成,从而在服务大量并发用户时提高性能。

——– 随着最近开发工具包和编程语言的广泛使用,越来越多的公司正在改变他们的应用程序开发和部署习惯。nginx已经成为这些不断变化的范例中最重要的组件之一,它已经帮助许多公司在预算内快速启动和开发web服务。

随着最近开发工具包和编程语言的广泛使用,越来越多的公司正在改变他们的应用程序开发和部署的习惯。nginx已经成为这些不断变化的范例中最重要的组件之一,它已经帮助许多公司在预算内快速启动和开发web服务。

nginx的第一行代码是在2002年写的。2004年,它根据 two-clause BSD 许可协议公开发布。从那以后,nginx用户的数量一直在增长,他们贡献想法,提交bug报告、建议和观察,这些对整个社区都非常有帮助和益处。

nginx代码库是原创的,完全是用C语言从头开始编写的。nginx已经被移植到许多架构和操作系统,包括Linux、FreeBSD、Solaris、Mac OS X、AIX和Microsoft Windows。nginx有它自己的库,它的标准模块除了除了zlib、PCRE和OpenSSL 之外,只使用系统的C库,这几个模块如果不需要或者因为潜在的许可冲突,可以选择将它们在构建中排除。

简单介绍一下nginx的Windows版本。虽然nginx可以在Windows环境中工作,但nginx的Windows版本更像是一个概念验证,而不是一个功能齐全的端口。nginx和Windows内核架构有一定的局限性,它们目前还不能很好地交互。已知的Windows nginx版本的问题包括并发连接数量少得多、性能下降、没有缓存和带宽控制。未来的Windows nginx版本将更接近主流功能。

(全文完)

点击下方
阅读原文




Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30908
 
149 次点击