Nginx性能优化指南

Nginx性能优化指南

Nginx 是世界知名的高性能 Web 服务器和负载均衡器,本 Nginx 性能优化指南旨在帮助大家快速进行 Nginx 服务器性能优化,以便快速向用户交付网站内容。

配置Worker

最简单的优化便是修改 Worker 和配置连接数。

Worker进程

如果你在同一台服务器上运行 Nginx 和数据库,而且网站流量较少的话,可以在 nginx.conf 配置文件中设置 worker_processes 1;

如果你网站流量较大或 Nginx 作为单服务器运行,便可以为每 CPU 核心分配 Worker,worker_processes auto;

如果你不想自动配置而要手动设置的话,可以使用如下命令查看 CPU 核心数并更改 worker_processes 数量。

  1. grep ^processor /proc/cpuinfo | wc l

Worker连接数

worker_connections 设置可以配置每 Worker 进程在同一时间的最大连接数。默认情况下,Worker 连接数被限制为 512,但事实上系统可以处理更多在连接。

Worker 连接数设置为多少其实可以通过查看系统核心的限制找到,只需使用如下命令即可:

  1. ulimit n

我们还可以设置使用 use epoll 机制,该选项为 I/O 事件通知机制可确保最大化的 I/O 利用能力。

最后,我们可以使用 multi_accept 让 Worker 能够在同一时间接受所有新的连接。

以上事件机制配置好之后 /etc/nginx/nginx.conf 配置文件类似如下:

  1. events {
  2. worker_connections 66536;
  3. use epoll;
  4. multi_accept on;
  5. }

HTTP和TCP优化

Keep Alive

Keep Alive 可以实现客户端浏览器较少的重连:

  • keepalive_timeoutkeepalive_requests 控制 keep alive 设置
  • sendfile 用户优化静态文件
  • tcp_nodelay 允许 Nginx 将多个 buffer 作为单独数据包发送
  • tcp_nopush 用于激活 TCP 栈的 TCP_CORK 选项

配置好之后 /etc/nginx/nginx.conf 配置文件类似如下:

  1. keepalive_timeout 65;
  2. keepalive_requests 100000;
  3. sendfile on;
  4. tcp_nopush on;
  5. tcp_nodelay on;

Buffer大小

Buffer 的相关配置用于调整缓冲区大小,如果 Buffer 配置过低,Nginx 将需要写入临时文件,则会发到过多的磁盘 I/O。

  • client_body_buffer_size 用于处理客户端的缓冲区大小,大多数客户端 buffer 来自由 POST 方式提交的表单,因此将其设置为 128K 是个不错的选择。
  • client_max_body_size 用于限定缓冲区大小的最大值,如果请求大小超过所配置的值,则会给客户端返回 413 错误(浏览器一般不会显示 413 错误)。
  • client_header_buffer_size 用于处理客户端 header 大小,使用默认的 1K 便可。
  • large_client_header_buffers 显示大客户端 header 的最大值和大小,4 header 和 4k buffer 应该够用。
  • output_buffers 设置从磁盘读取缓冲区响应的数量和大小。如果可能,客户端数据传输将被延迟,直到 Nginx 汇集到适合的数据大小。

配置好之后 /etc/nginx/nginx.conf 配置文件类似如下:

  1. client_body_buffer_size 128k;
  2. client_max_body_size 10m;
  3. client_header_buffer_size 1k;
  4. large_client_header_buffers 44k;
  5. output_buffers 132k;
  6. postpone_output 1460;

连接队列

/etc/sysctl.conf 配置文件选项可用于设置 Linux 连接队列和 buckets 大小,更改其 net.core.somaxconnnet.ipv4.tcp_max_tw_buckets 大小可以改变 Nginx 的等待时间。

配置好之后 /etc/sysctl.conf 配置文件类似如下:

  1. net.core.somaxconn =65536
  2. net.ipv4.tcp_max_tw_buckets =1440000

超时配置

超时配置其实也可以显著提高 Nginx 性能:

  • client_body_timeout 用于设置发送主体的超时时间
  • sent_timeout 用于设定客户端的超时响应时间
  • client_header_timeout 用于配置客户端 header 请求之后的发送时间

配置好之后 /etc/nginx/nginx.conf 配置文件类似如下:

  1. client_header_timeout 3m;
  2. client_body_timeout 3m;
  3. send_timeout 3m;

gzip压缩

对于纯文本内容,Nginx 可以使用 gzip 压缩,我们可以使用如下参数指定需要压缩的类型。

配置好之后 /etc/nginx/nginx.conf 配置文件类似如下:

  1. gzip on;
  2. gzip_min_length 1000;
  3. gzip_types: text/html application/x-javascript text/css application/javascript text/javascript text/plain text/xml application/json application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/xml font/eot font/opentype font/otf image/svg+xml image/vnd.microsoft.icon;
  4. gzip_disable "MSIE [1-6]\.";

静态文件缓存

如果你的网站在大量静态资源(如CSS/JS/图片),Nginx 可以配置静态文件缓存。我们可以使用如下配置来设置缓存文件类型及缓存时间:

  1. location ~*.(woff|eot|ttf|svg|mp4|webm|jpg|jpeg|png|gif|ico|css|js)$ {
  2. expires 365d;
  3. }

文件系统优化

以下配置会提高系统对内存的管理能力,我们需要修改 /etc/sysctl.conf 配置文件。

当 Nginx 作为代理服务器使用时,每当连接到上游服务器都会使用一个临时的端口。我们可以使用如下命令将服务器本地 IPv4 端口限定在一个固定的区间:

  1. net.ipv4.ip_local_port_range 102465000

TCP FIN 超时的时候,端口必须处于非活动状态,才可以再次用于另一个连接。默认超时时间为 60 秒,我们可以将其减少为 30 秒甚至 15 秒:

  1. net.ipv4.tcp_fin_timeout 15

TCP 窗口的缩放选项可以将接收的窗口大小设置为最大 65535 bytes,该 TCP 选项可以使用如下命令来激活:

  1. net.ipv4.tcp_window_scaling =1

net.ipv4.tcp_max_syn_backlog参数可以配置内核可积压的数据包大小,超过其值便会被丢弃,我们可以将其设置为如下参考值:

  1. net.ipv4.tcp_max_syn_backlog =3240000

我们可以配置在客户端丢失响应时关闭连接

  1. reset_timedout_connection on;

当然,管理员可以选择有条件的记录日志,以下配置示例将不记录 HTTP 响应代码为 2XX 和 3XX 的日志:

/etc/nginx/nginx.conf 配置文件添加

  1. map $status $loggable {
  2. ~^[23]0;
  3. default1;
  4. }

更多Nginx相关教程见以下内容

Nginx 的详细介绍:请点这里
Nginx 的下载地址:请点这里

相关推荐