Nginx以高性能 负载均衡 、 缓存 和 web服务器 出名,支撑着世界上繁忙网站中的40%。大多数使用场景下,Nginx和Linux系统的默认配置表现较好,但是仍有必要做一些调优以期达到最佳性能。这篇文章讨论当调优系统时需要考虑的一些Nginx和Linux配置。这些配置有很多,但是在本文里我们只涉及适合大多数用户的配置。那些没有涉及到的配置,只有那些对Nginx和Linux有深入理解的人,或者Nginx专家服务团队推荐,才会考虑到。Nginx专家服务,已经和世界上一些繁忙网站合作来调优Nginx以达到最大限度的性能,并且可以对任何需要充分发挥系统能力的客户提供支持。
这里假定读者对Nginx架构和配置概念有个基本了解。本文不会重复Nginx文档的内容,而是概述各种配置选项并提供相关文档链接。
调优时,有一条较好的准则是,一次只改一个配置项,如果改后没有性能上的提升,就退回为原先的值。
我们先讨论Linux调优,因为有些值会影响在Nginx配置中可以用的值。
现代Linux内核(2.6+)能够很好的调节各种配置,有些配置您可能想更改。如果操作系统配置太低,那么会在内核日志中看到错误信息,因此需要调节这些配置。Linux配置项很多,本文只提及那些在普通工作负载下最可能需要调优的配置项。如果需要这些配置的详细信息,请参考Linux文档。
以下设置与连接及其如何排队直接相关。如果传入的连接率很高而性能水平参差不齐,比如一些连接似乎被暂停了,那么更改这些配置可能会有用。
文件描述符是一种操作系统资源,用来处理诸如连接和打开文件的事情。对每一个连接,Nginx可以用上多达两个文件描述符。例如,如果Nginx用作代理,则其中一个用于客户端连接,另一个用于连接到被代理的服务器。如果使用了HTTP keepalive,则连接描述符的使用会少得多。对于有大量连接的系统,如下设置可能需要进行调整:
当Nginx被当作代理使用时,每一个到upstream服务器的连接都使用一个临时端口。
下面是一些可能影响性能的Nginx指令。如前所述,我们仅讨论那些推荐大多数用户调整的指令。这里未提及到的任何指令,如果没有Nginx团队的指导,不推荐更改。
Nginx可以运行多个工作进程,每个都能处理大量连接。你可以用如下指令控制工作进程个数以及连接如何被处理:
持久连接可以减少打开和关闭连接所需要的CPU和网络开销,因而对性能有重大影响。Nginx终止所有客户端连接,并具有到upstream服务器的单独连接。Nginx支持客户端和upstream服务器的持久连接。如下指令涉及客户端持久连接:
如下指令涉及upstream持久连接:
为了启用到upstream的持久连接,需要增加如下指令:
记录每个请求需要花费CPU和IO周期,减少这种影响的一种方法是启用access日志缓冲。这将导致Nginx缓冲一系列日志条目,然后一次性写入文件而不是单个单个写入。通过指定access_log指令的"buffer=size"选项可以打开access日志缓冲,该设置指定要使用的缓冲区的大小。你还可以使用"flush=time"选项告诉Nginx多长时间后把缓冲区中的条目写入文件。定义了这两个选项后,当缓冲区放不下下一条日志,或者缓冲区中的条目超过了flush参数指定的时间,Nginx会将缓冲区中的条目写入日志文件。当工作进程重新打开日志文件或者关闭时,缓冲区中的条目也会被写入文件。也可以完全禁用access日志记录。
Sendfile 是一个操作系统特性,可以在Nginx上启用。它通过在内核中从一个文件描述符向另一个文件描述符复制数据,往往能达到 零拷贝 ,因而可以提供更快的TCP数据传输。Nginx可以使用该机制将缓存或者磁盘上的内容写到socket,无需从内核空间到用户空间的上下文切换,因而非常快并且使用较少的CPU开销。由于数据永远不会触及用户空间,所以不可能把需要访问数据的过滤器插入到处理链中,不能使用任何需要改变内容的Nginx过滤器,比如gzip过滤器。Nginx默认没有启用该机制。
Nginx和Nginx Plus允许设置各种限制,用来控制客户端资源消耗,以防影响系统性能以及用户体验和安全。以下是一些相关指令:
Nginx还有一些特性可以用来提高web应用的性能。这些特性不常出现在调优讨论中,但是有必要一提,因为它们的影响也可能比较可观。我们将讨论这些特性中的两个。
对于一个为一组web服务器或者应用服务器作负载均衡的Nginx实例来说,启用缓存可以显著地降低响应时间,同时能显著减轻后端服务器的负载。缓存本身就是一个主题,这里不会讨论。Nginx缓存配置的更多信息请参考: Nginx管理指南 - 缓存 。
压缩响应可以大大减小响应的大小,减少带宽占用。不过,这需要CPU资源来处理压缩,所以最好在值得减少带宽占用的情况下使用。需要注意的是,不能对已经压缩的东西(比如jpeg图片)再次启用压缩。Nginx压缩配置的更多信息请参考: Nginx管理指南 - 压缩和解压缩 。
更多信息请参考:
Nginx很火,因为它就像一个万能药,在任何存在性能需求的场合总能找见它的身影。它可以轻松在百万并发连接下实现高吞吐量的Web服务,同时诸多应用场景下的问题都可以通过种种Nginx模块得以解决。
Nginx天生就适合在linux服务器上处理百万、千万级的并发连接,且优秀的架构使得它未来不需要重构,所以它的生态圈内的第三方模块长期有效。而长年的发展下日益增多的第三方模块进一步赋能Nginx,使Nginx适用于更多的场景,甚至渗透到LVS的领域与F5这样的硬件产品竞争!同时,如OpenResty或者Tengine这样的第三方模块群,进一步发展出了新生态,使Nginx的应用进一步向应用防火墙、CDN等领域扩展。
所以,学好Nginx可以让你在工作中获得立竿见影的效果。
网络上关于Nginx的使用介绍非常多,但往往有两个问题 :
1、仅从如何使用层面介绍,没有把离散的知识点串成线,这导致大家难以应对未出现过的、个性化的定制场景;
2、没有成体系的性能优化知识介绍,在企业生产环境下我们需要从应用到系统的完整优化方案 。
最近看到极客时间上线的视频课程《Nginx核心知识100讲》,涉及到了Nginx的基本用法、http模块、反向代理与负载均衡、OpenResty等各方面的综合知识,很系统化。最值得一提,这个课程的作者--陶辉老师,应该算是Nginx领域的专才了。 有着近10年Nginx方面的研究经验,曾出版过京东热销书籍《深入理解Nginx:模块开发与架构解析》。
简单介绍下这个课程的内容规划,主要分为六个部分:
第1部分初识Nginx: 帮助对Nginx还不熟悉的同学快速了解Nginx的背景,熟悉Nginx的基本用法;
第2部分是Nginx的架构基础: 在这里我们开始探讨Nginx的进程模型以及数据结构,它为后续深入学习打下基础;
第3部分我们开始详解http模块: 这一部分我们先讲清楚Nginx是如何处理http请求的,再按照请求的处理流程来讲解常用http模块中指令、变量的用法,学完后可以帮助我们触类旁通,理解所有http模块的共同逻辑及用法。
第4部分是反向代理与负载均衡: 这一部分以七层负载均衡为主,兼顾四层负载均衡,学完这一部分,你可以搭建出多种不同上游协议的反向代理,并理解如何配置才能高效的处理上下游流量的交互。
第5部分是Nginx的系统层优化: 学完该部分可以有效的调节linux操作系统下cpu、内存、网络、磁盘等配置,与Nginx.conf中的指令相配合,使Nginx的性能最大化。
第6部分是从源码视角深入使用Nginx与OpenResty: 这一部分我们会从Nginx的实现层面,打通前5部分中的知识,帮助大家深刻理解Nginx的机制与能力模型,并介绍OpenResty是如何与Nginx有效搭配使用的。
不多说了,直接附上陶辉出品的“Nginx核心知识框架图”,非常系统地梳理了学好Nginx所需要的知识点。
福利一:限时优惠价¥68(原价¥129),接近半价优惠,11月17日恢复原价;最近两天有啥福利?
福利二:每邀请一位好友购买,可获得24元现金返现,多邀多得,上不封顶,随时提现。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)