11 个 Nginx 参数性能优化工作

工作上,需要配置 Nginx,要投入生产使用,做了一点优化工作,加上以前也经常折腾 Nginx,故记下一些优化工作。

优化 Nginx 进程数量

配置参数如下:

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 核上处理,达到充分有效利用硬件的目的。配置参数如下:

worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;

其中 worker_cpu_affinity 就是配置 Nginx 进程与 CPU 亲和力的参数,即把不同的进程分给不同的 CPU 核处理。这里的0001 0010 0100 1000是掩码,分别代表第1、2、3、4核CPU。上述配置会为每个进程分配一核CPU处理。

当然,如果想省麻烦也可以配置worker_cpu_affinity auto;,将由 Nginx 按需自动分配。

Nginx 事件处理模型优化

Nginx 的连接处理机制在不同的操作系统中会采用不同的 I/O 模型,在 linux 下,Nginx 使用 epoll 的 I/O 多路复用模型,在 Freebsd 中使用 kqueue 的 I/O 多路复用模型,在 Solaris 中使用 /dev/poll 方式的 I/O 多路复用模型,在 Windows 中使用 icop,等等。

配置如下:

events {use epoll;
}

events 指令是设定 Nginx 的工作模式及连接数上限。use指令用来指定 Nginx 的工作模式。Nginx 支持的工作模式有 select、 poll、 kqueue、 epoll 、 rtsig 和/ dev/poll。当然,也可以不指定事件处理模型,Nginx 会自动选择最佳的事件处理模型。

单个进程允许的客户端最大连接数

通过调整控制连接数的参数来调整 Nginx 单个进程允许的客户端最大连接数。

events {worker_connections 20480;
}

worker_connections 也是个事件模块指令,用于定义 Nginx 每个进程的最大连接数,默认是 1024。

最大连接数的计算公式如下:

max_clients = worker_processes * worker_connections;

如果作为反向代理,因为浏览器默认会开启 2 个连接到 server,而且 Nginx 还会使用fds(file descriptor)从同一个连接池建立连接到 upstream 后端。则最大连接数的计算公式如下:

max_clients = worker_processes * worker_connections / 4;

另外,进程的最大连接数受 Linux 系统进程的最大打开文件数限制,在执行操作系统命令 ulimit -HSn 65535或配置相应文件后, worker_connections 的设置才能生效。

配置获取更多连接数

默认情况下,Nginx 进程只会在一个时刻接收一个新的连接,我们可以配置multi_accepton,实现在一个时刻内可以接收多个新的连接,提高处理效率。该参数默认是 off,建议开启。

events {multi_accept on;
}

配置 worker 进程的最大打开文件数

调整配置 Nginx worker 进程的最大打开文件数,这个控制连接数的参数为 worker_rlimit_nofile。该参数的实际配置如下:

worker_rlimit_nofile 65535;

可设置为系统优化后的 ulimit -HSn 的结果

优化域名的散列表大小

http {server_names_hash_bucket_size 128;
}

参数作用:设置存放域名( server names)的最大散列表的存储桶( bucket)的大小。 默认值依赖 CPU 的缓存行。

server_names_hash_bucket_size 的值是不能带单位 的。配置主机时必须设置该值,否则无法运行 Nginx,或者无法通过测试 。 该设置与 server_ names_hash_max_size 共同控制保存服务器名的 hash 表, hash bucket size 总是等于 hash 表的大小, 并且是一路处理器缓存大小的倍数。若 hash bucket size 等于一路处理器缓存的大小,那么在查找键时, 最坏的情况下在内存中查找的次数为 2。第一次是确定存储单元的地址,第二次是在存储单元中查找键值 。 若报 出 hash max size 或 hash bucket size 的提示,则需要增加 server_names_hash_max size 的值。

TCP 优化

http {sendfile on;tcp_nopush on;keepalive_timeout 120;tcp_nodelay on;
}

第一行的 sendfile 配置可以提高 Nginx 静态资源托管效率。sendfile 是一个系统调用,直接在内核空间完成文件发送,不需要先 read 再 write,没有上下文切换开销。

TCP_NOPUSH 是 FreeBSD 的一个 socket 选项,对应 Linux 的 TCP_CORK,Nginx 里统一用 tcp_nopush 来控制它,并且只有在启用了 sendfile 之后才生效。启用它之后,数据包会累计到一定大小之后才会发送,减小了额外开销,提高网络效率。

TCP_NODELAY 也是一个 socket 选项,启用后会禁用 Nagle 算法,尽快发送数据,某些情况下可以节约 200ms(Nagle 算法原理是:在发出去的数据还未被确认之前,新生成的小数据先存起来,凑满一个 MSS 或者等到收到确认后再发送)。Nginx 只会针对处于 keep-alive 状态的 TCP 连接才会启用 tcp_nodelay

优化连接参数

http {client_header_buffer_size 32k;large_client_header_buffers 4 32k;client_max_body_size 1024m;client_body_buffer_size 10m;
}

