nginx配置参数优化/linux内核网络模块优化

Nginx配置参数优化

Nginx作为高性能web服务器,即使不特意调整配置参数也可以处理大量的并发请求

1.针对worker进程的优化

worker_processes:该参数表示启动几个工作进程,建议和本机CPU核数保持一致,每一核CPU处理一个进程

worker_rlimit_nofile:它表示Nginx最大可用的文件描述符个数,需要配合系统的最大描述符,建议设置为102400,还需要在系统里执行ulimit -n 102400才可以(临时生效),也可以直接修改配置文件/etc/security/limits.conf使其永久生效
添加:
* soft nofile 102400
* hard nofile 102400

worker_connections:该参数用来配置每个Nginx worker进程最大处理的连接数,这个参数也决定了该Nginx服务器最多能处理多少客户端请求(worker_processes * worker_connections),建议把该参数设置为10240,不建议太大

2.针对http和tcp的优化

use epoll:使用epoll模式的事件驱动模型,该模型为Linux系统下最优方式

multi_accept on:使每个worker进程可以同时处理多个客户端请求

sendfile on:使用内核的FD文件传输功能,可以减少user mode和kernel mode的切换,从而提升服务器性能

tcp_nopush on:当tcp_nopush设置为on时,会调用tcp_cork方法进行数据传输,使用该方法会产生这样的效果:当应用程序产生数据时,内核不会立马封装包,而是当数据量积累到一定量时才会封装,然后传输

tcp_nodelay on:不缓存data-sends(关闭 Nagle 算法),这个能够提高高频发送小数据报文的实时性
关于Nagle算法:
假如需要频繁的发送一些小包数据,比如说1个字节,以IPv4为例的话,则每个包都要附带40字节的头,也就是说,总计41个字节的数据里,其中只有1个字节是我们需要的数据。为了解决这个问题,出现了Nagle算法,它规定:如果包的大小满足MSS,那么可以立即发送,否则数据会被放到缓冲区,等到已经发送的包被确认了之后才能继续发送,通过这样的规定,可以降低网络里小包的数量,从而提升网络性能

keepalive_timeout:定义长连接的超时时间,建议30s,太短或者太长都不一定合适,当然,最好是根据业务自身的情况来动态地调整该参数

keepalive_requests:定义当客户端和服务端处于长连接的情况下,每个客户端最多可以请求多少次,可以设置很大,比如50000

reset_timeout_connection on:设置为on的话,当客户端不再向服务端发送请求时,允许服务端关闭该连接

client_body_timeout:客户端如果在该指定时间内没有加载完body数据,则断开连接,单位是秒,默认60,可以设置为10

send_timeout:这个超时时间是发送响应的超时时间,即Nginx服务器向客户端发送了数据包,但客户端一直没有去接收这个数据包,如果某个连接超过send_timeout定义的超时时间,那么Nginx将会关闭这个连接,单位是秒,可以设置为3

3.针对buffer和cache的优化

#以下配置都是针对单个请求

client_body_buffer_size:当客户端以POST方法提交一些数据到服务端时,会先写入到client_body_buffer中,如果buffer写满会写到临时文件里,建议调整为128k

client_max_body_size:浏览器在发送含有较大HTTP body的请求时,其头部会有一个Content-Length字段,client_max_body_size是用来限制Content-Length所示值的大小的,这个限制body的配置不用等Nginx接收完所有的HTTP包体,就可以告诉用户请求过大不被接受。会返回413状态码
例如,用户试图上传一个1GB的文件,Nginx在收完包头后,发现Content-Length超过client_max_body_size定义的值,就直接发送413(Request Entity Too Large)响应给客户端,将该数值设置为0,则禁用限制,建议设置为10m

client_header_buffer_size:设置客户端header的buffer大小,建议4k

large_client_header_buffers:对于比较大的header(超过client_header_buffer_size)将会使用该部分buffer,两个数值,第一个是个数,第二个是每个buffer的大小,建议设置为4 8k

