掘金 后端 ( ) • 2024-05-15 21:22

Nginx 现状

nginx(发音为“engine x”)是一个免费的开源Web服务器,由俄罗斯软件工程师Igor Sysoev编写。自2004年公开发布以来,nginx一直专注于高性能,高并发性和低内存使用。

Web服务器功能之上的其他功能,如负载平衡,缓存,访问和带宽控制,以及与各种应用程序高效集成的能力,有助于使nginx成为现代网站架构的不错选择。

目前,nginx是互联网上第二大最受欢迎的开源Web服务器。

14.1。为什么高并发性很重要?

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

网站架构师面临的最大挑战之一就是并发。自Web服务开始以来,并发水平一直在不断增长。一个流行的网站服务数十万甚至数百万同时用户并不罕见。十年前,并发的主要原因是缓慢的客户端 - 具有ADSL或拨号连接的用户。如今,并发性是由移动客户端和较新的应用程序体系结构的组合引起的,这些体系结构通常基于维护持久连接,该连接允许客户端使用新闻,推文,朋友订阅源等进行更新。另一个有助于提高并发性的重要因素是现代浏览器的行为改变,它可以打开四到六个同时连接到网站的连接,以提高页面加载速度。

为了说明慢客户端的问题,想象一个简单的基于Apache的Web服务器,它产生一个相对较短的100 KB响应 - 一个带有文本或图像的网页。生成或检索此页面只需几分之一秒,但需要10秒才能将其传输到带宽为80 kbps(10 KB / s)的客户端。从本质上讲,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,这种网络服务器软件在很大程度上仍然主宰着互联网,它的根源在于20世纪90年代初。最初,它的架构与当时存在的操作系统和硬件相匹配,但也与互联网状态相匹配,其中网站通常是运行单个Apache实例的独立物理服务器。到了2000年代初,很明显,无法轻松复制独立的Web服务器模型以满足不断增长的Web服务的需求。尽管Apache为未来的开发提供了坚实的基础,但它的架构是为每个新连接生成自己的副本,这不适合网站的非线性可伸缩性。最终,Apache成为了一个通用的Web服务器,专注于拥有许多不同的功能,各种第三方扩展,以及几乎任何类型的Web应用程序开发的普遍适用性。然而,没有任何代价,在单个软件中拥有如此丰富和通用的工具组合的缺点是可扩展性较差,因为每个连接的CPU和内存使用量增加。

因此,当服务器硬件,操作系统和网络资源不再成为网站增长的主要限制时,全球的Web开发人员开始寻找更有效的运行Web服务器的方法。大约十年前,着名软件工程师Daniel Kegel宣称“现在是网络服务器同时处理一万个客户端的时候了”,并预测了我们现在称之为互联网云服务的东西。凯格尔的C10K清单激发了许多尝试来解决网络服务器优化问题,同时处理大量客户端,而nginx成为最成功的客户之一。

旨在解决10,000个同时连接的C10K问题,nginx在编写时考虑了不同的体系结构 - 一个更适合同时连接数和每秒请求数的非线性可伸缩性。 nginx是基于事件的,因此它不遵循Apache为每个网页请求生成新进程或线程的风格。最终结果是,即使负载增加,内存和CPU使用仍然可以管理。 nginx现在可以在具有典型硬件的服务器上提供数万个并发连接。

当nginx的第一个版本发布时,它意味着与Apache一起部署,使得静态内容(如HTML,CSS,JavaScript和图像)由nginx处理,以卸载基于Apache的应用程序服务器的并发和延迟处理。在开发过程中,nginx通过使用FastCGI,uswgi或SCGI协议以及分布式内存对象缓存系统(如memcached)增加了与应用程序的集成。还添加了其他有用的功能,例如具有负载平衡和缓存的反向代理。这些附加功能使nginx成为有效的工具组合,可构建可扩展的Web基础架构。

