NGINX 性能调优的五大技巧

举报
wljslmz 发表于 2024/08/27 17:32:45 2024/08/27
【摘要】 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。