open_file_cache:该参数会对以下信息进行缓存:
1.打开文件描述符的文件大小和修改时间信息
2.存在的目录信息
3.搜索文件的错误信息(文件不存在无权限读取等信息)
格式:open_file_cache max=size inactive=time;max设定缓存文件的数量,inactive设定经过多长时间文件没被请求后删除缓存。建议设置 open_file_cache max=102400 inactive=20s

open_file_cache_valid:指多长时间检查一次缓存的有效信息。建议设置为30s

open_file_cache_min_uses:open_file_cache指令中的inactive参数时间内文件的最少使用次数,如,将该参数设置为1,则表示,如果文件在inactive时间内一次都没被使用,它将被移除,建议设置为2

4.针对数据压缩的优化

对于纯文本的内容,Nginx是可以使用gzip压缩的。使用压缩技术可以减少对带宽的消耗,由ngx_http_gzip_module模块支持

配置如下:
gzip on 开启gzip功能
gzip_min_length 1024 设置请求资源超过该数值才进行压缩,单位字节
gzip_buffers 16 8k 设置压缩使用的buffer大小,第一个数字为数量,第二个为每个buffer的大小
gzip_comp_level 6 设置压缩级别,范围1-9,9压缩级别最高,也最耗费CPU资源
gzip_types text/plain application/x-javascript text/css application/xml image/jpeg image/gif image/png 指定哪些类型的文件需要压缩
gzip_disable “MSIE 6.” IE6浏览器不启用压缩

#配置完成后,访问满足压缩条件的文件http头部中有gzip相关的信息

5.针对日志的优化

1.错误日志级别调高,比如crit级别,尽量少记录无关紧要的日志
2.对于访问日志,如果不要求记录日志,可以关闭
3.静态文件的访问日志关闭

6.针对SSL的优化

1.适当减少worker_processes数量,因为ssl功能需要使用CPU的计算。
2.使用长连接,因为每次建立ssl会话,都会耗费一定的资源(加密、解密)
3.开启ssl缓存,简化服务端和客户端的“握手”过程。
添加配置:
ssl_session_cache shared:SSL:10m; //缓存为10M
ssl_session_timeout 10m; //会话超时时间为10分钟

Linux内核参数优化(网络模块)

作为高性能WEB服务器,只调整Nginx本身的参数是不行的,因为Nginx服务依赖于高性能的操作系统。

1 net.ipv4.tcp_max_tw_buckets
对于tcp连接,服务端和客户端通信完后状态变为timewait,假如某台服务器非常忙,连接数特别多的话,那么这个timewait数量就会越来越大。
毕竟它也是会占用一定的资源,所以应该有一个最大值,当超过这个值,系统就会删除最早的连接,这样始终保持在一个数量级。
这个数值就是由net.ipv4.tcp_max_tw_buckets这个参数来决定的。
CentOS7.6版本,默认为16384,可以使用sysctl -a |grep tw_buckets来查看它的值,
可以适当把它调低,比如调整到8000,毕竟这个状态的连接太多也是会消耗资源的。
但不要把它调到几十、几百这样,因为这种状态的tcp连接也是有用的,
如果同样的客户端再次和服务端通信,就不用再次建立新的连接了,用这个旧的通道,省时省力。

2 net.ipv4.tcp_tw_recycle = 1
该参数的作用是快速回收timewait状态的连接。上面虽然提到系统会自动删除掉timewait状态的连接,但如果把这样的连接重新利用起来岂不是更好。
所以该参数设置为1就可以让timewait状态的连接快速回收,它需要和下面的参数配合一起使用。

3 net.ipv4.tcp_tw_reuse = 1
该参数设置为1,将timewait状态的连接重新用于新的TCP连接,要结合上面的参数一起使用。

