干货 | Nginx+Linux 性能调优

本文转载自简书,高效运维社区致力于陪伴您的职业生涯,与您一块儿愉快的成长。web

a1ef5673e83e0b5227e245a108333067.jpeg

本文翻译自Tuning NGINX for Performance后端

Nginx以高性能负载均衡、缓存和web服务器出名,支撑着世界上繁忙网站中的40%。大多数使用场景下,Nginx和Linux系统的默认配置表现较好,可是仍有必要作一些调优以期达到最佳性能。缓存

这篇文章讨论当调优系统时须要考虑的一些Nginx和Linux配置。这些配置有不少,可是在本文里咱们只涉及适合大多数用户的配置。那些没有涉及到的配置,只有那些对Nginx和Linux有深刻理解的人,或者Nginx专家服务团队推荐,才会考虑到。安全

Nginx专家服务,已经和世界上一些繁忙网站合做来调优Nginx以达到最大限度的性能,而且能够对任何须要充分发挥系统能力的客户提供支持。服务器

简介

这里假定读者对Nginx架构和配置概念有个基本了解。本文不会重复Nginx文档的内容,而是概述各类配置选项并提供相关文档连接。网络

调优时,有一条较好的准则是,一次只改一个配置项,若是改后没有性能上的提高,就退回为原先的值。架构

咱们先讨论Linux调优,由于有些值会影响在Nginx配置中能够用的值。app

Linux配置

现代Linux内核(2.6+)可以很好的调节各类配置,有些配置您可能想更改。若是操做系统配置过低,那么会在内核日志中看到错误信息,所以须要调节这些配置。Linux配置项不少,本文只说起那些在普通工做负载下最可能须要调优的配置项。若是须要这些配置的详细信息,请参考Linux文档。负载均衡

Backlog队列

如下设置与链接及其如何排队直接相关。若是传入的链接率很高而性能水平良莠不齐,好比一些链接彷佛被暂停了,那么更改这些配置可能会有用。运维

  • net.core.somaxconn 该项设置等待被Nginx接受的链接的排队大小。因为Nginx接受链接速度很是快,这个值一般不须要很是大,可是默认值是很是低的,因此若是你有一个高流量网站,增长这个值是个好主意。若是设置太低,那么你能在内核日志中看到错误信息,这时你应该增长这个值直到没有错误信息。注意:若是你将其设置为大于512的值,你应该同时用listen指令的backlog参数匹配这个值来更改Nginx的配置。

  • net.core.netdev_max_backlog 该项设置在交由CPU处理以前网卡缓冲数据包的速率。对于拥有高带宽的机器,这个值可能须要增长。查看网卡文档寻求相关建议,或者检查内核日志相关错误信息。

文件描述符

文件描述符是一种操做系统资源,用来处理诸如链接和打开文件的事情。对每个链接,Nginx能够用上多达两个文件描述符。例如,若是Nginx用做代理,则其中一个用于客户端链接,另外一个用于链接到被代理的服务器。若是使用了HTTP keepalive,则链接描述符的使用会少得多。对于有大量链接的系统,以下设置可能须要进行调整:

  • sys.fs.file_max 这是系统范围内的文件描述符限制。

  • nofile 这是用户级别的文件描述符限制,在/etc/security/limits.conf文件中配置

临时端口

当Nginx被看成代理使用时,每个到upstream服务器的链接都使用一个临时端口。

  • net.ipv4.ip_local_port_range 这个用来指定可使用的起止端口号。若是你看到端口耗尽,你能够增长这个范围。常见的设置为1024到65000。

  • net.ipv4.tcp_fin_timeout 这个用于指定一个再也不被使用的端口多久以后能够被另外一链接再次使用。一般,这个值默认为60秒,可是能够安全地减小到30甚至15秒。

Nginx配置

下面是一些可能影响性能的Nginx指令。如前所述,咱们仅讨论那些推荐大多数用户调整的指令。这里未说起到的任何指令,若是没有Nginx团队的指导,不推荐更改。

工做进程

Nginx能够运行多个工做进程,每一个都能处理大量链接。你能够用以下指令控制工做进程个数以及链接如何被处理:

  • worker_processes 这个控制Nginx运行的工做进程个数。大多数状况下,一个CPU核心跑一个工做进程可以工做得很好。能够将该指令设为auto来达到与CPU核心数匹配的工做进程数。有时候,能够增长这个值,好比工做进程须要处理大量磁盘IO操做的时候。这个值默认为1。

  • worker_connections 这个表示每一个工做进程同时可以处理的最大链接数。默认值是512,可是大多数系统能处理更大的值。这个值该设为多少取决于服务器硬件配置以及流量的特性,能够经过测试来发现。

