浅谈Nginx性能调优

奇技指南nginx

Web服务性能调优是一项系统工程,涵盖许多方面,其中某一环节作的好并不可以保证总体性能好;可是若是某个环节作的很差,那么总体性能必然不会好。缓存

能够调优的配置有不少,绝大多数状况下咱们不须要追求极致的性能,只需把短板补齐,使之可以知足咱们须要就能够了。网络

Linux系统参数优化并发

下文中提到的一些配置,须要较新的Linux(2.6以上)内核才可以支持,笔者使用的CentOS 7.4,内核版本3.10,若是不知足须要的话,最好进行相应的升级,毕竟打补丁是件费力不讨好的事情。对于系统层面的调优,一般咱们修改文件描述符限制、缓冲区队列长度以及临时端口数量就能够了。tcp

文件描述符限制ide

因为每一个TCP链接都要占用一个文件描述符,一旦文件描述符耗尽,新的链接到来就会返回“Too many open files”这样的错误,为了提升性能,咱们须要对其进行修改:性能

系统层级的限制 编辑文件 /etc/sysctl.conf,添加以下内容:优化

fs.file-max = 10000000fs.nr_open = 10000000fs.file-max = 10000000fs.nr_open = 10000000

用户层级的限制 编辑文件 /etc/security/limits.conf,添加如下内容:
this

*hard   nofile      1000000*soft   nofile      1000000*hard   nofile      1000000*soft   nofile      1000000

这里咱们只要保证用户层级限制不大于系统层级限制就能够了,不然可能会出现没法经过SSH登陆系统的问题。修改完毕执行以下命令:spa

$ sysctl -p$ sysctl -p

能够经过执行命令 ulimit -a查看是否修改为功。

TCP链接队列长度

编辑文件 /etc/sysctl.conf,添加以下内容:

# The length of the syn quenenet.ipv4.tcp_max_syn_backlog = 65535# The length of the tcp accept queuenet.core.somaxconn = 65535# The length of the syn quenenet.ipv4.tcp_max_syn_backlog = 65535# The length of the tcp accept queuenet.core.somaxconn = 65535

其中tcp_max_syn_backlog用于指定半链接SYN队列长度,当新链接到来时,系统会检测半链接SYN队列,若是队列已满,则没法处理该SYN请求,并在 /proc/net/netstat中的 ListenOverflowsListenDrops中增长统计计数

somaxconn用于指定全链接ACCEPT队列长度,当该队列满了之后,客户端发送的ACK包将没法被正确处理,并返回错误"connection reset by peer"

Nginx则会记录一条error日志

"no live upstreams while connecting to upstreams"

若是出现以上错误,咱们须要考虑增大这两项的配置。

临时端口

因为Nginx用做代理,每一个到上游Web服务的TCP链接都要占用一个临时端口,所以咱们须要修改ip_local_port_range参数 

修改 /etc/sysctl.conf文件,添加以下内容:

net.ipv4.ip_local_port_range = 1024 65535net.ipv4.ip_local_reserved_ports = 8080,8081,9000-9010net.ipv4.ip_local_port_range = 1024 65535net.ipv4.ip_local_reserved_ports = 8080,8081,9000-9010

其中,参数 ip_local_reserved_ports用于指定保留端口,这是为了防止服务端口被占用而没法启动。

Nginx参数优化

Nginx参数优化主要围绕 nginx.conf这个配置文件展开,下文再也不赘述。

工做进程

Nginx性能强大的一个重要缘由在于它采用多进程非阻塞I/O模型,所以咱们要妥善利用这一点:

  • worker_processes  默认的Nginx只有一个master进程一个worker进程,咱们须要对其进行修改,能够设置为指定的个数,也能够设置为 auto,即系统的CPU核数。更多的worker数量将致使进程间竞争cpu资源,从而带来没必要要的上下文切换。所以这里咱们将它设置为cpu的核数便可:    worker_processes   auto

  • worker_connections每一个worker能够处理的并发链接数,默认值512不是很够用,咱们适当将它增大:    worker_connections 4096

  • Nginx支持如下I/O复用方法处理链接:selectpollkqueueepollrtsig/dev/polleventport。它们分别适用于不一样的操做系统,其中 epoll是Linux系统上面效率最高的:   use epoll

