NGINX是众所周知的高性能负载均衡器、缓存和web服务器,为世界上40%以上最繁忙的网站供电。对于大多数用例,默认的NGINX和Linux设置工作得很好,但是要获得最佳性能有时需要进行一些调整。这篇博客文章讨论了在优化系统时要考虑的一些NGINX和Linux设置。
几乎可以对任何设置进行优化,但本文将集中讨论少数几个对大多数用户有利的设置。只有当您对NGINX和Linux有了深入的了解,或者按照我们的支持或专业服务团队的指导,我们才建议您更改某些设置,这里不介绍这些设置。专业服务团队与世界上一些最繁忙的网站合作,优化NGINX以获得最高级别的性能,并可与您一起充分利用NGINX或NGINX Plus部署。
假设对NGINX架构和配置概念有基本的了解。本文并不试图复制NGINX文档,而是提供了各种选项的概述以及到相关文档的链接。
优化时要遵循的一个好规则是一次更改一个设置,如果更改不能提高性能,则将其设置回默认值。
我们首先讨论Linux的调优,因为某些操作系统设置的值决定了如何调优NGINX配置。
现代Linux内核(2.6+)中的设置适用于大多数目的,但更改其中的一些设置可能是有益的。检查内核日志中指示设置过低的错误消息,并根据建议进行调整。在这里,我们只讨论那些在正常工作负载下最有可能从优化中受益的设置。有关调整这些设置的详细信息,请参阅Linux文档。
积压队列(The Backlog Queue)
以下设置与连接及其排队方式相关。如果传入连接的速率很高,并且性能水平参差不齐(例如,某些连接似乎处于暂停状态),则更改这些设置可能会有所帮助。
描述器
文件描述符是用于表示连接和打开的文件等的操作系统资源。NGINX每个连接最多可以使用两个文件描述符。例如,如果NGINX正在代理,它通常使用一个文件描述符作为客户端连接,另一个用于连接到代理服务器,尽管如果使用HTTP keepalives,这个比率要低得多。对于提供大量连接的系统,可能需要调整以下设置:
短暂的端口(Ephemeral Ports)
当NGINX充当代理时,到上游服务器的每个连接都使用一个临时或短暂的端口。您可能需要更改此设置:
下面是一些可以影响性能的NGINX指令。如上所述,我们只讨论对您自己调整安全的指令。我们建议您不要在没有NGINX团队指导的情况下更改其他指令的设置。
工作进程(Worker Processes)
NGINX可以运行多个工作进程,每个进程都能够处理大量的同时连接。您可以使用以下指令控制工作进程的数量以及它们如何处理连接:
保持连接(Keepalive Connections)
Keepalive连接可以减少打开和关闭连接所需的CPU和网络开销,从而对性能产生重大影响。NGINX终止所有客户端连接,并创建到上游服务器的独立连接。NGINX支持客户端和上游服务器的keepalives。以下指令与客户端keepalives相关:
以下指令与上游保持连接有关:
要启用到上游服务器的keepalive连接,还必须在配置中包含以下指令:
proxy_http_version 1.1;
proxy_set_header Connection "";
访问日志记录
记录每个请求会占用CPU和I/O周期,减少影响的一种方法是启用访问日志缓冲。使用缓冲,NGINX不会对每个日志条目执行单独的写操作,而是缓冲一系列条目,并在单个操作中将它们一起写入文件。
要启用访问日志缓冲,请将buffer=size参数包含到access_log指令中;NGINX在缓冲区达到size值时将缓冲区内容写入日志。要让NGINX在指定时间后写入缓冲区,请包含flush=time参数。当设置了这两个参数时,NGINX会在下一个日志条目无法放入缓冲区或缓冲区中的条目分别早于指定的时间时将条目写入日志文件。当工作进程重新打开其日志文件或关闭时,也会写入日志项。要完全禁用访问日志记录,请将off参数包含到access_log指令中。
发送文件(Sendfile)
操作系统的sendfile()系统调用将数据从一个文件描述符复制到另一个文件描述符,通常实现零拷贝,这可以加快TCP数据传输。要使NGINX能够使用它,请在http上下文或服务器或位置上下文中包含sendfile指令。然后,NGINX可以将缓存或磁盘上的内容写入套接字,而无需将任何上下文切换到用户空间,从而使写入速度极快,占用更少的CPU周期。但是,请注意,由于使用sendfile()复制的数据绕过了用户空间,因此它不受常规NGINX处理链和更改内容的过滤器(如gzip)的约束。当配置上下文同时包含sendfile指令和激活内容更改筛选器的指令时,NGINX会自动为该上下文禁用sendfile。
限制
您可以设置各种限制,帮助防止客户端消耗太多资源,这可能会对系统性能以及安全性和用户体验造成不利影响。以下是一些相关指令:
NGINX可以用来提高web应用程序性能的一些附加特性实际上并不属于优化的范畴,但值得一提的是,它们的影响是相当大的。它们包括缓存和压缩。
缓存
通过在NGINX实例上启用缓存(NGINX实例是一组web或应用程序服务器的负载平衡),可以显著提高对客户端的响应时间,同时显著减少后端服务器上的负载。缓存本身就是一个主题,我们不会在这里讨论它。请参阅NGINX Plus管理指南。
压缩
压缩发送到客户端的响应可以大大减小它们的大小,因此它们使用较少的网络带宽。然而,由于压缩数据会消耗CPU资源,因此当确实值得减少带宽使用时,它是最有用的。需要注意的是,不应为已压缩的对象(如JPEG文件)启用压缩。有关更多信息,请参阅NGINX Plus管理指南。
微信公众号 | 关注微信公众号【首席架构师智库】 | |
---|---|---|
微信小号 | 希望加入的群:架构,云计算,大数据,数据科学,物联网,人工智能,安全,全栈开发,DevOps,数字化,产品转型。 | |
知识星球 | 向大咖提问,近距离接触,或者获得私密分享。 | 点击加入知识星球【首席架构师圈】 |
微信圈子 | 志趣相投的同好交流。 | 点击加入微信圈子【首席架构师圈】 |
喜马拉雅 | 路上或者车上了解最新黑科技资讯,架构心得。 | 点击,收听【智能时刻,架构君和你聊黑科技】 |
知识星球 | 认识更多朋友,职场和技术闲聊。 | 点击加入知识星球【知识和技术】 |