资讯专栏INFORMATION COLUMN

高并发场景中nginx的优化方案

EsgynChina / 2907人阅读

摘要:本文主要从以下几点讲解如何优化,以增强高并场景中的吞吐量。系统可通过命令查看核数,假如为,则指单个进程能并发处理的最大连接数,包含了所有的链接不仅仅来源于客户端,默认值是,在一些瞬间并发量较高的场景中,这个值是远远不够用的。

本文主要从以下几点讲解如何优化Nginx,以增强高并场景中Nginx的吞吐量。

调整worker_processes和worker_connections参数

关闭access.log日志打印

使用Gzip压缩

缓存静态文件

TCP Fast Open

Nginx的优化主要是基于nginx.conf文件中的属性做修改,所以比较简单,但是由于服务器配置、环境以及所承载的服务的不同,导致配置的属性参数并不一定要按照本文中所给的做修改,最好的建议是根据自己服务器的情况,逐一修改参数并做测试。

优化Nginx之前,请确保备份了nginx.conf文件。

1. 调整worker_processes和worker_connections
worker_processes和worker_connections的优化,是为了确保nginx同一时间最大连接数达到最优
1) worker_processes

worker_processes指Nginx的工作进程,这个值是直接受到服务器CPU核数量影响的(当然也有其他影响),Nginx默认配置为auto,意思是会自动检测CPU核做修改,建议worker_processes的值直接修改为CPU的核数。

Linux系统可通过命令lscpu查看cpu核数,假如为4,则:worker_processes: 4

2) worker_connections

worker_connections指单个进程能并发处理的最大连接数,包含了所有的Nginx链接(不仅仅来源于web客户端),默认值是
768,在一些(瞬间)并发量较高的场景中,这个值是远远不够用的。

Nginx官方示例中给定单个进程的worker_connections设置是1024,可以根据worker_processes的值做调整。
即:worker_connections = worker_processes * 1024

建议按照服务器的实际情况来调整worker_connections的值。

3) worker_rlimit_nofile、use epoll、multi_accept on

除了worker_processes和worker_connections,还需要关注以下几个概念:

worker_rlimit_nofile

use epoll

multi_accept on

worker_rlimit_nofile: 代表worker进程的最大打开文件数限制。如果没设置的话,这个值为操作系统的限制。设置后你的操作系统和Nginx可以处理比“ulimit -a”更多的文件,所以把这个值设高,这样Nginx就不会有“too many open files”问题了
use epoll: use指Nginx的链接处理方式,Linux服务器可以配置为epoll,其他参数的使用可参看链接
multi_accept on: 告诉Nginx收到一个新连接通知后接受尽可能多的连接

其中,worker_rlimit_nofile默认值是2000,可以将这个值增大到worker_processes*worker_connections,具体可更根据服务器情况调整,但是要注意worker_connections的值不能超过worker_rlimit_nofile

参考示例:

...
worker_processes 4;
worker_rlimit_nofile 16384;
...
events {
    use epoll;
    multi_accept on;
    worker_connections 4096;
}
...
2. 关闭access.log日志打印

关闭access.log操作比较简单,只需要将对应的代码注释掉,然后添加 access_log off;

参考示例:

# access_log /var/log/nginx/access.log;
access_log off;

假如Nginx只是做代理服务,建议去掉access.log的打印。

3. 使用Gzip压缩

Nginx的Gzip模块提供了对http传输数据(诸如:文本、json、js、css、xml等)的压缩,默认配置中gzip是关闭了的,开启需要去掉Gzip压缩命令的注释即可。

参考示例:

gzip on;
gzip_min_length 1024;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/json application/xml;
gzip_disable msie6;

gzip_min_length: gzip压缩的http响应的最小长度。通过读取Content-Length中数值判断是否需要被压缩,建议设置为1k以上,小于1k的数据可能会越压越大
gzip_proxied: Nginx作为反向代理的时候使用,具体用法可以直接使用官方默认的配置。
gzip_types: 压缩数据类型,可以根据自己的服务删减
gzip_disable: 为指定的客户端禁用gzip功能。可以设置成IE6或者更低版本以使我们的方案能够广泛兼容。

更多Gzip设置可以参考链接

4. 缓存静态文件