2012年2月,Apache 2.4.x分支向公众发布。虽然最新版本的Apache增加了新的多处理核心模块和新的代理模块,旨在增强可扩展性和性能,但现在判断它的性能,并发性和资源利用率是否与纯事件相当或更好还为时尚早。驱动的Web服务器。不过,看看Apache应用程序服务器在新版本中的扩展性能会更好,因为它可能会缓解后端方面的瓶颈,这在典型的nginx-plus-Apache Web配置中仍然没有得到解决。

使用nginx有更多优势吗?

以高性能和高效率处理高并发性始终是部署nginx的关键优势。但是,现在有更多有趣的好处。

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

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

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

nginx的第一行是在2002年编写的。2004年,它根据双条款BSD许可证向公众发布。从那时起,nginx用户的数量一直在增长,提供想法,并提交对整个社区非常有帮助和有益的错误报告,建议和观察。

nginx代码库是原创的,完全是用C编程语言从头开始编写的。 nginx已经移植到许多架构和操作系统,包括Linux,FreeBSD,Solaris,Mac OS X,AIX和Microsoft Windows。 nginx有自己的库,其标准模块除了zlib,PCRE和OpenSSL之外不会超出系统的C库,除非zlib,PCRE和OpenSSL可以选择从构建中排除,如果不需要或者由于潜在的许可证冲突。

关于Windows版nginx的几句话。虽然nginx适用于Windows环境,但nginx的Windows版本更像是概念验证而不是功能齐全的端口。 nginx和Windows内核架构存在某些限制,目前这些架构不能很好地交互。 Windows的nginx版本的已知问题包括并发连接数量少得多,性能下降,没有缓存以及没有带宽监管。面向Windows的nginx的未来版本将更紧密地匹配主流功能。

nginx 系列

Nginx-01-聊一聊 nginx

Nginx-01-Nginx 是什么

Nginx-02-为什么使用 Nginx

Nginx-02-Nginx Ubuntu 安装 + windows10 + WSL ubuntu 安装 nginx 实战笔记

Nginx-02-基本使用

Nginx-03-Nginx 项目架构

Nginx-04-Docker Nginx

Nginx-05-nginx 反向代理是什么?windows 下如何配置使用 nginx

Nginx-06-nginx 汇总入门介绍

Nginx R31 doc 官方文档-01-nginx 如何安装

Nginx R31 doc-02-nginx 基本功能

Nginx R31 doc-03-HTTP Load Balancing HTTP 负载均衡

Nginx R31 doc-04-HTTP Health Checks

Nginx R31 doc-05-Dynamic Configuration of Upstreams with the NGINX Plus API 使用 NGINX Plus API 动态配置上游服务器

Nginx R31 doc-06-Accepting the PROXY Protocol

Nginx R31 doc-07-内容缓存

Nginx R31 doc-08-Configuring NGINX and NGINX Plus as a Web Server 配置 NGINX 和 NGINX Plus 作为 Web 服务器

Nginx R31 doc-09-Serving Static Content 静态内容

Nginx R31 doc-10-NGINX Reverse Proxy 反向代理

Nginx R31 doc-11-Compression and Decompression 压缩与解压缩

Nginx R31 doc-12-NGINX SSL Termination 安全加密

Nginx R31 doc-13-Limiting Access to Proxied HTTP Resources 访问限流

Nginx R31 doc-14-Dynamic Denylisting of IP Addresses 动态拒绝IP地址

Nginx R31 doc-15-Live Activity Monitoring 实时活动监控

Nginx R31 doc-16-logging 配置日志

Nginx R31 doc-17-debugging 调试

Nginx R31 doc-18-High Availability Support for NGINX Plus in On-Premises Deployments

Nginx 实战-01-nginx ubuntu 安装笔记

Nginx 实战-01-nginx windows 安装笔记

Nginx 实战-02-nginx proxy_pass 服务代理访问 使用笔记 ubuntu nodejs

Nginx 实战-03-nginx 负载均衡

Nginx 实战-04-nginx 不同的地址访问不同的服务

Nginx 实战-05-nginx 反向代理实现域名到指定的 ip