性能优化

本章节介绍如何优化 Nginx 性能。

工作进程数

worker_processes  auto;

工作进程数原理: Nginx 使用 Master-Worker 进程模型,Master 进程负责管理 Worker 进程,Worker 进程负责处理客户端请求。worker_processes 指令设置 Worker 进程数量,通常设置为 CPU 核心数,以充分利用多核 CPU 性能。

性能优化建议

  • 设置为 auto,自动设置为 CPU 核心数
  • 或设置为 CPU 核心数,如 worker_processes 4

连接数

events {
    worker_connections  1024;
}

连接数原理: 每个 Worker 进程都有一个连接池,连接池的大小由 worker_connections 指定。当连接数超过 worker_connections 时,新的连接会被拒绝。最大连接数为 worker_processes × worker_connections

性能优化建议

  • 根据系统资源和预期并发量设置
  • 通常设置为 1024-65535 之间
  • 确保系统文件描述符限制大于 worker_connections 的值

启用 sendfile

http {
    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;
}

sendfile 原理sendfile 是一个系统调用,用于在文件描述符之间传输数据,避免数据在用户空间和内核空间之间复制。sendfile 直接在内核空间将文件数据传输到网络接口,大大提高了文件传输性能。

tcp_nopush 原理tcp_nopush 指令启用 TCP_NOPUSH 选项,该选项告诉操作系统不要立即发送数据,而是等待数据积累到一定量后再发送。这样可以减少 TCP 包的数量,提高网络传输效率。

tcp_nodelay 原理tcp_nodelay 指令禁用 Nagle 算法,该算法会延迟发送小数据包,以减少网络流量。禁用 Nagle 算法可以减少延迟,提高实时性。

性能优化建议

  • 启用 sendfile,提高文件传输性能
  • 启用 tcp_nopush,减少 TCP 包的数量
  • 启用 tcp_nodelay,减少延迟

启用 gzip

http {
    gzip  on;
    gzip_min_length  1000;
    gzip_types       text/plain text/css application/json;
}

gzip 原理gzip 是一种数据压缩算法,可以压缩 HTTP 响应体,减少网络传输数据量,提高传输速度。gzip_min_length 指令设置启用 gzip 压缩的最小响应体大小,gzip_types 指令设置启用 gzip 压缩的 MIME 类型。

性能优化建议

  • 启用 gzip,减少网络传输数据量
  • 设置 gzip_min_length,避免压缩小文件
  • 设置 gzip_types,只压缩文本类型的文件

缓存

proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g;

server {
    location / {
        proxy_cache my_cache;
    }
}

缓存原理proxy_cache 指令启用代理缓存,将后端服务器的响应缓存到本地磁盘,减少对后端服务器的请求,提高响应速度。proxy_cache_path 指令设置缓存路径、缓存级别、缓存键区域、缓存大小等参数。

性能优化建议

  • 启用 proxy_cache,减少对后端服务器的请求
  • 设置 proxy_cache_path,配置缓存路径和缓存大小
  • 设置 proxy_cache_valid,设置缓存有效期

保持连接

http {
    keepalive_timeout  65;
    keepalive_requests  100;
}

保持连接原理keepalive_timeout 指令设置保持连接的超时时间,keepalive_requests 指令设置每个保持连接可以处理的最大请求数。保持连接可以减少 TCP 连接建立和关闭的开销,提高性能。

性能优化建议

  • 设置 keepalive_timeout,设置保持连接的超时时间
  • 设置 keepalive_requests,设置每个保持连接可以处理的最大请求数
  • 设置 keepalive,设置与后端服务器保持连接的数量

其他优化

禁用访问日志

access_log off;

禁用访问日志原理: 访问日志会占用磁盘空间和 I/O 资源,禁用访问日志可以提高性能。

限制请求体大小

client_max_body_size 10m;

限制请求体大小原理client_max_body_size 指令设置客户端请求体的最大大小,限制请求体大小可以防止大文件上传占用过多资源。

启用缓冲

proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;

启用缓冲原理proxy_buffering 指令启用代理缓冲,将后端服务器的响应缓冲到内存,减少对后端服务器的请求,提高响应速度。

最佳实践

  1. 设置工作进程数:设置为 CPU 核心数,充分利用多核 CPU 性能
  2. 设置连接数:根据系统资源和预期并发量设置
  3. 启用 sendfile:提高文件传输性能
  4. 启用 gzip:减少网络传输数据量
  5. 启用缓存:减少对后端服务器的请求
  6. 保持连接:减少 TCP 连接建立和关闭的开销
  7. 禁用访问日志:减少磁盘 I/O
  8. 限制请求体大小:防止大文件上传占用过多资源
  9. 启用缓冲:减少对后端服务器的请求
  10. 监控性能:定期监控性能,及时发现异常