[转帖]nginx优化配置及方法论
- https://www.jianshu.com/p/87f8c03e91bd
1、优化方法论
从软件层面提升硬件使用效率
- 增大CPU的利用率
- 增大内存的利用率
- 增大磁盘IO的利用率
- 增大网络带宽的利用率
提升硬件规格
- 网卡:万兆网卡,例如10G, 25G, 40G等
- 磁盘:固态硬盘
- CPU:更快的主频,更多的核心,更大的缓存,更优的架构
- 内存:更快的访问速度
2、Nginx相关优化配置
2.1如何增大Nginx使用CPU的有效时长
能够使用全部CPU资源
- master-worker多进程架构
worker进程数量应当小于等于CPU核数
Nginx进程间不做无用功浪费CPU资源
- worker进程不应在繁忙时,主动让出CPU
- worker进程间不应由于争抢造成资源耗散
- worker进程数量应当等于CPU核数
- worker进程不应调用一些API导致主动让出CPU
比如使用openresty调用第三方模块
不被其他进程争抢资源
- 提升优先级占用CPU更长的时间
- 减少操作系统上耗资源的非Nginx进程
设置worker进程的数量
通过合理的设置worker的进程数量,提高cpu利用率,cpu设置等于或者小于核数
查看cpu核数的方法 grep "processor" /proc/cpuinfo |wc -l
Syntax: worker processes number auto;
Default: worker_processes 1;
Context: main
为何一个CPU就可以同时运行多个进程?
- 宏观上并行,微观上串行
- 把进程的运行时间分为一段段的时间片
OS调度系统依次选择每个进程,最多执行时间片指定的时长
image.png- 阻塞API引发的时间片内主动让出CPU
-速度不一致引发的阻塞API
-硬件执行速度不一致,例如CPU和磁盘 - 业务场景产生的阻塞API
-例如同步读网络报文
2.2、减少进程间切换
-何为进程间切换
• 是指CPU从一个进程或线程切换到另一个进程或线程
• 类别
• 主动切换
• 被动切换:时间片耗尽
• 减少被动切换
• 增大进程优先级
2.2.1、减入被动进程间切换的配置-设置worker进程优先级
nginx默认是没有开启利用多核cpu的配置的。需要通过增加worker_cpu_affinity配置参数来充分利用多核cpu
当CPU在运行的时候,如果一颗CPU始终固定的去运行同一个进程,当用户连接到进程的时候,用固定的CPU响应用户的请求,CPU中有缓存,就可以重复的使用CPU中缓存的数据。如果进程一开始运行在第一颗CPU上,运行一会跑到第二颗CPU上,就意味着原来的缓存信息在第二颗CPU上无法使用,还需要重新加载,带来资源的浪费,影响效率
绑定Nginx worker进程到指定的CPU内核
Syntax: worker_cpu_affinity cpumask
worker_cpu_affinity auto [cpumask];
Default: -;
Context: main
2.3Nginx 事件处理模型优化
Nginx 的连接处理机制在不同的操作系统中会采用不同的 I/O 模型,在 linux 下,Nginx 使用 epoll 的 I/O 多路复用模型,在 Freebsd 中使用 kqueue 的 I/O 多路复用模型 不过这个选项没必要设置,因为nginx会自动选择最有效的方法作为默认项
Syntax: use method;
Default: —
Context: events
2.4.单个进程允许的客户端最大连接数
通过调整控制连接数的参数来调整 Nginx 单个进程允许的客户端最大连接数,更多的worker的connection数量对会占用更多的内存,一般一个connection约232字节,而且event也约96字节,一个连接就是232+96*2
Syntax: worker_connections number;
Default: 1024
Context: events
2.5 配置Nginx worker进程最大打开文件数
Syntax: worker_rlimit_nofile number;
Default: -
Context: events
上面两个参数都受最大文件句柄数限制,当运行的服务需要大并发进程运行时,如果不够,就会报出“too many open files” file-max是内核可分配的最大文件数可通过 cat /proc/sys/fs/file-max 查看nr_open是单个进程可分配的最大文件数 可通过 cat /proc/sys/fs/nr_open 查看但是也不是不可修改可通过编辑/proc/sys/fs/file-max 修改 echo 30296 > /proc/sys/fs/file-max 单个进程分配文件数如上操作
2.6 修改用户的最大文件句柄数限制
临时修改 ulimit -HSn limit
永久修改 vi /etc/security/limits.conf
-H选项和-S选项分别表示对给定资源的硬限制(hard limit)和软限制(soft limit)进行设置。
硬限制(hard limit)一旦被设置以后就不能被非root用户修改,软限制(soft limit)可以增长达到硬限制(hard limit)。
如果既没有指定-H选项也没有指定-S选项,那么硬限制(hard limit)和软限制(soft limit)都会被设置。
总结:
- a.所有进程打开的文件描述符数不能超过/proc/sys/fs/file-max
- b.单个进程打开的文件描述符数不能超过user limit中nofile的soft limit
- c.nofile的soft limit不能超过其hard limit
- d. nofile的hard limit不能超过/proc/sys/fs/nr_open
3. 网络相关
什么是SYN攻击?
攻击者短时间伪造不同IP地址的SYN报文,快速占满backlog队列,使服务器不能为正常用户服务,SYN攻击是所有黑客攻击事件中最常见又最容易被利用的一种攻击手法,由来已久,破坏威力巨大。SYN攻击属于DOS攻击的一种, 它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源
TCP连接握手示意图

