Nginx缓存性能实战:提升10倍性能关键!

Nginx是大型架构核心,下面我详解Nginx 缓存性能实战@mikechen

Nginx 缓存

Nginx 缓存,是提升 Web 服务性能的重要手段之一。

在高并发访问场景中,缓存能够有效减少后端应用与数据库压力,显著缩短响应时间,甚至带来数量级的性能提升。

Nginx缓存性能实战:提升10倍性能关键!-mikechen

比如:大量请求的内容具有重复性,例如静态资源、页面片段、接口响应等。

如果每次都回源处理,不仅浪费计算资源,还会增加后端故障风险。

通过缓存,Nginx 可以直接从本地磁盘或内存中返回结果,大幅降低响应延迟。

 

Nginx 缓存核心机制

Nginx 缓存核心机制以及原理,主要包括缓存键、缓存过期、缓存刷新和缓存淘汰。

Nginx缓存性能实战:提升10倍性能关键!-mikechen

Nginx 会根据请求 URL、参数、Header 等生成缓存键,并将上游响应存储到缓存目录中。

当相同请求再次到来时,若缓存未过期,则直接命中返回。

若已过期,则可能触发回源更新,该机制兼顾了性能与数据一致性。

 

Nginx 缓存配置实战

在生产级配置实战以及调优方面,需要重点关注缓存路径规划、缓存大小、过期策略、缓存锁、缓存预热和错误回源等参数。

Nginx缓存性能实战:提升10倍性能关键!-mikechen

http {
    # 1. 定义缓存轨道 proxy_cache_path
    # path: 磁盘存储路径
    # levels: 目录分级(1:2 表示两级子目录)
    # keys_zone: 共享内存名称及大小(10m 可存约 8万个 Key)
    # max_size: 磁盘最大缓存上限(超过后 Cache Manager 触发 LRU 清理)
    # inactive: 10分钟内未被访问的数据自动剔除(无论是否过期)
    # use_temp_path=off: 直接写入最终目录,避免跨分区 rename 开销
    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:20m max_size=10g inactive=10m use_temp_path=off;

    upstream backend_service {
        server 10.0.0.10:8080 weight=5 max_fails=2 fail_timeout=10s;
        server 10.0.0.11:8080 weight=5 max_fails=2 fail_timeout=10s;
        keepalive 32; # 保持长连接,极大提升回源性能
    }

    server {
        listen 80;
        server_name api.example.com;

        # 添加响应头,方便 Debug 调试缓存命中状态
        add_header X-Cache-Status $upstream_cache_status;

        location /api/goods/ {
            # 2. 启用缓存规则
            proxy_cache my_cache;
            proxy_cache_key "$scheme$request_method$host$request_uri";

            # 3. 针对不同 HTTP 状态码设置缓存时间
            proxy_cache_valid 200 302 5m;
            proxy_cache_valid 404      1m;

            # 4. 防击穿:只允许一个并发请求回源
            proxy_cache_lock on;
            proxy_cache_lock_timeout 5s;

            # 5. 容灾降级:后端故障/超时/5xx 时使用过期缓存响应
            proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;

            # 6. 设置最少访问次数才触发缓存(防冷门数据污染)
            proxy_cache_min_uses 1;

            # 7. 忽略部分限制缓存的 Header(按需配置)
            # 默认情况下,后端如果返回 Set-Cookie 或 Cache-Control: no-cache,Nginx 不会缓存
            proxy_ignore_headers Set-Cookie Cache-Control Expires;
            proxy_hide_header Set-Cookie;

            # 代理转发
            proxy_pass http://backend_service;
            proxy_http_version 1.1;
            proxy_set_header Connection "";
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

例如,可通过合理设置 proxy_cache_pathproxy_cache_validproxy_cache_lock 来提升命中率并避免缓存击穿。

同时,还应结合业务特点区分强一致数据与可容忍短暂延迟的数据,避免“一刀切”式缓存策略。

总体而言,Nginx 缓存的价值不仅在于加速,更在于削峰、降载和保护后端系统,是高性能架构中不可或缺的一环。

评论交流
    说说你的看法