NGINX 性能调优的五大技巧

简介: 【8月更文挑战第27天】

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;
目录
相关文章
|
4月前
|
缓存 前端开发 JavaScript
tomcat核心技术+Nginx性能调优技术
而Tomcat的基本配置,每个配置项也基本上对应了Tomcat的组件结构,如果要用一张图来形象展现一下Tomcat组成的话
95 1
|
4月前
|
网络协议 应用服务中间件 测试技术
Yarp 与 Nginx性能大比拼不出所料它胜利了!
Yarp 与 Nginx性能大比拼不出所料它胜利了!
120 0
|
10月前
|
应用服务中间件 Linux nginx
直接部署nginx和在docker里面部署nginx性能上有区别吗
直接部署nginx和在docker里面部署nginx性能上有区别吗
394 0
|
1月前
|
缓存 负载均衡 Java
SpringBoot 与 Nginx 配置优化:性能拉满的关键学习方法
【8月更文挑战第1天】在现代Web开发领域,SpringBoot以其快速启动、简化配置的特性成为众多开发者的首选框架,而Nginx则以其高性能的HTTP和反向代理服务器功能著称。将两者结合,并通过精细的配置优化,可以显著提升Web应用的性能与稳定性。以下是为您学生定制的SpringBoot与Nginx配置优化的学习方法与研究路径。
54 1
|
1月前
|
网络协议 应用服务中间件 测试技术
nginx参数调优能提升多少性能
nginx参数调优能提升多少性能
|
2月前
|
缓存 负载均衡 监控
Nginx性能调优5招35式不可不知的策略实战
以上 V 哥总结的5个方面关于 Nginx性能调优的策略,实际应用中需要结合实际项目的情况来测试,希望对你有帮助,欢迎关注威哥爱编程,技术路上我们一起成长。
|
4月前
|
存储 缓存 前端开发
掌握Nginx缓存策略:提高网站性能,降低响应时间
掌握Nginx缓存策略:提高网站性能,降低响应时间
392 1
|
4月前
|
应用服务中间件 网络安全 nginx
Nginx性能调优策略
Nginx性能调优策略
60 0
Nginx性能调优策略
|
4月前
|
弹性计算 算法 应用服务中间件
倚天使用|Nginx性能高27%,性价比1.5倍,基于阿里云倚天ECS的Web server实践
倚天710构建的ECS产品,基于云原生独立物理核、大cache,结合CIPU新架构,倚天ECS在Nginx场景下,具备强大的性能优势。相对典型x86,Http长连接场景性能收益27%,开启gzip压缩时性能收益达到74%。 同时阿里云G8y实例售价比G7实例低23%,是Web Server最佳选择。
|
4月前
|
监控 安全 应用服务中间件