4 net.ipv4.tcp_syncookies = 1
tcp三次握手中,客户端向服务端发起syn请求,服务端收到后,也会向客户端发起syn请求同时连带ack确认,
假如客户端发送请求后直接断开和服务端的连接,不接收服务端发起的这个请求,服务端会重试多次,
这个重试的过程会持续一段时间(通常高于30s),当这种状态的连接数量非常大时,服务器会消耗很大的资源,从而造成瘫痪,
正常的连接进不来,这种恶意的半连接行为其实叫做syn flood攻击。
设置为1,是开启SYN Cookies,开启后可以避免发生上述的syn flood攻击。
开启该参数后,服务端接收客户端的ack后,再向客户端发送ack+syn之前会要求client在短时间内回应一个序号,
如果客户端不能提供序号或者提供的序号不对则认为该客户端不合法,于是不会发ack+syn给客户端,更涉及不到重试。

5 net.ipv4.tcp_max_syn_backlog
该参数定义系统能接受的最大半连接状态的tcp连接数。客户端向服务端发送了syn包,服务端收到后,会记录一下,
该参数决定最多能记录几个这样的连接。在CentOS7,默认是256,当有syn flood攻击时,这个数值太小则很容易导致服务器瘫痪,
实际上此时服务器并没有消耗太多资源(cpu、内存等),所以可以适当调大它,比如调整到30000。

6 net.ipv4.tcp_syn_retries
该参数适用于客户端,它定义发起syn的最大重试次数,默认为6,建议改为2。

7 net.ipv4.tcp_synack_retries
该参数适用于服务端,它定义发起syn+ack的最大重试次数,默认为5,建议改为2,可以适当预防syn flood攻击。

8 net.ipv4.ip_local_port_range
该参数定义端口范围,系统默认保留端口为1024及以下,以上部分为自定义端口。这个参数适用于客户端,
当客户端和服务端建立连接时,比如说访问服务端的80端口,客户端随机开启了一个端口和服务端发起连接,
这个参数定义随机端口的范围。默认为32768 61000,建议调整为1025 61000。

9 net.ipv4.tcp_fin_timeout
tcp连接的状态中,客户端上有一个是FIN-WAIT-2状态,它是状态变迁为timewait前一个状态。
该参数定义不属于任何进程的该连接状态的超时时间,默认值为60,建议调整为6。

10 net.ipv4.tcp_keepalive_time
tcp连接状态里,有一个是established状态,只有在这个状态下,客户端和服务端才能通信。正常情况下,当通信完毕,
客户端或服务端会告诉对方要关闭连接,此时状态就会变为timewait,如果客户端没有告诉服务端,
并且服务端也没有告诉客户端关闭的话(例如,客户端那边断网了),此时需要该参数来判定。
比如客户端已经断网了,但服务端上本次连接的状态依然是established,服务端为了确认客户端是否断网,
就需要每隔一段时间去发一个探测包去确认一下看看对方是否在线。这个时间就由该参数决定。它的默认值为7200秒,建议设置为30秒。

11 net.ipv4.tcp_keepalive_intvl
该参数和上面的参数是一起的,服务端在规定时间内发起了探测,查看客户端是否在线,如果客户端并没有确认,
此时服务端还不能认定为对方不在线,而是要尝试多次。该参数定义重新发送探测的时间,即第一次发现对方有问题后,过多久再次发起探测。
默认值为75秒,可以改为3秒。

12 net.ipv4.tcp_keepalive_probes
第10和第11个参数规定了何时发起探测和探测失败后再过多久再发起探测,但并没有定义一共探测几次才算结束。
该参数定义发起探测的包的数量。默认为9,建议设置2。

示例:

net.ipv4.tcp_fin_timeout = 6
net.ipv4.tcp_keepalive_time = 30
net.ipv4.tcp_max_tw_buckets = 8000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 30000
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2
net.ipv4.ip_local_port_range = 1025 61000
net.ipv4.tcp_keepalive_intvl = 3
net.ipv4.tcp_keepalive_probes = 2

#在Linux下调整内核参数,可以直接编辑配置文件/etc/sysctl.conf,然后执行sysctl -p命令生效

发布了114 篇原创文章 · 获赞 851 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/Powerful_Fy/article/details/102845921