IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Nginx 从配置到缓存的性能优化

    Teacher Du发表于 2025-05-06 08:20:35
    love 0

    Nginx 是一个高性能的 HTTP 服务器和反向代理服务器,广泛应用于处理高并发请求。然而,默认配置并不一定适合所有场景,尤其是在高流量或复杂业务逻辑的情况下。本文将介绍一些 Nginx 的基础配置优化和缓存的使用方法以提升 Nginx 的性能。

    基础配置优化

    1. 调整 worker_processes 以及 worker_connections

    Nginx 使用多进程模型处理请求。worker_processes 定义 Nginx 使用的工作进程数,而 worker_connections 定义每个工作进程可以处理的最大连接数:

    1
    2
    3
    4
    worker_processes auto;
    events {
    worker_connections 1024;
    }

    参数作用如下:

    参数作用
    worker_processes设置为 auto 可以让 Nginx 自动根据 CPU 核心数来分配工作进程数。如服务器有 4 个 CPU 核心,Nginx 会启动 4 个工作进程。
    worker_connections这个值决定了每个工作进程可以处理的最大连接数。通常,可根据服务器的内存和网络带宽来调整这个值。1024 是一个常见起点,可以调整到 2048。
    1. 启用 keepalive 长连接

    HTTP 协议中的 keepalive 机制允许客户端和服务器在同一个连接上发送多个请求,减少了 TCP 连接的建立和关闭开销:

    1
    2
    3
    4
    http {
    keepalive_timeout 65;
    keepalive_requests 100;
    }

    参数作用如下:

    参数作用
    keepalive_timeout定义客户端与服务器保持连接的时间。设置为 65 秒意味着如果客户端在 65 秒内没有发送新请求,连接将被关闭。
    keepalive_requests定义了单个连接上允许的最大请求数。设置为 100 意味着一个连接可以处理 100 个请求后关闭。
    1. 调整 buffer 的大小

    Nginx 使用缓冲区来存储请求和响应数据。如缓冲区设置过小,Nginx 可能会频繁地进行磁盘 I/O 操作,影响性能:

    1
    2
    3
    4
    5
    http {
    client_body_buffer_size 10K;
    client_header_buffer_size 1k;
    large_client_header_buffers 48k;
    }

    参数作用如下:

    参数作用
    client_body_buffer_size定义用于存储客户端请求体的缓冲区大小。如请求体超过这个大小,会将数据写入磁盘。
    client_header_buffer_size定义用于存储客户端请求头的缓冲区大小。
    large_client_header_buffers定义用于存储大型请求头的缓冲区数量和大小。

    缓存提升性能

    1. 启动静态资源缓存

    对于静态资源,启用缓存可以显著减少服务器的负载:

    1
    2
    3
    4
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;
    add_header Cache-Control "public, no-transform";
    }

    参数作用如下:

    参数作用
    expires定义了资源的缓存时间。30d 表示资源将缓存 30 天。
    Cache-Controlpublic 表示资源可以被任何缓存「如浏览器、CDN等」缓存,no-transform 表示不允许代理服务器对资源进行转换「如压缩等」
    1. 使用代理缓存

    如使用 Nginx 作为反向代理,可启用代理缓存来缓存后端服务器的响应:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;

    server {
    location / {
    proxy_cache my_cache;
    proxy_pass http://backend;
    proxy_cache_valid 200 302 10m;
    proxy_cache_valid 404 1m;
    }
    }

    参数作用如下:

    参数作用
    proxy_cache_path定义了缓存存储的路径、缓存键的存储区域、缓存的最大大小及缓存的有效期。
    proxy_cache启用缓存并使用指定的缓存区域。
    proxy_cache_valid定义不同状态码的缓存时间。
    1. 使用 gzip 压缩减少网络传输量

    gzip 压缩可以显著减少传输数据量,从而加快页面加载速度:

    1
    2
    3
    4
    5
    6
    7
    8
    http {
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    gzip_comp_level 6;
    gzip_min_length 256;
    gzip_proxied any;
    gzip_vary on;
    }

    参数作用如下:

    参数作用
    gzip启用压缩。
    gzip_types定义了需要压缩的文件类型。通常包括文本文件、CSS/JavaScript/XML 等。
    gzip_comp_level定义压缩级别,范围是 1 到 9。1 是最低的压缩率,9 是最高的压缩率。默认值 6。
    gzip_min_length定义最小压缩文件大小。小于这个大小的文件不会被压缩。
    gzip_proxied定义了是否对代理请求启用压缩。any 表示对所有代理请求启用压缩。
    gzip_vary添加响应,确保代理服务器能正确处理缓存。

    HTTP/2 与速率限制

    1. 使用 HTTP/2 版协议

    HTTP/2 提供了多路复用、头部压缩特性,可以显著提升性能:

    1
    2
    3
    4
    5
    server {
    listen 443 ssl http2;
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;
    }

    参数作用如下:

    参数作用
    http2在 listen 指令中添加 http2 参数即可启用。
    1. 限制请求速率

    为了防止恶意请求或突发流量导致服务器过载,可使用 limit_req 模块限制请求速率:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

    server {
    location / {
    limit_req zone=one burst=5;
    }
    }
    }

    参数作用如下:

    参数作用
    limit_req_zone定义限流区域。$binary_remote_addr 表示根据客户端的 IP 地址进行限流,rate=1r/s 表每秒允许 1 个请求。
    limit_req在指定的位置应用限流。burst=5 表允许突发 5 个请求。

    LB 和日志优化

    1. 负载均衡
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    upstream backend {
    server 192.168.1.1:8080;
    server 192.168.1.2:8080;
    }

    server {
    location / {
    proxy_pass http://backend;
    }
    }

    注意:通过 upstream 模块可以将请求分发到多个后端服务器,提高并发处理能力。

    1. 日志优化
    1
    2
    access_log /var/log/nginx/access.log main buffer=16k;
    error_log /var/log/nginx/error.log warn;

    注意:调整日志级别可减少日志输出量,提升性能。这表示将访问日志的缓冲区大小设置为 16KB,并将错误日志级别设置为 warn。



沪ICP备19023445号-2号
友情链接