KeepAlive

为了不从Nginx到Web服务频繁的创建、断开链接,咱们能够启用从HTTP 1.1开始支持的KeepAlive长链接特性,它能够大幅减小CPU和网络开销,在咱们的实战中也是对性能提升最大的一环。keepalive必须和 proxy_http_versionproxy_set_header结合使用, 参考配置以下:

upstream BACKEND {    keepalive 300;    server 127.0.0.1:8081;}server {    listen 8080;    location / {        proxy_pass http://BACKEND;        proxy_http_version 1.1;        proxy_set_header Connection"";    }}upstream BACKEND {    keepalive 300;    server 127.0.0.1:8081;}server {    listen 8080;    location / {        proxy_pass http://BACKEND;        proxy_http_version 1.1;        proxy_set_header Connection"";    }}

其中 keepalive既非timeout,也不是链接池数量,官方解释以下:

The connections parameter sets the maximum number of idle keepalive connections to upstream servers that are preserved in the cache of each worker process. When this number is exceeded, the least recently used connections are closed.The connections parameter sets the maximum number of idle keepalive connections to upstream servers that are preserved in the cache of each worker process. When this number is exceeded, the least recently used connections are closed.

能够看出它的意思是“最大空闲长链接数量”,超出这个数量的空闲长链接将被回收,当请求数量稳定而平滑时,空闲长链接数量将会很是小(接近于0),而现实中请求数量是不可能一直平滑而稳定的,当请求数量有波动时,空闲长链接数量也随之波动:

  • 当空闲长链接数量大于配置值时,将会致使大于配置值的那部分长链接被回收;

  • 当长链接不够用时,将会从新创建新的长链接。

所以,若是这个值太小的话,就会致使链接池频繁的回收、分配、再回收。

为了不这种状况出现,能够根据实际状况适当调整这个值,在咱们实际状况中,目标QPS为6000,Web服务响应时间约为200ms,所以须要约1200个长链接,而 keepalive值取长链接数量的10%~30%就能够了,这里咱们取300,若是不想计算,直接设为1000也是可行的。

Access-Log缓存

记录日志的I/O开销比较高,好在Nginx支持日志缓存,咱们能够利用这个功能,下降写日志文件的频率,从而提升性能。能够将 bufferflush两个参数结合使用来控制缓存行为:

access_log /var/logs/nginx-access.log buffer=64k gzip flush=1maccess_log /var/logs/nginx-access.log buffer=64k gzip flush=1m

其中 buffer制定了缓存大小,当缓冲区达到 buffer所指定的大小时,Nginx就会将缓存起来的日志写到文件中;flush指定了缓存超时时间,当 flush指定的时间到达时,也会触发缓存日志写入文件操做

文件描述符限制

上一节中已经对Linux系统的文件描述符限制进行了修改,Nginx配置中一样有相应的配置项:worker_rlimit_nofile理论上这个值应该设置为 /etc/security/limits.conf中的值除以worker_processes,但实际中不可能每一个进程均匀分配,因此这里只要设置成和/etc/security/limits.conf同样就能够了

worker_rlimit_nofile 1000000worker_rlimit_nofile 1000000

总结

以上就是笔者进行Nginx调优的一些经验,能够看出基本是围绕Nginx的Error日志展开的,以后又对一些比较大的性能瓶颈进行了一些改进。Nginx可以优化的地方很是多,本文只涉及到了其中很小的一些方面,但也足够知足咱们的使用场景了。

关注咱们

界世的你当不

只作你的肩膀

 360官方技术公众号 

技术干货|一手资讯|精彩活动

空·