这部分更多是更具业务场景来决定的。例如client_max_body_size用来决定请求体的大小,用来限制上传文件的大小。上面列出的参数可以作为起始参数。

配置压缩优化

9.1、Gzip 压缩

我们在上线前,代码(JS、CSS 和 HTML)会做压缩,图片也会做压缩(PNGOUT、Pngcrush、JpegOptim、Gifsicle 等)。对于文本文件,在服务端发送响应之前进行 GZip 压缩也很重要,通常压缩后的文本大小会减小到原来的 1/4 - 1/3。

http {gzip on;gzip_buffers 16 8k;gzip_comp_level 6;gzip_http_version 1.0;gzip_min_length 1000;gzip_proxied any;gzip_vary on;gzip_typestext/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xmltext/javascript application/javascript application/x-javascripttext/x-json application/json application/x-web-app-manifest+jsontext/css text/plain text/x-componentfont/opentype application/x-font-ttf application/vnd.ms-fontobjectimage/x-icon;gzip_disable "MSIE [1-6]\.(?!.*SV1)";
}

这部分内容比较简单,只有两个地方需要解释下:

gzip_vary 用来输出 Vary 响应头,用来解决某些缓存服务的一个问题,详情请看我之前的博客:HTTP 协议中 Vary 的一些研究。

gzip_disable 指令接受一个正则表达式,当请求头中的 UserAgent 字段满足这个正则时,响应不会启用 GZip,这是为了解决在某些浏览器启用 GZip 带来的问题。

默认 Nginx 只会针对 HTTP/1.1 及以上的请求才会启用 GZip,因为部分早期的 HTTP/1.0 客户端在处理 GZip 时有 Bug。现在基本上可以忽略这种情况,于是可以指定 gzip_http_version 1.0 来针对 HTTP/1.0 及以上的请求开启 GZip。

9.2、Brotli 压缩

Brotli 是基于LZ77算法的一个现代变体、霍夫曼编码和二阶上下文建模。Google软件工程师在2015年9月发布了包含通用无损数据压缩的Brotli增强版本,特别侧重于HTTP压缩。其中的编码器被部分改写以提高压缩比,编码器和解码器都提高了速度,流式API已被改进,增加更多压缩质量级别。

需要安装libbrotli ngx_brotli ,重新编译 Nginx 时,带上--add-module=/path/to/ngx_brotli即可,然后配置如下

http {brotli on;brotli_comp_level 6;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;
}

Brotli 可与 Gzip 共存在一个配置文件中

静态资源优化

静态资源优化,可以减少连接请求数,同时也不需要对这些资源请求打印日志。但副作用是资源更新可能无法及时。

server {# 图片、视频location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {expires 30d;access_log off;}# 字体location ~ .*\.(eot|ttf|otf|woff|svg)$ {expires 30d;access_log off;}# js、csslocation ~ .*\.(js|css)?$ {expires 7d;access_log off;}
}

收官~

首发于 https://www.linpx.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/280619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Windows 8中将旧控制面板添加到Metro Start屏幕

By default there is no way to easily access the old Control Panel in Windows 8, in order to get to it you have to go through the new Metro Control Panel or switch to Explorer. Here’s how to create your own tile for it. 默认情况下,无法轻松访问Wi…

vue子父组件间传值

父组件传值给子组件 props方式   父组件上1处声明传递的键并赋值,子组件2处使用props接收一下这个键就可以使用了。在父组件改变这个值的话子组件跟着一起响应,子组件改变这个值的话父组件不改变。次为响应式,但是也仅限于父组件的值变化子…

红象云腾发布新一代PB级高速大数据平台产品

ZD至顶网服务器频道 03月23日 新闻消息:在3月19日举办的China Hadoop Summit(中国Hadoop技术峰会)上,中国Hadoop大数据厂商红象云腾与OpenPOWER基金会共同发布红象云腾的新一代大数据产品,帮助企业高速处理PB规模数据。 此次发布…

个人笔记 Vue.js, Framework7, and Cordova / PhoneGap Template with Babel, Webpack and Hot Reloading...

为什么80%的码农都做不了架构师?>>> 模板创建项目 模板地址 更新package.json中的dependencies依赖到最新版本 当新建一个项目的时候,从其他项目的package.json里面copy一份dependencies过来。 但因为是新项目,我们想用各个依赖包…

dotnet-exec 0.12.0 released

dotnet-exec 0.12.0 releasedIntrodotnet-exec 是一个 C# 程序的小工具,可以用来运行一些简单的 C# 程序而无需创建项目文件,让 C# 像 python/nodejs 一样简单,而且可以自定义项目的入口方法,支持但不限于 Main 方法。Install/Upd…

美国用户现在可以下载其所有Apple帐户数据,这是操作方法

Starting today, Apple is allowing all US users to download a copy of every last bit of their data from the company. 从今天开始,Apple允许所有美国用户从该公司下载其数据的最后一部分的副本。 This feature has been available for EU users since May, th…

