目录

  • 一、从几方面优化
  • 二、CPU效率
  • 2.1 合适work数
  • 2.2 CPU亲和
  • 2.3 增加worker进程的CPU使用时间
  • 2.4 减少CPU开销
  • 三、磁盘IO效率
  • 3.1 SSD:提升IOPS
  • 3.2 优化log存储
  • 3.3 AIO
  • 3.4 Thread Pool线程池
  • 四、OS容量
  • 3.1 缓冲队列(配置参数写入/etc/sysctl.d/xx.conf)
  • 3.2 文件句柄数
  • 3.3 可用端口数
  • 五、网络效率
  • 5.1 连接复用:
  • 5.2 使用cache缓存
  • 5.3 gzip压缩
  • 5.4 开启proxy_buffering缓冲
  • 六、nginx配置文件安全部分优化

一、从几方面优化

  • nginx处理用户请求流程:
  • nginx 请求400_缓存

  • 用户发起请求 --> 服务器网卡的半连接队列 --> 返回消息给用户 --> 用户继续发起请求 --> 服务器网卡的全连接队列 --> 服务器分辨是前端请求还是后端去请求返回对应数据
  • nginx优化:从CPU效率、磁盘IO效率、OS容量、网络效率 四方面

二、CPU效率

注意:配置参数写入/etc/nginx/nginx.conf总配置文件

2.1 合适work数

最好worker进程数=CPU核数
对应配置项: worker_processes = 1

2.2 CPU亲和

每个worker进程绑定一个CPU核心数,提升CPU缓存命中率
对应配置项:worker_cpu_affinity
worker_processes = 2;
worker_cpu_affinity 01 10;

2.3 增加worker进程的CPU使用时间

提升worker进程优先级,值越低,优先级越高,最低为-20:
对应配置项:worker_priority -20;

2.4 减少CPU开销

## multi_accept:会导致worker间负载不均
events {
accept_accept on; 
}
multi_accept可以让nginx worker进程尽可能多地接受请求。它的作用是让worker进程一次性地接受监听队列里的所有请求,然后处理。如果multi_accept的值设为off,那么worker进程必须一个一个地接受监听队列里的请求。
默认是关闭的

## accept_mutex:解决惊群问题
event {
accept_mutex off;
} 
#开启nginx串行,Nginx缺省激活了accept_mutex,是一种保守的选择。如果关闭了它,可能会引起一定程度的惊群问题,表现为上下文切换增多(sar -w)或者负载上升,但是如果你的网站访问量比较大,为了系统的吞吐量,我还是建议大家关闭它。


reuseport:弊端是reload会RST
开启会轮询让CPU去处理请求,但是常用上面2个选项

三、磁盘IO效率

3.1 SSD:提升IOPS

nginx是会有大量读取和部分写入,使用SSD固态硬盘代替普通硬盘能很好的提升服务体验

3.2 优化log存储

不指定access/error日志,减少频繁磁盘写入

3.3 AIO

sendfile on;
sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。

3.4 Thread Pool线程池

查看官网关于线程池的利用,能提升nginx的9倍性能

四、OS容量

3.1 缓冲队列(配置参数写入/etc/sysctl.d/xx.conf)

cat /proc/sys/net/core/netdev_max_backlog
#默认值:1000
#作用:从网卡设备中读取,到协议线处理前,每个CPU中队列的长度
net.core.netdev_max_backlog = 500000
注意:根据cat /proc/net/softnet_stat的结果,默认第二列数值是丢弃的,如果第二列非0,那么需要增大netdev_max_backlog值

##半连接队列
cat /proc/sys/net/ipv4/tcp_max_syn_backlog
#默认值:128
#作用:增大SYN队列的长度,容纳更多连接
net.ipv4.tcp_max_syn_backlog = 8192000

cat /proc/sys/net/core/somaxconn
#默认值:128
#作用:已经成功建立连接的套接字将要进入队列的长度
net.core.somaxconn = 65536

3.2 文件句柄数

##系统打开文件句柄数
sys.fs.file-max
fs.file-max = 2000000

##用户打开文件句柄数
nofile
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535

3.3 可用端口数

cat /proc/sys/net/ipv4/ip_local_port_range
#默认值:32768 61000
#作用: 可用用端口的范围,理想情况下一个端口支持一个连接
net.ipv4.ip_local_port_range = 1024 65535

五、网络效率

5.1 连接复用:

减少upstream建立连接,根据业务设置对应的超时时间,合理调节能优化50%

upstream {
  ...
  keepalive 60
}

5.2 使用cache缓存

proxy_cache_path
http{
    ......
    proxy_cache_path /data/nginx/tmp-test levels=1:2 keys_zone=tmp-test:100m inactive=7d max_size=1000g;
}
代码说明:
proxy_cache_path 缓存文件路径
levels 设置缓存文件目录层次;levels=1:2 表示两级目录
keys_zone 设置缓存名字和共享内存大小
inactive 在指定时间内没人访问则被删除
max_size 最大缓存空间,如果缓存空间满,默认覆盖掉缓存时间最长的资源。

5.3 gzip压缩

gzip on;
默认关闭gzip,开启会加快客户访问速度,但是会大量消耗CPU性能,自己调试

5.4 开启proxy_buffering缓冲

proxy_buffer 是用于 proxy 模式(一般也可称为反向代理)的 buffer 配置

下面总结下 nginx buffer 设置:
proxy_buffer_size 4k;
proxy_buffering on;
proxy_buffers 4 4k;
proxy_busy_buffers_size 8k;
proxy_max_temp_file_size 1024m;
首先,这些参数都是针对每一个http request ,不是全局的。

proxy_buffer 的配置
proxy_buffer 是用于 proxy 模式(一般也可称为反向代理)的 buffer 配置。Nginx 有另外一种适用于 server 模式的 buffer 配置,这里本帖不做介绍。

proxy_buffer 包括了以下配置项:
需注意,以下指定的数值都是针对每一个 http request 的上限,而不是对于整个 buffer 区指定的上限。

proxy_buffering
proxy_buffering on;
在 proxy_buffering 开启的时候,proxy_buffers 和 proxy_busy_buffers_size 才会起作用。

proxy_buffers
proxy_buffers 4 8k;
指定一个 request 的 buffer 的数量和大小。

proxy_buffer_size
proxy_buffer_size 4k;
指定后端 response 的 buffer 的大小。它是来自后端 response 的一部分,它包含 Headers,从 response 分离出来。它仅用于限定 headers 的 buffer 区,所以它的值比 proxy_buffers 更低。
proxy_buffer_size 有一点特殊在于,无论 proxy_buffering 是否开启,proxy_buffer_size 都会起作用。

proxy_busy_buffers_size
proxy_busy_buffers_size 12k;
忙时 buffer 的最大值。一个客户端一次只能从一个 buffer 中读取数据的同时,剩下的 buffer 会被放到队列中,等待发送到客户端,这个 directive 指定在这个状态下的 buffer 的大小

六、nginx配置文件安全部分优化