SYN_SENT 状态
• net.ipv4.tcp_syn_retries = 6
-主动建立连接时,发SYN的重试次数
• net.ipv4.ip_local_port_range = 32768 60999
-建立连接时本地口可用范围
SYN_RCVD 状态
• net.ipv4.tcp_max_syn_backlog
-SYN_RCVD状态连接的最大数
• net.ipv4.tcp_synack_retries
-被动建立连接时,发SYN/ACK的重试次数

如何应对SYN攻击?
SYN攻击的原理就是向服务器发送SYN数据包,并伪造源IP地址。服务器在收到SYN数据包时,会将连接加入backlog队列,并向源IP发送SYN-ACK数据包,并
等待ACK数据包,以完成三次握手建立连接。 由于源IP地址是伪造的不存在主机IP,所以服务器无法收到ACK数据包,并会不断重发,同时backlog队列被不断被
攻击的SYN连接占满,导致无法处理正常的连接小号cpu资源。
1、减少SYN-ACK数据包的重发次数(默认是5次)
sysctl -w net.ipv4.tcp_synack_retries=3
sysctl -w net.ipv4.tcp_syn_retries=3
2、增大backlog队列(默认是1024)
• net.core.netdev_max_backlog
-接收自网卡、但未被内核协议栈处理的报文队列长度
• net.ipv4.tcp_max_syn_backlog
-SYN_RCVD状态连接的最大个数
sysctl -w net.ipv4.tcp_max_syn_backlog=2048
3、超出处理能力时,对新来的SYN丢弃连接
• net.ipv4.tcp_abort_on_overflow
4、生成验证cookie,重连
• net.ipv4.tcp_syncookies = 1
-当SYN队列满后,新的SYN不进A队列,计算出cookie再以SYN+ACK中的序列号返回客户端,正常客户端发报文时,服
务端根据报文中携带的cookie重新恢复连接
注意:synccookies是妥协版的TCP协议,失去了很多功能,所以先应优化服务端应用程序的负载能力,加大应用程序 backlog值
Tcp Fast Open
开启TFO,加速tcp处理

net.ipv4.tcp_fastopen :系统开启TFO功能
• 0 :关闭
• 1 :作为客户端时可以使用TFO
• 2 :作为服务器时可以使用TFO
• 3 :无论作为客户端还是服务器,都可以使用TFO
禁用Nagle算法?
- Nagle算法
-避免一个连接上同时存在大量小报文 . 最多只存在要给小报文 . 合并多个小报文一起发送
-提高带宽利用率
吞吐量优先:启用Nagle算法,tcp_nodelay off
低时延优先:禁用Nagle算法,tcp_nodelay on
示例:禁用跟启用Nagle算法示意


Syntax: tcp_nodelay on | off;
Default: tcp_nodelay on;
Context: http, server, location
Gzip指令
nginx中gzip的主要作用就是用来减轻服务器的带宽问题,经过gzip压缩后的页面大小可以变为原来的30%甚至更小,这样用户浏览页面时的速度会快很多。gzip的压缩页面需要浏览器和服务器双方都支持,实际上就是服务器端压缩,传到浏览器后浏览器解压缩并解析。目前的大多数浏览器都支持解析gzip压缩过的页面。
参数说明:
语法:gzip on | off;
默认值:gzip off;
作用域:http, server, location, if in location
语法:gzip_min_length length;
默认值:gzip_min_length 20;
作用域:http, server, location
说明:
设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。因为过小的文件内容压缩之后效果不明显,甚至会比不压缩时
更大,所以一般建议长度不小于1000或1k。
响应头响应浏览器使用gzip解压

