接上篇:[nginx优化指南上
2.7 客户端连接参数的调整
2.7.1 客户端请求超时
限制超时值可以提高性能:它将在指定的时间段内等待客户端的头部和请求体,如果响应数据在该时间段内未到达,nginx将主动关闭连接,避免nginx被低效率的客户端消耗大量的连接资源引起性能下降,例如:
http {
client_body_timeout 10; # nginx两次socket recv客户端body的最大间隔时间
client_header_timeout 10; # nginx两次socket recv客户端header的最大间隔时间
send_timeout 10; # nginx两次socket send响应给客户端的最大间隔时间
}
以上一些参数对socket通信的超时时间进行了规定,如果超时则会关闭连接。
2.7.3 客户端请求内容的缓存
缓冲可以通过在缓冲区填充时保持部分响应来增加客户端到服务器通信的效率。当响应超过缓冲区大小时,nginx将将响应写入磁盘 - 这可能会对性能产生负面影响。但不要担心:您可以根据需要更改缓冲区大小,例如:
http {
client_header_buffer_size 2k; # 客户端http请求的正常头部的内存缓存大小
large_client_header_buffers 4 8k; # 设置最大的http请求头部的缓存数量和大小
client_body_buffer_size 128k; # 客户端http请求body部分的最大内存缓存
client_max_body_size 9m; # 最大允许的客户端上传的body部分的大小
}
client_header_buffer_size:可以设置一个正常http请求头所需的缓存大小,满足80%的需求,避免设置太小导致必须重新分配内存引起效率下降,或者太大引起资源浪费。如果有特别大的请求头超过了这个值,则会按照large_client_header_buffers设置的分配新的请求头缓存空间。
large_client_header_buffers:设置http请求头最多能够保存在多少个缓冲区中,每个缓冲区最大多少字节,而且规定了http请求头中的请求头字段是不能超过一个缓冲区大小的。
client_body_buffer_size:设置http请求中如果有body部分,那么最大可以缓存在内存中的大小,如果超过这个大小,将会被缓存到本地临时文件中去的。这个值应该能覆盖绝大部分POST请求的需求,避免因为设置太小引起大量的磁盘I/O情况的发生。
client_max_body_size:限制客户端提交的内容的大小,防止有客户端提交巨型数据引起nginx将其缓存到本地临时文件中,导致磁盘I/O激增或者本地空间不足的故障。
2.7.3 socket优化
- listen 参数优化:
在一个繁忙的nginx服务器上,随时有大量的并发连接请求过来,这个时候需要适当增大backlog的值,如果这值太小,socket连接请求建立队列太小会导致部分连接被拒绝。配置如下:
listen *:80 backlog=2048;
在内核接收到一个连接请求后,正常的情况下是立即回调应用层(这里是nginx)进行处理,但是现在内核允许设置延后接收请求,等到客户端有数据法上来的时候才回调应用层,这样的好处是减少无效连接、提高处理效率、节约资源。配置如下:
listen *:80 deferred;
调整接收和发送缓冲区大小,根据TCP滑动窗口大小的占比1-1/(2^tcp_adv_win_scale),计算出缓冲区大小上限;
举例:例如若我们的带宽为2Gbps,时延为10ms,那么带宽时延积BDP则为2G/8*0.01=2.5MB,所以这样的网络中可以设最大接收窗口为2.5MB,当tcp_adv_win_scale=2时最大读缓存可以设为4/3*2.5MB=3.3MB。当然还要综合服务器的实际内存和并发量来考虑最终的配置值,配置举例如下:
listen *:80 recvbuf=1048576 sndbuf=1048576;
-
sendfile :
用于启用或禁用Nginx在发送文件时使用零拷贝技术,在传统的文件传输过程中,数据从磁盘读取到内核缓冲区,