第1章 Nginx初探
Nginx服务器是轻量级Web服务器中广受好评的一款产品。从本章我们开始Nignx服务器的学习和实践。
在本章中,我们主要探究Nginx服务器是什么,它在相关的行业领域内地位如何,它有哪些用途等问题。我们将追随Nginx服务器由诞生到快速发展的历史轨迹,了解Nginx服务器提供了哪些令人兴奋的功能和特性。
在这一章中我们主要学习以下几个方面的内容:
■ 常见的Web服务器产品。
■ Nginx服务器的诞生和发展。
■ Nginx服务器的功能和特性。
1.1 Nginx的历史
近几年来,Nginx逐步进入高速发展的时期,从各类主流的IT媒体到各大著名的IT论坛,我们不时能够看到它的身影。
Netcraft公司,1994年在英国成立,官方网址为http://uptime.netcraft.com。Netcraft公司为互联网市场以及在线安全方面提供咨询服务,同时针对网站服务器、域名解析/主机提供商以及SSL市场进行客观严谨的分析研究。公司官方网站每月定期公布的Web Server Survey已成为了解全球网站及服务器市场份额情况的主要参考依据。
根据Netcraft公司在2012年8月收到的对628170204个网站的调查数据显示,使用Nginx服务器的网站的比例在不断攀升,其市场份额已由7月份的11.45%进一步上升至12.31%,并成为此次调查中唯一份额增长的服务器产品。
Nginx的成功要归功于它在设计之初就已经形成的不同于其他同类产品的设计理念和架构体系。那么,在Nginx服务器名不见经传的时候,Web服务器市场的情况是怎样的呢?
1.2 常见服务器产品介绍
我们仍然以Netcraft公布的数据为基础,对常见主流服务器产品进行介绍。图1.1摘自Netcraft官方网站,其展示了2012年全球主流Web服务器的市场份额情况,其中有Apache、Microsoft IIS、Sun、Nginx、Google以及NCSA等。在接下来的各小节中,我们主要针对Apache、Microsoft IIS、NCSA等Web服务器产品进行介绍,同时还将补充介绍图中未提及的Tomcat、Lighttpd等Web服务器产品。
图1.1 全球主流Web服务器市场份额(2012, 来源:Netcraft)
1.2.1 Apache服务器
相信大多数使用过Web服务器的人对Apache服务器都不会陌生。Apache,取自“a patchy server”的读音,意思是充满补丁的服务器。这一称呼隐含了Apache极富戏剧性的诞生历史。Apache HTTP Server的官方网站为http://httpd.apache.org。根据Netcraft公司公布的数据,截至目前,全球仍旧有超半数的活跃网站使用Apache Web服务器,其市场份额高达55.46%。
Apache Web服务器最初是由NCSA httpd 1.3服务器发展而来的,目前的最新版本为Apache httpd 2.4.2。作为开源软件,不断有人为它开发新的功能、新的特性并修改原来的缺陷,使其逐渐形成跨平台能力强、安全性能高并且被业界广泛接受和使用的最流行的Web服务器软件。Apache Web服务器在各种开源的WWW服务提供工具中特性最全,并且运行速度快,性能相对稳定,而且扩展功能丰富。
不可否认,Apache Web服务器是当今Web服务器市场中的领军产品,但在具体的使用过程中,它仍然在某些方面表现不足。比如性能方面,Apache在设计时使用了以“进程”为基础的结构。大家都知道,进程要比线程消耗更多的系统开支,这导致Apache在多处理器环境中性能有所下降。因此,在对一个Apache Web站点进行扩容时,通常是增加服务器或扩充群集节点而不是增加处理器。
1.2.2 Microsoft IIS
IIS是Microsoft公司的Web服务器产品,其在全球Web服务器市场中占有相当大的市场份额,是被广泛采用的Web服务器之一。IIS,是Internet Information Services的缩写。最初IIS是Windows NT版本的可选包,随后内置在Windows 2000、Windows XP Professional、Windows Server 2003和Windows Server 2008中一起发行。最新的IIS 7.5已经和Windows Server 2012一起发行了。IIS的官方网址为http://www.iis.net,可以在此找到更多关于IIS功能特性的详细介绍。
IIS具备Web服务器特性的同时还包含了Gopher Server(Web上一种信息查找系统)和FTP Server,并且可以用于HTTP Server、FTP Server、NNTP Server或者SMTP Server。我们通过IIS不仅仅可以发布网页,它还可以提供新闻服务、文件和应用程序服务、邮件服务等。同时IIS还包含一些有趣的扩展,比如环境编辑界面FrontPage、具备全文检索功能的Index Server及具备多媒体功能的Net Show等。
IIS和Windows Server相结合,使其在网络应用服务器的管理、可用性、可靠性、安全性、性能与可扩展性等方面都大为增强了。
为了进一步提高可靠性、安全性及可用性,从6.0版本以后,IIS提供了全新的IIS架构,该架构采用新的内核监听模式和新的“应用程序隔离模式—工作进程隔离模式”,这增强了应用程序池、工作进程以及Web管理服务等方面的功能,同时增强了网络应用的开发与国际性支持。而从7.0版本开始, IIS进一步强调了其模块特性,增加了SQL数据库管理器、日志报表可视化支持、对IIS设置提供完全控制的配置编辑器、请求过滤器、.NET授权规则编辑器以及FastCGI机制等强有力的功能,这进一步增强了用户的可操作性和服务器的性能。
作为同一家公司的产品,IIS和Windows Server组合可以提供可靠、高效、完整的网络服务器解决方案。当然,作为付费软件,IIS部署成本高的缺点也是显而易见的。
1.2.3 Tomcat服务器
Tomcat,在英文中是“公猫或其他雄性猫科动物”的意思。Tomcat服务器最初是由Sun公司的软件构架师詹姆斯 • 邓肯 • 戴维森开发的,后来变为开源项目,并由Sun公司将其贡献给了Apache软件基金会。据说戴维森在最初接手Tomcat的开发项目时,希望将此项目以一个动物的名字命名。他希望这种动物能够自己照顾自己。最终,他将其命名为Tomcat。
Tomcat是Sun公司官方推荐的Servlet和JSP容器,在中小型系统和并发访问用户不是很多的场合下,其作为轻量级应用服务器,被广泛地使用。它是开发和调试JSP程序的首选。目前在Apache Tomcat官方网站上提供下载的最新版本为7.0.29。
在一般的应用中,Tomcat常作为Apache的扩展部分,为运行JSP页面和Servlet提供服务,独立的Servlet容器是Tomcat的默认模式。事实上,Tomcat和IIS、Apache等Web服务器一样,具有处理HTML页面的功能,只是它处理静态HTML的能力不如Apache服务器。
Tomcat服务器作为轻量级的服务器软件,无法满足复杂业务场景的要求,也没有复杂和丰富的功能;但Tomcat是免费开源的,且体积小,安装和部署都很方便,系统资源占用率低,是主要的Servlet和JSP容器,在这方面它比绝大多数的商业应用软件服务器要好。
1.2.4 Lighttpd服务器
Lighttpd服务器来自德国的一个开源轻量级Web服务器软件,它在2004年左右开始取得了高速发展。Lighttpd,是Light footprint和httpd的结合,读音同Lighty。在Lighttpd的官方网站http://www.lighttpd.net中有这样一段介绍:
With a small memory footprint compared to other web-servers, effective management of the cpu-load, and advanced feature set lighttpd is the perfect solution for every server that is suffering load problems.
由此可见Lighttpd的名字就是此服务器设计理念的完美体现。
根据Netcraft曾经发布的数据调查显示,2007年1月,全球使用Lighttpd的网站为170000家,2月这个数字就达到了7000000,在短短的一个月内惊人地增长了400%!当时,包括一些著名的网站,如YouTube、Wikipedia、Meebo、Yahoo! Messenger、Windows Live Messenger、ICQ、AIM等,以及国内的网易新闻、六间房、56.COM、豆瓣、新浪博客、迅雷在线、花瓣网等都使用它作为服务器软件。
Lighttpd的急速发展得益于它专门针对高性能网站,提供了一套安全、快速、兼容性良好并且灵活的Web Server环境。同时,它具有非常低的内存开销、CPU占用率低以及模块丰富等特点,支持FastCGI、Output Compress(输出压缩)、URL重写等绝大多数Apache具有的重要功能,是Apache的绝好替代者。
作为轻量级服务器,Lighttpd与Apache等大型Web服务器软件相比,其在功能上存在不足和部分缺陷,比如Proxy功能不完善、对编码支持不完善等缺点。
1.2.5 Nginx诞生记
Nginx(engine-x)是由1994年毕业于俄罗斯国立莫斯科鲍曼技术大学的Igor Sysoev为俄罗斯访问量居首的Rambler.ru站点(www.rambler.ru)设计开发的。开发工作从2002年开始,第一次正式公开发布是在2004年10月4日,版本号为0.1.0。
Nginx是一款免费开源的高性能HTTP服务器及反向代理服务器(Reverse Proxy)产品,同时,它还可以提供IMAP/POP3代理服务等功能。在实际的使用中,Nginx还可以提供更多更丰富的功能,我们将在下一节介绍它的功能。
Nginx的官方网站为http://www.nginx.org,同时Wiki为Nginx开设了专门的介绍页面,链接为http://wiki.nginx.org/Main。本文引述的部分背景信息来源于这两个网站。大家可以由此获取更多相关背景知识。
到目前为止,Nginx已经在俄罗斯第一大网站Rambler.ru上运行了近9个年头。在这段时间中, Nginx不断成长和发展,以其稳定的性能、丰富的功能集、低系统资源的消耗而逐渐被全球Web服务器使用者认可,在全球的市场份额节节攀升。根据Wiki的资料显示,目前全球活跃的网站中,有12.18% (大约为22200000个)的网站是由Nginx提供服务。而根据上一节中Netcraft公布的全球主流Web服务器最新数据显示,Nginx的发展势头仍然良好。
为什么Nginx会成为众多Web服务器产品中的后起之秀呢?Nginx到底能给我们带来怎样不同寻常的服务呢?在回答这些问题之前,我们先来简单梳理一下Nginx的历史版本和更新,从中感受Nginx快速成长的历程。
1.2.6 版本变更大事记
Nginx从2004年10月发布到如今,已经趋于成熟和完善。它之所以能够如此快速地发展成为全世界广大Web服务器使用者青睐的对象,很重要的一个原因是,它依靠软件开源优势,集合全球技术人员的智慧,快速修复缺陷,更新功能,优化设计。所有人员都可以在Nginx的官方网站http://trac.nginx.org/nginx/browser浏览版本库并获取源码,进行进一步的开发和修改。
根据官方的版本变更说明(http://nginx.org/en/CHANGES)可以看到,自诞生到现在,Nginx一共经历了十多次较大更新,以及近340次版本变更,更新频率非常高。
引起Nginx版本变更的主要原因包括软件缺陷修正、功能优化以及新功能加入等。
需要指出的是,Nginx发布伊始主要针对Linux平台。从Nginx 7.0.69开始,Nginx官方开始提供Windows版本,版本号与对应Linxu版本的版本号相同。由于Windows平台的Nginx在性能和使用广泛程度上不如Linux平台的Nginx,因此在本文的以后篇章中,如无特别说明,讲述内容主要针对Linux平台的Nginx。
目前,官方将Nginx版本分为开发版本(Development version,最新版本为nginx-1.3.4)、稳定版本(Stable version,最新版本为nginx-1.2.3)以及过期版本三种。其中,开发版本主要用于Nginx软件项目的研发,稳定版本即可作为Web服务器投入商业应用。
注意
在本书以下的章节中,如无特别说明,“Nginx X.X.X”的说法都是指“Nginx稳定版本X.X.X”。如果是其他类型版本,笔者会注明。
经过逐步的改进,Nginx已成为一款高性能、功能完善、性能稳定的服务器产品。下一节,将对Nginx的功能进行介绍,为大家展现其丰富的功能特性。
1.3 Nginx的功能特性
Nginx服务器以其功能丰富著称于世。它既可以作为HTTP服务器,也可以作为反向代理服务器或者邮件服务器;能够快速响应静态页面(HTML)的请求;支持FastCGI、SSL、Virtual Host、URL Rewrite、HTTP Basic Auth、Gzip等大量使用功能;并且支持更多的第三方功能模块的扩展。
本节我们来梳理Nginx服务器提供的基本功能和服务,了解它较为完善的功能体系。在本书的以后章节中,会对本节提到的重要技术从理论和应用两个层次进行更为详细的说明。
我们将Nginx提供的基本功能服务从大体上归纳为基本HTTP服务、高级HTTP服务和邮件服务等三大类。
■ Nginx提供基本HTTP服务,可以作为HTTP代理服务器和反向代理服务器,支持通过缓存加速访问,可以完成简单的负载均衡和容错,支持包过滤功能,支持SSL等。
■ Nginx提供高级HTTP服务,可以进行自定义配置,支持虚拟主机,支持URL重定向,支持网络监控,支持流媒体传输等。
■ Nginx作为邮件代理服务器是最早开发这个产品的目的之一,它支持IMAP/POP3代理服务功能,支持内部SMTP代理服务功能。
下面进一步对Nginx的这三类基础功能进行说明。
1.3.1 基本HTTP服务
在Nginx提供的基本HTTP服务中,主要包含以下功能特性:
■ 处理静态文件(如HTML静态网页及请求);处理索引文件以及支持自动索引。
■ 打开并自行管理文件描述符缓存。
■ 提供反向代理服务,并且可以使用缓存加速反向代理,同时完成简单负载均衡及容错。
■ 提供远程FastCGI服务的缓存机制,加速访问,同时完成简单的负载均衡以及容错。
■ 使用Nginx的模块化特性提供过滤器功能。Nginx基本过滤器包括gzip压缩、ranges支持、chunked响应、XSLT、SSI以及图像缩放等。其中,针对包含多个SSI的页面,经由FastCGI或反向代理,SSI过滤器可以并行处理。
■ 支持HTTP下的安全套接层安全协议SSL。
这些功能特性的应用将在后续章节中详细阐述。
1.3.2 高级HTTP服务
在Nginx提供的高级HTTP服务中,主要包含以下功能特性:
■ 支持基于名字和IP的虚拟主机设置,在以后的章节中大家将看到具体应用。
■ 支持HTTP/1.0中的KEEP-Alive模式和管线(PipeLined)模型连接。
■ 支持重新加载配置以及在线升级时,无须中断正在处理的请求。
■ 自定义访问日志格式、带缓存的日志写操作以及快速日志轮转。后面章节会讨论其具体应用。
■ 提供3xx~5xx错误代码重定向功能。后面章节会讨论其具体应用。
■ 支持重写(Rewrite)模块扩展。后面章节会讨论其具体应用。
■ 支持HTTP DAV模块,从而为Http WebDAV提供PUT、DELETE、MKCOL、COPY以及MOVE方法。
■ 支持FLV流和MP4流传输。
■ 支持网络监控,包括基于客户端IP地址和HTTP基本认证机制的访问控制、速度限制、来自同一地址的同时连接数或请求数限制等。
■ 支持嵌入Perl语言。
1.3.3 邮件代理服务
Nginx提供邮件代理服务也是其基本开发需求之一,主要包含以下功能特性:
■ 支持使用外部HTTP认证服务器重定向用户到IMAP/POP3后端,并支持IMAP认证方式(LOGIN、AUTH LOGIN/PLAIN/CRAM-MD5)和POP3认证方式(USER/PASS、APOP、AUTH LOGIN/PLAIN/CRAM-MD5)。
■ 支持使用外部HTTP认证服务器认证用户后重定向连接到内部SMTP后端,并支持SMTP认证方式(AUTH LOGIN/PLAIN/CRAM-MD5)。
■ 支持邮件代理服务下的安全套接层安全协议SSL。
■ 支持纯文本通信协议的扩展协议STARTTLS。
由以上的功能列表可以看到,Nginx作为邮件代理服务器也是具备完善功能的,本书在后面介绍Nginx的Mail模块时将进一步阐述它。
1.4 常用功能介绍
这部分在内容上和其他部分没有明显的连贯性,主要是根据笔者的实践经验,选择Nginx服务器最常涉及的几个功能对其进行进一步阐述,其目的是阐明相关概念,为我们以后的学习奠定良好的知识基础。
1.4.1 HTTP代理和反向代理
代理服务和反向代理服务是Nginx服务器作为Web服务器的主要功能之一,尤其是反向代理服务,是应用十分广泛的功能。
在提供反向代理服务方面,Nginx服务器转发前端请求性能稳定,并且后端转发与业务配置相互分离,配置相当灵活。在后面的章节我们可以看到,在进行Nginx服务器配置时,配置后端转发请求完全不用关心网络环境如何,可以指定任意的IP地址和端口号,或其他类型的链接、请求等。
Nginx服务器的反向代理服务功能并不只有这些,它提供的配套功能相当丰富。首先,它支持判断表达式。通过使用正则表达式进行相关配置,可以实现根据不同的表达式,采取不同的转发策略,相关内容将在下一章节中详细阐述。其次,它对后端返回情况进行了异常判断,如果返回结果不正常,则重新请求另一台主机(即将前端请求转向另一后端IP),并自动剔除返回异常的主机。它还支持错误页面跳转功能。
谈到Nginx服务器的反向代理功能的应用,就不能不提到它在解决网络负载、性能方面的一个出色功能,这也是Nginx服务器的另一个重要的能力——负载均衡。
1.4.2 负载均衡
负载均衡,一般包含两方面的含义。一方面是,将单一的重负载分担到多个网络节点上做并行处理,每个节点处理结束后将结果汇总返回给用户,这样可以大幅提高网络系统的处理能力;第二个方面的含义是,将大量的前端并发访问或数据流量分担到多个后端网络节点上分别处理,这样可以有效减少前端用户等待响应的时间。Web服务器、FTP服务器、企业关键应用服务器等网络应用方面谈到的负载均衡问题,基本隶属于后一方面的含义。因此,Nginx服务器的负载均衡主要是对大量前端访问和流量进行分流,以保证前端用户访问效率。可以说,在绝大多数的Nginx应用中,都会或多或少涉及它的负载均衡服务。
Nginx服务器的负载均衡策略可以划分为两大类:即内置策略和扩展策略。内置策略主要包含轮询、加权轮询和IP hash三种;扩展策略主要通过第三方模块实现,种类比较丰富,常见的有url hash、fair等。
在默认情况下,内置策略会被编译进Nginx内核,使用时只需要在Nginx服务器配置中设置相关参数即可,我们在专门的章节中会详细阐述;扩展策略不会编译进Nginx内核,需要手动将第三方模块编译到Nginx内核。第三方模块的编译技术也留在后文专门讲解。下面简单介绍一下几种负载均衡策略的实现原理。
轮询策略比较简单,就是将每个前端请求按顺序(时间顺序或者排列次序)逐一分配到不同的后端节点上,对于出现问题的后端节点自动排除。加权轮询策略,顾名思义,就是在基本的轮询策略上考虑各后端节点接受请求的权重,指定各后端节点被轮询到的几率。加权轮询策略主要用于后端节点性能不均的情况。根据后端节点性能的实际情况,我们可以在Nginx服务器的配置文件中调整权值,使得整个网络对前端请求达到最佳的响应能力。
IP hash策略,是将前端的访问IP进行hash操作,然后根据hash结果将请求分配给不同的后端节点。事实上,这种策略可以看作是一种特殊的轮询策略。通过Nginx的实现,每个前端访问IP会固定访问一个后端节点。这样做的好处是避免考虑前端用户的session在后端多个节点上共享的问题。
扩展策略中的url hash在形式上和IP hash相近,不同之处在于,IP hash策略是对前端访问IP进行了hash操作,而url hash策略是对前端请求的url进行了hash操作。url hash策略的优点在于,如果后端有缓存服务器,它能够提高缓存效率,同时也解决了session的问题;但其缺点是,如果后端节点出现异常,它不能自动排除该节点。在实际使用过程中笔者发现,后端节点出现异常会导致Nginx服务器返回503错误。
扩展的第三方模块fair则是从另一个角度来实现Nginx服务器负载均衡策略的。该模块将前端请求转发到一个最近负载最小的后台节点。那么,负载最小怎么判断呢?Nginx通过后端节点对请求的响应时间来判断负载情况。响应时间短的节点负载相对就轻。得出判断结果后,Nginx就将前端请求转发到选中的负载最轻的节点。
1.4.3 Web缓存
相信不少读者对Squid有所了解。它在Web服务器领域中是一款相当流行的开源代理服务器和Web缓存服务器。作为网页服务器的前置缓存服务器,在很多优秀的站点中,它被用以缓存前端请求,从而提高Web服务器的性能;而且,它还可以缓存万维网、域名系统或者其他网络搜索等,为一个集体提供网络资源共享服务。
Nginx服务器从0.7.48版本开始,也支持了和Squid类似的缓存功能。在本节中,我们主要介绍几个将在后文中涉及的重要知识点,具体的技术细节将放在专门的章节中详细讨论。
Nginx服务器的Web缓存服务主要由Proxy_Cache相关指令集和FastCGI_Cache相关指令集构成。其中,Proxy_Cache主要用于在Nginx服务器提供反向代理服务时,对后端源服务器的返回内容进行URL缓存;FastCGI_Cache主要用于对FastCGI的动态程序进行缓存。另外还有一款常用的第三方模块ngx_cache_purge也是Nginx服务器Web缓存功能中经常用到的。它主要用于清除Nginx服务器上指定的URL缓存。
到Nginx 0.8.32版本,Proxy_Cache和FastCGI_Cache两部分的功能已经比较完善,再配合第三方的ngx_cache_purge模块,Nginx服务器已经具备了Squid所拥有的Web缓存加速功能和清除指定URL缓存的功能;同时,Nginx服务器对多核CPU的调度比Squid更胜一筹,性能高于Squid,而在反向代理、负载均衡等其他方面,Nginx也不逊于Squid。这使得Nginx服务器可以同时作为负载均衡服务器和Web缓存服务器来使用,基本可以取代Squid。
1.5 本章小结
本章是全书的第一章,首先介绍了几种市场占有率较高的服务器产品,其中有大型的Web服务器,如Apache、IIS;也有轻量级的Web服务器,如Lighttpd等;由此引出后来居上的Nginx服务器。接着,我们回顾了Nginx服务器的发展历程,对它能够在短时间内异军突起的市场表现充满了好奇。究竟是什么因素使得Nginx服务器能够在激烈的Web服务器市场竞争中占领一席之地呢?为了找到原因,我们对Nginx服务器的功能特性进行了简单梳理,并且选取反向代理功能、负载均衡功能、Web缓存服务三个功能点进行了进一步的阐述。