gzip_buffers
语法: gzip_buffers number size;
默认值: gzip_buffers 32 4k|16 8k;
作用域: http, server, location
说明:
设置response响应的缓冲区大小。32 4k代表以4k为单位将响应数据以4k的32倍(128k)的大小申请内存。如果没有设置,缓冲区的大小默认为整个响应页
面的大小。gzip_comp_level
语法:gzip_comp_level level;
默认值:gzip_comp_level 1;
作用域:http, server, location
说明:
设置gzip的压缩级别,可接受的范围是从1到9,数字越大压缩率越高,但更消耗CPU,一般设置6即可。gzip_types
语法:gzip_types mime-type ...;
默认值:gzip_types text/html;
作用域:http, server, location
说明:
指定哪些类型的相应才启用gzip压缩,多个用空格分隔。通配符”*”可以匹配任意类型。
不管是否指定”text/html”类型,该类型的响应总是启用压缩。
一般js、css等文本文件都启用压缩,如application/x-javascript text/css application/xml 等。
具体的文件类型对应的mimi-type可以参考conf/mime.types文件。gzip_http_version
语法:gzip_http_version 1.0 | 1.1;
默认值:gzip_http_version 1.1;
作用域:http, server, location
说明:
设置gzip压缩所需要的请求的最小HTTP版本,低于该版本不使用gzip压缩。一般不用修改,默认即可。gzip_disable
gzip_disable “MSIE [1-6].”
语法:gzip_disable regex ...;
默认值:—
作用域:http, server, location
说明:
这个指令是在0.6.23版本增加的。
如果请求的”User-Agent”头信息能被指定的正则表达式匹配,则对响应禁用gzip压缩功能。主要是为了兼容不支持gzip压缩的浏览器,比如IE6,不过IE6早就废弃了
浏览器和服务器进行gzip压缩的请求和处理返回过程

整个请求过程来看,开启 gzip
和不开启 gzip
功能,其 http
的请求和返回过程是一致的,不同的是参数。
当开启HTTP的 gzip
功能时,客户端发出 http
请求时,会通过 headers
中的 Accept-Encoding
属性告诉服务器“我支持 gzip
解压,解压格式(算法)deflate
, sdch
为:”。```Accept-Encoding:gzip,deflate,sdch`
注意,不是request说自己支持解压,Nginx返回response数据的时候就一定会压缩。这还要看本次Nginx返回数据的格式是什么,如果返回数据的原始数据格式,和设置的gzip_types相符合,这时Nginx才会进行压缩。
Nginx
返回 response headers
是,如果数据被压缩了,就会在 Content-Encoding
属性中标示 gzip
,表示接下来返回的 response
content
是经过压缩的;并且在 Content-Type
属性中表示数据的原始格式。 最后返回经过压缩的 response content
给客户端,客户端再进行解压。这里注意一下,在客户端发送的 headers
里面,有一个 deflate
,sdch
。这是两种压缩算法
- 减少磁盘IO
- 优化读取
- Sendfile 零拷贝
- 内存盘、SSD盘
- 减少写入
- AIO
- 增大 error_log级别
- 关闭 access_log
- 压缩 access_log
- 是否启用proxy buffering?
- syslog 替代本地IO
- 线程池thread pool
直接IO绕开磁盘高速缓存
先看下概念

适用于大文件:直接IO
当磁盘上的文件大小超过size后,启用directIO功能,避免Buffered IO模式下磁盘页缓存中的拷贝消耗
Syntax: directio size | off;
Default: directio off;
Context: http, server, location
Syntax: directioaligiunent 512;
Default: directioalignment size;
Context: http, server, location

