分享 11 个常用的 Nginx 性能优化参数工作

打印 上一主题 下一主题

主题 564|帖子 564|积分 1692

原文链接:分享 11 个常用的 Nginx 性能优化参数工作-腾讯云开发者社区-腾讯云
分享 11 个常用的 Nginx 性能优化参数教程


工作上,需要配置 Nginx,要投入生产利用,做了一点优化工作,加上从前也常常折腾 Nginx,故记下一些优化工作。
优化 Nginx 进程数目

配置参数如下:
代码语言:javascript
复制
  1. worker_processes 1; # 指定 Nginx 要开启的进程数,结尾的数字就是进程的个数,可以为 auto
复制代码
这个参数调整的是 Nginx 服务的 worker 进程数,Nginx 有 Master 进程和 worker 进程之分,Master 为管理进程、真正欢迎“顾客”的是 worker 进程。
进程个数的策略:worker 进程数可以设置为便是 CPU 的核数。高流量高并发场合也可以思量将进程数进步至 CPU 核数 x 2。这个参数除了要和 CPU 核数匹配之外,也与硬盘存储的数据及体系的负载有关,设置为 CPU 核数是个好的起始配置,也是官方发起的。
当然,如果想省贫苦也可以配置为worker_processes auto;,将由 Nginx 自行决定 worker 数目。当访问量快速增加时,Nginx 就会暂时 fork 新进程来收缩体系的瞬时开销和低落服务的时间。
将差别的进程绑定到差别的CPU

默认环境下,Nginx 的多个进程有可能运行在同一个 CPU 核上,导致 Nginx 进程利用硬件的资源不均,这就需要制定进程分配到指定的 CPU 核上处理,到达充分有用利用硬件的目的。配置参数如下:
代码语言:javascript
复制
  1. worker_processes 4;
  2. worker_cpu_affinity 0001 0010 0100 1000;
复制代码
此中 workercpuaffinity 就是配置 Nginx 进程与 CPU 亲和力的参数,即把差别的进程分给差别的 CPU 核处理。这里的0001 0010 0100 1000是掩码,分别代表第1、2、3、4核CPU。上述配置会为每个进程分配一核CPU处理。
当然,如果想省贫苦也可以配置workercpuaffinity auto;,将由 Nginx 按需自动分配。
Nginx 事件处理模型优化

Nginx 的毗连处理机制在差别的操作体系中会采用差别的 I/O 模型,在 linux 下,Nginx 利用 epoll 的 I/O 多路复用模型,在 Freebsd 中利用 kqueue 的 I/O 多路复用模型,在 Solaris 中利用 /dev/poll 方式的 I/O 多路复用模型,在 Windows 中利用 icop,等等。
配置如下:
代码语言:javascript
复制
  1. events {
  2.   use epoll;
  3. }
复制代码
events 指令是设定 Nginx 的工作模式及毗连数上限。use指令用来指定 Nginx 的工作模式。Nginx 支持的工作模式有 select、 poll、 kqueue、 epoll 、 rtsig 和/ dev/poll。当然,也可以不指定事件处理模型,Nginx 会自动选择最佳的事件处理模型。
单个进程允许的客户端最大毗连数

通过调整控制毗连数的参数来调整 Nginx 单个进程允许的客户端最大毗连数。
代码语言:javascript
复制
  1. events {
  2.   worker_connections 20480;
  3. }
复制代码
worker_connections 也是个事件模块指令,用于界说 Nginx 每个进程的最大毗连数,默认是 1024。
最大毗连数的盘算公式如下:
maxclients = workerprocesses * worker_connections;
如果作为反向署理,因为浏览器默认会开启 2 个毗连到 server,而且 Nginx 还会利用fds(file descriptor)从同一个毗连池建立毗连到 upstream 后端。则最大毗连数的盘算公式如下:
maxclients = workerprocesses * worker_connections / 4;
别的,进程的最大毗连数受 Linux 体系进程的最大打开文件数限定,在实行操作体系命令 ulimit -HSn 65535或配置相应文件后, worker_connections 的设置才华生效。
配置获取更多毗连数

默认环境下,Nginx 进程只会在一个时刻接收一个新的毗连,我们可以配置multi_accept 为 on,实如今一个时刻内可以接收多个新的毗连,进步处理效率。该参数默认是 off,发起开启。
代码语言:javascript
复制
  1. events {
  2.   multi_accept on;
  3. }
复制代码
配置 worker 进程的最大打开文件数

调整配置 Nginx worker 进程的最大打开文件数,这个控制毗连数的参数为 workerrlimitnofile。该参数的实际配置如下:
代码语言:javascript
复制
  1. worker_rlimit_nofile 65535;
复制代码
可设置为体系优化后的 ulimit -HSn 的效果
优化域名的散列表巨细

代码语言:javascript
复制
  1. http {
  2.   server_names_hash_bucket_size 128;
  3. }
复制代码
参数作用:设置存放域名( server names)的最大散列表的存储桶( bucket)的巨细。默认值依赖 CPU 的缓存行。
servernameshashbucketsize 的值是不能带单位 的。配置主机时必须设置该值,否则无法运行 Nginx,大概无法通过测试 。该设置与 server_ nameshashmaxsize 共同控制保存服务器名的 hash 表, hash bucket size 总是便是 hash 表的巨细, 并且是一路处理器缓存巨细的倍数。若 hash bucket size 便是一路处理器缓存的巨细,那么在查找键时, 最坏的环境下在内存中查找的次数为 2。第一次是确定存储单位的地址,第二次是在存储单位中查找键值 。若报 出 hash max size 或 hash bucket size 的提示,则需要增加 servernameshashmax size 的值。
TCP 优化

