NGINX 性能调优的五大技巧
NGINX 作为一种高性能的 HTTP 服务器和反向代理,广泛用于处理大量并发请求的 Web 服务。然而,默认配置并不能完全满足所有场景的性能需求,因此进行性能调优是确保 NGINX 在高负载下依然保持稳定和快速响应的关键。
本文将深入探讨 NGINX 性能调优的五大技巧,涵盖了从基础配置到高级优化的方方面面。这些技巧不仅适用于处理高并发请求的 Web 服务器,也适合反向代理、负载均衡等多种使用场景。
优化 worker 进程与连接数
NGINX 的 worker 进程是处理客户端请求的关键组件。默认情况下,NGINX 通常配置为一个或少数几个 worker 进程,但这可能无法充分利用多核 CPU 的处理能力。
要优化 worker 进程数,首先需要根据服务器的 CPU 核数来设置。每个 worker 进程可以绑定到一个 CPU 核,以最大化并行处理能力。你可以在 NGINX 的配置文件 /etc/nginx/nginx.conf
中设置 worker_processes
参数:
worker_processes auto;
auto
值会自动检测 CPU 核数,并为每个核分配一个 worker 进程。如果你希望手动设置,可以直接指定进程数:
worker_processes 4;
每个 worker 进程处理的连接数也影响 NGINX 的性能。worker_connections
参数决定了每个 worker 进程能处理的最大连接数。这个值应该根据你的服务器资源和预期的负载来设置。
在同一个配置文件中,你可以设置 worker_connections
参数:
worker_connections 1024;
这个值意味着每个 worker 进程最多可以同时处理 1024 个连接。你可以通过以下公式计算 NGINX 能处理的最大并发连接数:
最大并发连接数 = worker_processes * worker_connections
例如,如果你有 4 个 worker 进程,每个进程处理 1024 个连接,那么 NGINX 可以处理 4096 个并发连接。
启用与优化缓存
缓存是提高 NGINX 性能的有效手段,尤其是在处理静态内容或反向代理请求时。通过缓存常用的内容,可以减少服务器的负载并加快响应时间。
要启用缓存,首先需要定义缓存路径。你可以在配置文件中使用 proxy_cache_path
指令:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m max_size=1g;
/var/cache/nginx
是缓存文件存储的路径。levels=1:2
决定了缓存目录结构。keys_zone=my_cache:10m
定义了缓存区域及其大小。inactive=60m
指定了未被访问的缓存内容在 60 分钟后过期。max_size=1g
限制了缓存区域的最大大小为 1GB。
在定义缓存路径后,你需要在 server 或 location 块中启用缓存:
location / {
proxy_cache my_cache;
proxy_pass http://backend;
proxy_cache_bypass $http_cache_control;
}
proxy_cache my_cache
启用了先前定义的缓存区域。proxy_pass http://backend
指定了代理的后端服务器。proxy_cache_bypass
用于控制在特定条件下跳过缓存,例如当客户端发出特定的Cache-Control
请求头时。
为了进一步优化缓存,可以考虑以下几点:
- 使用
proxy_cache_valid
设置缓存时间:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
这意味着状态码为 200 或 302 的响应将被缓存 10 分钟,而状态码为 404 的响应则缓存 1 分钟。
- 使用
proxy_cache_use_stale
指令,在后端服务器不可用时使用过期的缓存:
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
这样,即使后端服务器宕机或超时,NGINX 仍然可以为客户端提供缓存的内容,从而提高可用性。
使用 gzip 压缩传输内容
gzip 压缩是一种减少响应体大小、加快数据传输速度的有效方法。NGINX 支持通过 gzip 压缩 HTTP 响应内容,从而减少带宽消耗并提高页面加载速度。
要启用 gzip 压缩,在 nginx.conf
文件中添加以下配置:
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 1024;
gzip_comp_level 5;
gzip_vary on;
gzip on;
启用 gzip 压缩。gzip_types
指定要压缩的 MIME 类型,确保你只压缩可以显著受益于压缩的内容。gzip_min_length 1024;
设置响应体的最小长度,只有超过这个长度的响应体才会被压缩。gzip_comp_level 5;
设置 gzip 的压缩级别,范围为 1(最低)到 9(最高)。5 是一个折衷选择,可以在压缩率和 CPU 消耗之间取得平衡。gzip_vary on;
使 NGINX 添加Vary: Accept-Encoding
响应头,以便客户端和代理服务器能够正确处理缓存的压缩内容。
除了基本的 gzip 配置,你还可以进一步优化,以平衡性能和压缩率:
- 使用
gzip_proxied
控制在代理请求中是否启用 gzip:
gzip_proxied any;
- 通过
gzip_buffers
调整用于存储压缩数据的缓冲区:
gzip_buffers 16 8k;
这意味着 NGINX 将为每个请求分配 16 个 8KB 的缓冲区来存储压缩数据。
配置连接复用与 keepalive
keepalive 连接允许客户端在同一个 TCP 连接上发送多个 HTTP 请求,减少了建立新连接的开销,提高了请求的响应速度。要启用 keepalive 连接,可以在 nginx.conf
文件的 server 或 location 块中配置:
keepalive_timeout 65;
keepalive_requests 100;
keepalive_timeout 65;
设置服务器在关闭 keepalive 连接前等待的时间(以秒为单位)。65 秒是一个常用的值,适合大多数场景。keepalive_requests 100;
限制每个连接的最大请求数,超过这个值后,连接将被关闭。
如果你在使用 NGINX 作为反向代理或负载均衡器,也可以为后端服务器配置 keepalive,以减少后端服务器的连接开销。你可以在 upstream 块中添加以下配置:
upstream backend {
server backend1.example.com;
server backend2.example.com;
keepalive 32;
}
keepalive 32;
指定 NGINX 为每个 worker 进程维护的后端服务器 keepalive 连接数。
连接复用是通过复用 HTTP/2 和 keepalive 连接来减少连接建立和拆除的开销,从而提高性能。在支持 HTTP/2 的环境中,你可以启用 HTTP/2 并结合 keepalive 使用:
server {
listen 443 ssl http2;
...
}
http2;
启用 HTTP/2 协议,它支持更高效的连接复用和数据传输。
调整系统内核参数与资源限制
NGINX 需要大量的文件描述符来处理并发连接。Linux 系统默认的文件描述符限制可能不够,需要手动调整。你可以在 /etc/security/limits.conf
文件中添加以下配置:
* soft nofile 65536
* hard nofile 65536
soft nofile 65536;
设置用户的软文件描述符限制。hard nofile 65536;
设置用户的硬文件描述符限制。
然后在 NGINX 配置文件中指定使用更多的文件描述符:
worker_rlimit_nofile 65536;
- 点赞
- 收藏
- 关注作者
评论(0)