“互联网+”促传统企业三大转型

2015年是传统行业互联网化的元年。国家提出要制定“互联网”行动计划后,互联网旅游、互联网汽车、互联网三农、互联网物流、互联网医疗等开始起步。同时,面对不确定的移动互联网时代,互联网某些技术和模式还在进化、演变之中,每一…

开发高性能ASP.NET应用

本文是“.NET Conf China 2022”上我的一个分享,这里更细化的分享出来。分享分为四个部分:制定指示设计应用正确测试性能优化高性能:不一定是架构出来的,但一定是优化出来的。制定指标-收集首先把项目中的热路径API和核心API找出来…

Django08-1:模型层(ORM)--聚合查询/分组查询/F与Q查询/开启事务/常用字段及参数/自定义字段/数据库查询优化

聚合查询 单独使用时,用aggregate 1.只要是跟数据库相关的模块 基本都在django.db.models里面 如果没有应该在django.db里面 2. 聚合查询通常配合分组使用 from django.db.models import Avg, Sum, Max, Min, Count# 1.所有书的平均价格 resmodels.Book.objects.…

记事本状态栏不会自动_如何在记事本中同时启用状态栏和自动换行

记事本状态栏不会自动The status bar in Windows’ Notepad displays the current line number and column number of the cursor location. However, if you find that the Status Bar option on the View menu is grayed out, it may be because you have Word Wrap enabled…

极端高温导致澳大利亚断网

西澳大利亚首府珀斯因恶劣天气出现了网络连接问题, 网络故障不是由于暴风雨或闪电引起的,而是极端高温。本周一是珀斯有记录以来第六热的天,当天最高温度达到了44.4℃。因为创纪录的高温,澳大利亚宽带 服务商iiNet在当…

推荐一款采用 .NET 编写的 反编译到源码工具 Reko

今天给大家介绍的是一款名叫Reko的开源反编译工具,该工具采用C#开发,广大研究人员可利用Reko来对机器码进行反编译处理。我们知道.NET 7 有了NativeAOT 的支持,采用NativeAOT 编译的.NET程序 无法通过ILSpy 之类的传统工具得到源码&#xff0…

并行传输数据和串行传输数据_为什么串行数据传输比并行数据传输快?

并行传输数据和串行传输数据SATA hard drive connections are faster than older PATA hard drive connections and the same can be said for external cabling standards, but this is counter-intuitive: why wouldn’t the parallel transmission be faster? SATA硬盘驱动…

微软让卡塔尔世界杯踏入元宇宙

遵守前一篇公众号文章里的承诺,昨天盆盆在视频号里录制了一段5分钟左右的短视频,讲了江森自控和微软Azure,如何帮助卡塔尔世界杯打造基于元宇宙的数字体育馆。Part.1欢迎扫码关注我的视频号(每天更新元宇宙、云计算和数字化的短视频)。Part.2…

插槽1单通道插槽2双通道_相机双存储卡插槽有什么大不了的?

插槽1单通道插槽2双通道If you paid any attention to the launch of Canon and Nikon’s first full frame mirrorless cameras—the EOS R, Z6, and Z7— you’d have noticed that some people were pretty unhappy that they only came with a single card slot—an SD slo…

python 垃圾回收详解

原文:https://zhuanlan.zhihu.com/p/31150408 总纲策略和垃圾回收系统工作内容引用计数详解标记-清除分代收集循环引用编程应用-常见方法ex 过程详解使用建议触发机制参考文献Python垃圾回收机制--完美讲解(Python vs Ruby)Python垃圾回收机制…

mac 不能连接wi-fi_如何阻止Mac自动连接到Wi-Fi网络

mac 不能连接wi-fiYour Mac automatically reconnects to Wi-Fi networks you’ve previously connected to. Starting with macOS High Sierra, you can now tell your Mac not to automatically connect to certain Wi-FI networks. Your Mac will remember the Wi-Fi networ…

罗汉塔最少步骤_如何以最少的步骤压缩和密码保护文件?

罗汉塔最少步骤If you have a large batch of files to compress and you want to add password protection to each of them, what is the simplest or quickest way to do so? Today’s SuperUser Q&A post has the answer to a curious reader’s question. 如果要压缩…

IoTSharp中使用X509加密MQTT通讯并实现设备鉴权

IoTSharp支持MQTT协议通过 TLS 1.2 加密通讯, 并可以通过X509证书进行设备认证登录。基本配置在 appsettings.Production.json中需要 指定域名, 并设置EnableTls为true"MqttBroker":{"DomainName":"http://demo.iotsharp.net:2…

django12:form 组件/渲染标签/数据校验/钩子函数/

基本用法 from django import forms# 自己写一个类 class RegForm(forms.Form):username forms.CharField(min_length3,max_length8, label"用户名")password forms.CharField(min_length3,max_length8,label"密码")emailforms.EmailField() 1.校验数据为…