Nginx 介绍(译文I–为什么高并发很重要)
- 原文 nginx
- 作者 Andrew Alexeev
本章目录
- 概述
- 为什么高并发很重要?
- Apache不适用了吗?
- 使用nginx有更多优势吗?
概述
nginx(发音为‘engine x’)是俄罗斯软件工程师 Igor Sysoev开发的一款免费开源的web服务器。自2004年开源以来,nginx一直专注于高性能、高并发、低内存消耗。
此外,nginx具备web服务器最常用的功能,如:
- 负载均衡
- 缓存
- 访问与带宽控制
- 与多类软件易耦合的能力
这些特性使得nginx非常适用于现代web站点架构。目前,nginx是网上第二大流行的开源web服务器软件。
为什么高并发很重要?
相比十年前,互联网已得到了广泛的普及与应用。
现在我们甚至难以想象离开互联网的世界。
从最初基于NCSA
==>进化到基于Apache web 提供的可进行简单文本操作的html
==>到目前的全世界20亿用户永久在线媒介
互联网一直在高速进化。
随着
- 永久在线个人电脑
- 移动设备
- 近期的平板电脑
的扩散,互联网在不断的变化,整个经济体系也随之数字有线化。即时信息与娱乐服务变得更加轻盈精巧,在线业务的安全可靠性也发生了显著变化。因此,当下的网站服务比之前变得更复杂,web引擎需要在工程上更具健壮性和可扩展性。
并发一直是web体系结构最大的挑战之一。自web services应用以来,并发能力持续增长。流行站点服务10w甚至100w的访问量非常常见。
- 十年前,影响并发的主要因素是客户端缓慢---用户使用ADSL或者拨号连接网络。
- 现在,并发主要由移动端和新的应用架构带来,这些应用采用长链接以便能让用户及时更新消息,微博和朋友圈等等。
- 浏览器行为的变化是另一个导致并发增长的原因,现代浏览器访问网站时一般会打开4~6个并发以提高页面加载速度。
下面简要阐述一下客户端缓慢的问题
设想一个基于Apache的简单网站服务器,该服务器生成相对简短的100K的返回体–由文本或图片组成的简单页面。服务器耗费了不到一秒的时间生成一个页面,但是在80kbps(10KB/s)的网络环境下却耗费了10秒传输到客户端。网站服务器相对较快地推送10KB的内容,却需要在释放连接前耗费10秒钟将内容发送到客户端。
现在设想有1000个客户端同时连接上,请求类似的内容。假设仅分配1M内存给每个客户端,那么就是说,1000个客户端,100KB的请求内容,服务端却要消耗1G的内存。
事实上,一个典型的基于Apache的网站服务器需要为每个client分配超过1M的内存,而移动端的有效速度往往也在几十kbps。针对发送内容到客户端低效这个问题,虽然提高操作系统内核的socket缓冲区的大小,能一定程度上解决缓解问题,但是并不是一个通用的解决方案,并且有无法预期的副作用。
而随着长连接的使用,该问题更加明显。为了避免新建HTTP连接所带来的延时,客户端往往会保持连接,而对于每个客户端服务器必然会分配一定数量的内存。
因此,为了处理
- 持续增长的用户带来的负载
- 更高量级的并发
- 持续处理以上这些的能力
一个网站需要基于大量高效的组件。
而web服务器在接受和处理客户端请求过程中,其它模块诸如:
- 硬件(CPU,内存,磁盘)
- 网络带宽
- 应用和数据存储架构
- ……等
这些显然也很重要。因此,网站服务器需具备能够随着同时并发连接数和每秒请求数的增长而非线性扩展的能力。
Apache不适用了吗?
起源于90年代初期Apache网站服务器,目前依旧主导着整个互联网。Apache的架构设计不仅仅适合于当时的操作系统和硬件,同时也十分符合当时的互联网环境--一个网站通常使用一台物理服务器运行一个Apache实例。
到了2000年之后,这种单服务器模型显然无法通过简单复制以来满足日益增长的web服务需求。虽然Apache为新功能开发提供了坚实的基础,但他为每个新连接派生一个进程的设计使得其无法适用于网站的非线性扩展。诚然,Apache作为通用的web服务器软件,聚焦于
- 功能多样化
- 第三方扩展开发
- 以及普遍适用于几乎任何类型的web应用程序开发。
然而随着
- 每个连接消耗的CPU和内存越持续增长
- 硬件成本降低
这样功能繁多的单一软件可伸缩性越来越差。
因而,当
- 服务器硬件
- 操作系统
- 网络设施
不再是网站增长的瓶颈时,全世界的网站开发者开始寻求更高效方法来运行web服务。大约十年前,著名软件工程师Daniel Kegel提出:“是时候让web服务器并发支持10000客户端了”,并且预言了当下的云服务。Kegel的C10K设想明显推动了许多人尝试解决这个问题–通过优化web服务器以支持海量客户端的并发处理,nginx便是其中最成功的案例之一。
为了解决10000个并发连接的C10K问题,nginx基于一个完全不同的架构—-更适合并发连接数和每秒请求数非线性增长。Nginx基于事件模型,因此不会像Apache为每个请求创建新进程或线程。所以内存和CPU使用事件始终保持可预期,而不受负载影响。目前,一个普通硬件上搭建的Nginx便能处理数万的并发连接。
在Nginx的第一个版本发布时,其主要作为apache的助手,处理如HTML、CSS、JavaScript脚本和图片等静态请求,以降低基于Apache应用服务器的并发和延时。随着开发的进行,nginx增加了
- FastCGI、uswge和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)模式的web站点,或许并非仅仅转化为基于LEMP(E 是 Engine X),更多地是一种实践。这种实践将web服务器推入基础设施的边缘,并以全新的方式整合这些相同或修订后的应用集和数据库工具集。
nginx的很多关键特性使得十分适合做这些工作。
- 并发
- 长连接处理
- SSL
- 静态内容
- 压缩和缓存
- 连接和请求限速
- 以及HTTP媒体流
- ……等
这些特性,使得nginx能够从应用层剥离而成为高效的边缘web服务层。除此之外,为提高处理大规模并发用户的性能,Nginx允许直接整合如memcached、Redis或者其他的NoSQL解决方案。
随着新环境下开发包和编程语言广泛使用,越来越多的公司开始改变应用的开发和部署习惯。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库函数。此外,如果不需要或者考虑到潜在的授权冲突,可以不使用这些第三方库。
简要谈谈关于Windows版本nginx。当nignx在Windows环境下工作时,Windows版本的nginx更像是概念验证而非全功能移植。这是由于目前nginx和Windows内核架构之间交互存在一定限制导致。Windows版本ngnix已暴露的问题包括:相对更低并发连接数、降低的性能、不支持缓存和带宽策略。未来Windows版本的nginx会尽力提供主流功能。