NGINX 性能调优的五大技巧
【摘要】 NGINX 作为一种高性能的 HTTP 服务器和反向代理,广泛用于处理大量并发请求的 Web 服务。然而,默认配置并不能完全满足所有场景的性能需求,因此进行性能调优是确保 NGINX 在高负载下依然保持稳定和快速响应的关键。本文将深入探讨 NGINX 性能调优的五大技巧,涵盖了从基础配置到高级优化的方方面面。这些技巧不仅适用于处理高并发请求的 Web 服务器,也适合反向代理、负载均衡等多种使...
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;
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)