PC互联网时代,很多站长都会选择生成静态网页存放到服务器对应路径的方式来组织自己的网站,很多内容诸如html、js、css、图片文件,很长时间才会更新一次,那么考虑使用Nginx缓存或者CDN缓存是一个很好的方式,可以大幅度降低网络带宽的请求。

Nginx文件缓存,主要是针对/etc/nginx/sites-enabled文件夹下的host文件修改。

参考示例:

location ~*  .(jpg|jpeg|png|gif|ico|css|js)$ {
   expires 365d;
}

以上示例,针对图片、css、js做365天的缓存,更多用法可以参考链接

5. TCP Fast Open

TCP Fast Open(简称:TFO)是TCP的一个扩展,TCP三次握手的第一步,发送方会向接收方发送一个SYN包,而TCP Fast Ope所做的事情就是在SYN包里增加TFO cookie,来验证之前连接过的客户端,从而达到在三次握手最终的ACK包收到之前就开始发送数据。

具体配置可参看https://www.keycdn.com/support/tcp-fast-open/

参考文章:

http://blog.51cto.com/liuqunying/1420556

http://nginx.org/en/docs/ngx_core_module.html

http://nginx.org/en/docs/events.html

http://nginx.org/en/docs/http/ngx_http_gzip_module.html

https://blog.csdn.net/jessonlv/article/details/8016284

https://www.oschina.net/translate/nginx-setup

https://serversforhackers.com/c/nginx-caching

https://www.keycdn.com/support/tcp-fast-open/

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/40134.html

相关文章

  • 并发

    摘要:表示的是两个,当其中任意一个计算完并发编程之是线程安全并且高效的,在并发编程中经常可见它的使用,在开始分析它的高并发实现机制前,先讲讲废话,看看它是如何被引入的。电商秒杀和抢购,是两个比较典型的互联网高并发场景。 干货:深度剖析分布式搜索引擎设计 分布式,高可用,和机器学习一样,最近几年被提及得最多的名词,听名字多牛逼,来,我们一步一步来击破前两个名词,今天我们首先来说说分布式。 探究...

    supernavy 评论0 收藏0
  • 并发

    摘要:表示的是两个,当其中任意一个计算完并发编程之是线程安全并且高效的,在并发编程中经常可见它的使用,在开始分析它的高并发实现机制前,先讲讲废话,看看它是如何被引入的。电商秒杀和抢购,是两个比较典型的互联网高并发场景。 干货:深度剖析分布式搜索引擎设计 分布式,高可用,和机器学习一样,最近几年被提及得最多的名词,听名字多牛逼,来,我们一步一步来击破前两个名词,今天我们首先来说说分布式。 探究...

    ddongjian0000 评论0 收藏0
  • 并发

    摘要:表示的是两个,当其中任意一个计算完并发编程之是线程安全并且高效的,在并发编程中经常可见它的使用,在开始分析它的高并发实现机制前,先讲讲废话,看看它是如何被引入的。电商秒杀和抢购,是两个比较典型的互联网高并发场景。 干货:深度剖析分布式搜索引擎设计 分布式,高可用,和机器学习一样,最近几年被提及得最多的名词,听名字多牛逼,来,我们一步一步来击破前两个名词,今天我们首先来说说分布式。 探究...

    wangdai 评论0 收藏0
  • 并发 - 收藏集 - 掘金

    摘要:在中一般来说通过来创建所需要的线程池,如高并发原理初探后端掘金阅前热身为了更加形象的说明同步异步阻塞非阻塞,我们以小明去买奶茶为例。 AbstractQueuedSynchronizer 超详细原理解析 - 后端 - 掘金今天我们来研究学习一下AbstractQueuedSynchronizer类的相关原理,java.util.concurrent包中很多类都依赖于这个类所提供的队列式...

    levius 评论0 收藏0
  • 并发 - 收藏集 - 掘金

    摘要:在中一般来说通过来创建所需要的线程池,如高并发原理初探后端掘金阅前热身为了更加形象的说明同步异步阻塞非阻塞,我们以小明去买奶茶为例。 AbstractQueuedSynchronizer 超详细原理解析 - 后端 - 掘金今天我们来研究学习一下AbstractQueuedSynchronizer类的相关原理,java.util.concurrent包中很多类都依赖于这个类所提供的队列式...

    fantix 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<