问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

NGINX性能调优的五大技巧

创作时间:
作者:
@小白创作中心

NGINX性能调优的五大技巧

引用
1
来源
1.
https://developer.aliyun.com/article/1597989

NGINX作为一种高性能的HTTP服务器和反向代理,广泛应用于处理大量并发请求的Web服务。然而,默认配置往往无法完全满足所有场景的性能需求。本文将深入探讨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;
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号