Nginx性能优化指南
Nginx 是世界知名的高性能 Web 服务器和负载均衡器,本 Nginx 性能优化指南旨在帮助大家快速进行 Nginx 服务器性能优化,以便快速向用户交付网站内容。
配置Worker
最简单的优化便是修改 Worker 和配置连接数。
Worker进程
如果你在同一台服务器上运行 Nginx 和数据库,而且网站流量较少的话,可以在 nginx.conf 配置文件中设置 worker_processes 1;
如果你网站流量较大或 Nginx 作为单服务器运行,便可以为每 CPU 核心分配 Worker,worker_processes auto;
如果你不想自动配置而要手动设置的话,可以使用如下命令查看 CPU 核心数并更改 worker_processes 数量。
- grep ^processor /proc/cpuinfo | wc –l
Worker连接数
worker_connections 设置可以配置每 Worker 进程在同一时间的最大连接数。默认情况下,Worker 连接数被限制为 512,但事实上系统可以处理更多在连接。
Worker 连接数设置为多少其实可以通过查看系统核心的限制找到,只需使用如下命令即可:
- ulimit –n
我们还可以设置使用 use epoll 机制,该选项为 I/O 事件通知机制可确保最大化的 I/O 利用能力。
最后,我们可以使用 multi_accept 让 Worker 能够在同一时间接受所有新的连接。
以上事件机制配置好之后 /etc/nginx/nginx.conf 配置文件类似如下:
- events {
- worker_connections 66536;
- use epoll;
- multi_accept on;
- }
HTTP和TCP优化
Keep Alive
Keep Alive 可以实现客户端浏览器较少的重连:
- keepalive_timeout 和 keepalive_requests 控制 keep alive 设置
- sendfile 用户优化静态文件
- tcp_nodelay 允许 Nginx 将多个 buffer 作为单独数据包发送
- tcp_nopush 用于激活 TCP 栈的 TCP_CORK 选项
配置好之后 /etc/nginx/nginx.conf 配置文件类似如下:
- keepalive_timeout 65;
- keepalive_requests 100000;
- sendfile on;
- tcp_nopush on;
- 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 配置文件类似如下:
- client_body_buffer_size 128k;
- client_max_body_size 10m;
- client_header_buffer_size 1k;
- large_client_header_buffers 44k;
- output_buffers 132k;
- postpone_output 1460;
连接队列
/etc/sysctl.conf 配置文件选项可用于设置 Linux 连接队列和 buckets 大小,更改其 net.core.somaxconn 和 net.ipv4.tcp_max_tw_buckets 大小可以改变 Nginx 的等待时间。
配置好之后 /etc/sysctl.conf 配置文件类似如下:
- net.core.somaxconn =65536
- net.ipv4.tcp_max_tw_buckets =1440000
超时配置
超时配置其实也可以显著提高 Nginx 性能:
- client_body_timeout 用于设置发送主体的超时时间
- sent_timeout 用于设定客户端的超时响应时间
- client_header_timeout 用于配置客户端 header 请求之后的发送时间
配置好之后 /etc/nginx/nginx.conf 配置文件类似如下:
- client_header_timeout 3m;
- client_body_timeout 3m;
- send_timeout 3m;
gzip压缩
对于纯文本内容,Nginx 可以使用 gzip 压缩,我们可以使用如下参数指定需要压缩的类型。
配置好之后 /etc/nginx/nginx.conf 配置文件类似如下:
- gzip on;
- gzip_min_length 1000;
- 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;
- gzip_disable "MSIE [1-6]\.";
静态文件缓存
如果你的网站在大量静态资源(如CSS/JS/图片),Nginx 可以配置静态文件缓存。我们可以使用如下配置来设置缓存文件类型及缓存时间:
- location ~*.(woff|eot|ttf|svg|mp4|webm|jpg|jpeg|png|gif|ico|css|js)$ {
- expires 365d;
- }
文件系统优化
以下配置会提高系统对内存的管理能力,我们需要修改 /etc/sysctl.conf 配置文件。
当 Nginx 作为代理服务器使用时,每当连接到上游服务器都会使用一个临时的端口。我们可以使用如下命令将服务器本地 IPv4 端口限定在一个固定的区间:
- net.ipv4.ip_local_port_range 102465000
TCP FIN 超时的时候,端口必须处于非活动状态,才可以再次用于另一个连接。默认超时时间为 60 秒,我们可以将其减少为 30 秒甚至 15 秒:
- net.ipv4.tcp_fin_timeout 15
TCP 窗口的缩放选项可以将接收的窗口大小设置为最大 65535 bytes,该 TCP 选项可以使用如下命令来激活:
- net.ipv4.tcp_window_scaling =1
net.ipv4.tcp_max_syn_backlog参数可以配置内核可积压的数据包大小,超过其值便会被丢弃,我们可以将其设置为如下参考值:
- net.ipv4.tcp_max_syn_backlog =3240000
我们可以配置在客户端丢失响应时关闭连接
- reset_timedout_connection on;
当然,管理员可以选择有条件的记录日志,以下配置示例将不记录 HTTP 响应代码为 2XX 和 3XX 的日志:
/etc/nginx/nginx.conf 配置文件添加
- map $status $loggable {
- ~^[23]0;
- default1;
- }
更多Nginx相关教程见以下内容:
Nginx 的详细介绍:请点这里
Nginx 的下载地址:请点这里