nginx优化配置及方法论

2020-08-07  本文已影响0人  心似南风

1、优化方法论

从软件层面提升硬件使用效率

提升硬件规格

2、Nginx相关优化配置

2.1如何增大Nginx使用CPU的有效时长

能够使用全部CPU资源

Nginx进程间不做无用功浪费CPU资源

不被其他进程争抢资源

设置worker进程的数量

通过合理的设置worker的进程数量,提高cpu利用率,cpu设置等于或者小于核数
查看cpu核数的方法 grep "processor" /proc/cpuinfo |wc -l

Syntax: worker processes number auto;
Default: worker_processes 1;
Context: main

为何一个CPU就可以同时运行多个进程?

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)都会被设置。

总结:

3. 网络相关

什么是SYN攻击?

攻击者短时间伪造不同IP地址的SYN报文,快速占满backlog队列,使服务器不能为正常用户服务,SYN攻击是所有黑客攻击事件中最常见又最容易被利用的一种攻击手法,由来已久,破坏威力巨大。SYN攻击属于DOS攻击的一种, 它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源

TCP连接握手示意图

image.png

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的重试次数


image.png

如何应对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处理


image.png

net.ipv4.tcp_fastopen :系统开启TFO功能
• 0 :关闭
• 1 :作为客户端时可以使用TFO
• 2 :作为服务器时可以使用TFO
• 3 :无论作为客户端还是服务器,都可以使用TFO

禁用Nagle算法?

示例:禁用跟启用Nagle算法示意


image.png
image.png
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解压


image.png

浏览器和服务器进行gzip压缩的请求和处理返回过程

image.png
整个请求过程来看,开启 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绕开磁盘高速缓存

先看下概念


image.png

适用于大文件:直接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
image.png
Syntax: aio on | off | threads[=pool];
Default: aio off;
Context: http, server, location
上一篇 下一篇

猜你喜欢

热点阅读