代码语言:javascript
复制
  1. http {
  2.   sendfile on;
  3.   tcp_nopush on;
  4.   keepalive_timeout 120;
  5.   tcp_nodelay on;
  6. }
复制代码
第一行的 sendfile 配置可以进步 Nginx 静态资源托管效率。sendfile 是一个体系调用,直接在内核空间完成文件发送,不需要先 read 再 write,没有上下文切换开销。
TCPNOPUSH 是 FreeBSD 的一个 socket 选项,对应 Linux 的 TCPCORK,Nginx 里统一用 tcp_nopush 来控制它,并且只有在启用了 sendfile 之后才生效。启用它之后,数据包会累计到一定巨细之后才会发送,减小了额外开销,进步网络效率。
TCPNODELAY 也是一个 socket 选项,启用后会禁用 Nagle 算法,尽快发送数据,某些环境下可以节省 200ms(Nagle 算法原理是:在发出去的数据还未被确认之前,新生成的小数据先存起来,凑满一个 MSS 大概等到收到确认后再发送)。Nginx 只会针对处于 keep-alive 状态的 TCP 毗连才会启用 tcpnodelay。
优化毗连参数

代码语言:javascript
复制
  1. http {
  2.   client_header_buffer_size 32k;
  3.   large_client_header_buffers 4 32k;
  4.   client_max_body_size 1024m;
  5.   client_body_buffer_size 10m;
  6. }
复制代码
这部分更多是更具业务场景来决定的。比方clientmaxbody_size用来决定哀求体的巨细,用来限定上传文件的巨细。上面列出的参数可以作为起始参数。
配置压缩优化

1、Gzip 压缩
我们在上线前,代码(JS、CSS 和 HTML)会做压缩,图片也会做压缩(PNGOUT、Pngcrush、JpegOptim、Gifsicle 等)。对于文本文件,在服务端发送响应之前进行 GZip 压缩也很紧张,通常压缩后的文本巨细会减小到原来的 1/4 - 1/3。
代码语言:javascript
复制
  1. http {
  2.   gzip on;
  3.   gzip_buffers 16 8k;
  4.   gzip_comp_level 6;
  5.   gzip_http_version 1.0;
  6.   gzip_min_length 1000;
  7.   gzip_proxied any;
  8.   gzip_vary on;
  9.   gzip_types
  10.     text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
  11.     text/javascript application/javascript application/x-javascript
  12.     text/x-json application/json application/x-web-app-manifest+json
  13.     text/css text/plain text/x-component
  14.     font/opentype application/x-font-ttf application/vnd.ms-fontobject
  15.     image/x-icon;
  16.   gzip_disable "MSIE [1-6]\.(?!.*SV1)";
  17. }
复制代码
这部分内容比力简单,只有两个地方需要解释下:
gzip_vary 用来输出 Vary 响应头,用来解决某些缓存服务的一个题目,详情请看我之前的博客:HTTP 协议中 Vary 的一些研究。
gzip_disable 指令担当一个正则表达式,当哀求头中的 UserAgent 字段满足这个正则时,响应不会启用 GZip,这是为了解决在某些浏览器启用 GZip 带来的题目。
默认 Nginx 只会针对 HTTP/1.1 及以上的哀求才会启用 GZip,因为部分早期的 HTTP/1.0 客户端在处理 GZip 时有 Bug。如今基本上可以忽略这种环境,于是可以指定 gziphttpversion 1.0 来针对 HTTP/1.0 及以上的哀求开启 GZip。
2、Brotli 压缩
Brotli 是基于LZ77算法的一个现代变体、霍夫曼编码和二阶上下文建模。Google软件工程师在2015年9月发布了包含通用无损数据压缩的Brotli增强版本,特殊偏重于HTTP压缩。此中的编码器被部分改写以进步压缩比,编码器息争码器都进步了速率,流式API已被改进,增加更多压缩质量级别。
需要安装libbrotli 、ngxbrotli ,重新编译 Nginx 时,带上--add-module=/path/to/ngxbrotli即可,然后配置如下
代码语言:javascript
复制
  1. http {
  2.   brotli on;
  3.   brotli_comp_level 6;
  4.   brotli_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml;
  5. }
复制代码
Brotli 可与 Gzip 共存在一个配置文件中
静态资源优化

静态资源优化,可以减少毗连哀求数,同时也不需要对这些资源哀求打印日记。但副作用是资源更新可能无法及时。
代码语言:javascript
复制
  1. server {
  2.     # 图片、视频
  3.     location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
  4.       expires 30d;
  5.       access_log off;
  6.     }
  7.     # 字体
  8.     location ~ .*\.(eot|ttf|otf|woff|svg)$ {
  9.       expires 30d;
  10.       access_log off;
  11.     }
  12.     # js、css
  13.     location ~ .*\.(js|css)?$ {
  14.       expires 7d;
  15.       access_log off;
  16.     }
  17. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

卖不甜枣

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表