Keepalives

持久链接能够减小打开和关闭链接所须要的CPU和网络开销,于是对性能有重大影响。Nginx终止全部客户端链接,并具备到upstream服务器的单独链接。Nginx支持客户端和upstream服务器的持久链接。以下指令涉及客户端持久链接:

  • keepalive_requests 这表示客户端能在单个持久链接上发送多少请求。默认值是100,能够设置成更高的值,这在负载生成器从单个客户端发送大量请求的测试场景中很是有用。

  • keepalive_timeout 表示一个空闲持久链接保持打开状态多长时间。

以下指令涉及upstream持久链接:

  • keepalive 这个指定每一个工做进程链接到upstream服务器的空闲持久链接数量。这个指令没有默认值。

为了启用到upstream的持久链接,须要增长以下指令:

  • proxy_http_version 1.1;

  • proxy_set_header Connection "";

Access日志

记录每一个请求须要花费CPU和IO周期,减小这种影响的一种方法是启用access日志缓冲。这将致使Nginx缓冲一系列日志条目,而后一次性写入文件而不是单个单个写入。

经过指定access_log指令的"buffer=size"选项能够打开access日志缓冲,该设置指定要使用的缓冲区的大小。你还可使用"flush=time"选项告诉Nginx多长时间后把缓冲区中的条目写入文件。

定义了这两个选项后,当缓冲区放不下下一条日志,或者缓冲区中的条目超过了flush参数指定的时间,Nginx会将缓冲区中的条目写入日志文件。当工做进程从新打开日志文件或者关闭时,缓冲区中的条目也会被写入文件。也能够彻底禁用access日志记录。

Sendfile

Sendfile是一个操做系统特性,能够在Nginx上启用。它经过在内核中从一个文件描述符向另外一个文件描述符复制数据,每每能达到零拷贝,于是能够提供更快的TCP数据传输。Nginx可使用该机制将缓存或者磁盘上的内容写到socket,无需从内核空间到用户空间的上下文切换,于是很是快而且使用较少的CPU开销。因为数据永远不会触及用户空间,因此不可能把须要访问数据的过滤器插入处处理链中,不能使用任何须要改变内容的Nginx过滤器,好比gzip过滤器。Nginx默认没有启用该机制。

限制

Nginx和Nginx Plus容许设置各类限制,用来控制客户端资源消耗,以防影响系统性能以及用户体验和安全。如下是一些相关指令:

  • limit_conn / limit_conn_zone 这些指令能够用来限制Nginx容许的链接数,好比来自单个客户端IP地址的链接数。这能够防止单个客户端打开太多链接而消耗太多资源。

  • limit_rate 这个用来限制客户端在单个链接上容许使用的带宽。这能够防止某些客户端致使系统超载,于是有利于为全部客户端提供QoS保证。

  • limit_req / limit_req_zone 这些指令能够用来限制Nginx的请求处理速率。与limit_rate一块儿,能够防止某些客户端致使系统超载,于是有利于为全部客户端提供QoS保证。这些指令也能够用来加强安全性,尤为是对登陆页面,经过限制请求速率,使得其对人类用户是合适的,而会减慢试图访问你的应用的程序。

  • max_conns 这个用来限制同时链接到upstream组中单个服务器的最大链接数。这能够防止upstream服务器超载。默认值是0,表示没有限制。

  • queue 若是设置了max_conns,那么queue指令用来决定当一个请求因为upstream组中没有可用服务器或者这些服务器达到max_conns限制而不能获得处理时会发生什么。这个指令用来设定有多少请求将会排队以及排多久。若是没有设置这个指令,就不会有排队行为。

其它考虑

Nginx还有一些特性能够用来提升web应用的性能。这些特性不常出如今调优讨论中,可是有必要一提,由于它们的影响也可能比较可观。咱们将讨论这些特性中的两个。

缓存

对于一个为一组web服务器或者应用服务器做负载均衡的Nginx实例来讲,启用缓存能够显著地下降响应时间,同时能显著减轻后端服务器的负载。缓存自己就是一个主题,这里不会讨论。Nginx缓存配置的更多信息请参考:Nginx管理指南 - 缓存http://t.cn/RKQL8ys

压缩

压缩响应能够大大减少响应的大小,减小带宽占用。不过,这须要CPU资源来处理压缩,因此最好在值得减小带宽占用的状况下使用。须要注意的是,不能对已经压缩的东西(好比jpeg图片)再次启用压缩。Nginx压缩配置的更多信息请参考:Nginx管理指南 - 压缩和解压缩 http://t.cn/RKQLoXA



本文转载自简书

连接:http://www.jianshu.com/p/024b33d1a1a1