Syntax: aio on | off | threads[=pool];
Default: aio off;
Context: http, server, location
异步读IO线程池
编译时需要加上 --with-threadsimage.png定义线程池
根据前面的了解,如果我们的服务器是个静态资源服务器,就适合使用异步IO线程池 Syntax: thread_pool name threads=number [max_queue=number];
Default:thread_pool default threads=32 max_queue=65536; Context:mainsendfile零拷贝提升性能
减少内存拷贝次数image.png
[转帖]nginx优化配置及方法论的更多相关文章
- nginx优化配置大全
由于面试被问到nginx优化做过哪些 后来发现,其实做过的也不少,忘了的更不少,因此写个博客记录一下(里面有一些内容来源于其他作者). 配置文件样例为生产环境样例. 1.nginx基本优化 安装方式有 ...
- Nginx优化配置,轻松应对高并发
Nginx现在已经是最火的web服务器之一,尤其在静态分离和负载均衡方面,性能十分优越.接下来我们主要看下Nginx在高并发环境下的优化配置,主要是针对 nginx.conf 文件的属性设置.我们打开 ...
- [转帖]nginx location配置详细解释
nginx location配置详细解释 http://outofmemory.cn/code-snippet/742/nginx-location-configuration-xiangxi-exp ...
- nginx优化配置
一.一般来说nginx 配置文件中对优化比较有作用的为以下几项: 1. worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu ...
- Nginx 优化配置及详细注释
Nginx 的nginx.conf文件,是调优后的,具体影响已经写清楚注释,可以拿来用,有一些设置无效,我备注上了,不知道是不是版本的问题,回头查一下再更正. #普通配置 #==性能配置 #运行用户 ...
- Nginx 优化配置
基本配置优化(优化后配置样例,可以改后直接上生产) 1 #头部配置 2 user nginx nginx; #定义nginx的启动用户,不建议使用root 3 worker_processes 4; ...
- Nginx优化—配置优化
完整配置如下所示: user nginx; #运行的用户 pid /var/run/nginx.pid; worker_processes auto; #定义了nginx对外提供web服务时的word ...
- nginx优化:配置gzip压缩页面提高访问速度(nginx1.18.0)
一,为什么nginx要使用gzip 1,压缩的作用: 页面使用gzip压缩之后, 页面大小可以压缩到原来的1/7左右, 传输速度和页面打开时间都可以大幅度提高, 有利于用户访问页面体验的提升 2,Ng ...
- nginx + SSL优化配置
nginx + SSL优化配置: #http段添加如下配置项: http { ssl_prefer_server_ciphers on; #设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户 ...
- CentOS6.5 Nginx优化编译配置[续]
继续上文CentOS6.5 Nginx优化编译配置本文记录有关Nginx系统环境的一些细节设置,有关Nginx性能调整除了配置文件吻合服务器硬件之前就是关闭不必要的服务.磁盘操作.文件描述符.内核调整 ...
随机推荐
- redis + AOP + 自定义注解实现接口限流
限流介绍 限流(rate limiting) 是指在一定时间内,对某些资源的访问次数进行限制,以避免资源被滥用或过度消耗.限流可以防止服务器崩溃.保证用户体验.提高系统可用性. 限流的方法有很多种 ...
- 永久免费!国产操作系统 Deepin V20 Beta版发布(附安装教程)
深度操作系统(DEEPIN)是武汉深之度科技有限公司致力于为全球用户提供美观易用.安全可靠的Linux发行版.经过一段时间的测试,这款操作系统的Beta版终于今天和大家见面了.这次Deepin v20 ...
- 10.elasticsearch集群red恢复损坏的索引
背景 客户磁盘损坏,修复磁盘后,重启机器,发现elasticsearch启动成功,ES状态正常green,但是历史数据都没有加载进,查看ES存储数据目录,发现数据还在. 解决方案 首先,需要确认ind ...
- H3C 存储换盘操作
实际存储型号H3C CF8844 环境说明:H3C存储设备存在一个坏盘需要更换. 更换准备 1. 取出备件检查完毕后放置到安全场所(请严格按照<IT产品现场工程师通用服务规(维修篇)>操作 ...
- 你真的会用 npx 吗❓❓❓
Hello,大家好! 日常开发中大家应该经常使用 npm install xxx 来安装包依赖,那是否注意到npm升级到 npm@5.2.0 之后,在 npm 二进制命令旁边安装了一个 npx 二进制 ...
- 带你梳理Roach全量恢复的整体流程
摘要:本文将梳理Roach全量恢复的整体流程,描述Roach集群全量备份场景的运转机制. 数据备份恢复是保护数据安全的重要手段之一.Roach工具支持多种备份恢复类型,例如集群级的物理备份,表级备份的 ...
- 在openEuler上做开发?这个大赛拿出30万寻找开源的yyds
摘要:为鲲鹏产业生态的一部分,在服务器操作系统层面,开源操作系统openEuler更是令人期待. 本文分享自华为云社区<在openEuler上做开发?这个大赛拿出30万寻找开源的yyds> ...
- 带你了解 HBase 数据模型和 HBase 架构
摘要:HBase 是一个面向列的 NoSQL 数据库. 本文分享自华为云社区<HBase 架构:HBase 数据模型 & HBase 读/写机制>,作者: Donglian Lin ...
- vue2升级vue3:Vue Router报错,directly inside <transition> or <keep-a
vue3 报这个错误: vue-router.mjs:35 [Vue Router warn]: <router-view> can no longer be used directly ...
- SQL Server 附加数据库,报只读文件,无权修改其中某些文件
MSSQL 默认安装在 C盘下,由于C盘没空间了,迁到D盘,这时候在附件数据库是报了错误:附加数据库 因为它是只读的,它具有只读文件,无权修改其中某些文件 如果是可以附加,显示(只读)这时候不能删除 ...