Nginx缓存性能实战:手把手教你提升10倍性能!

Nginx是大厂必备技能,下面我详解Nginx缓存性能实战@mikechen

Nginx缓存

Nginx作为高性能反向代理和Web服务器,其内置缓存机制(proxy_cache / fastcgi_cache)是实现极致性能的核心武器。

Nginx缓存性能实战:手把手教你提升10倍性能!-mikechen

正确配置后,能将后端负载降低90%以上,TTFB(Time To First Byte)从几百毫秒降到几毫秒。

 

Nginx缓存原理

Nginx缓存请求流程,如下所示:

Nginx缓存性能实战:手把手教你提升10倍性能!-mikechen

请求到达:Nginx 接收到请求,根据定义的 proxy_cache_key 生成唯一哈希值(Key) 。

查找缓存:在共享内存中查找该 Key 对应的元数据(是否过期、文件路径等) 。

命中与回源:

命中(HIT):直接从磁盘读取内容返回给客户端 。

MISS:请求转发到后端,获取响应后将其写入本地磁盘,并更新共享内存元数据 。

失效管理:通过 inactive 时间自动清理长期未被访问的文件,或通过 max_size 限制最大磁盘占用 。

 

Nginx缓存实战

1. 缓存区域定义 (proxy_cache_path)

这是缓存的基石,建议在 http 块中配置 。

http {
    # proxy_cache 示例(适用于反向代理后端 HTTP 服务)
    proxy_cache_path /var/cache/nginx/proxy_cache 
        levels=1:2                  # 目录层级,避免单目录文件过多导致 I/O 慢
        keys_zone=my_cache:100m     # 共享内存区(索引),100m 可存约 80 万条记录
        max_size=10g                # 最大磁盘占用,超出后 LRU 淘汰
        inactive=60m                # 60 分钟未访问自动清理
        use_temp_path=off;          # 直接写缓存目录,避免临时文件 I/O 开销

    # fastcgi_cache 示例(适用于 PHP-FPM 等 FastCGI 后端)
    fastcgi_cache_path /var/cache/nginx/fastcgi_cache 
        levels=1:2 
        keys_zone=php_cache:100m 
        max_size=5g 
        inactive=60m 
        use_temp_path=off;
}

levels=1:2:缓存文件分散到两层子目录(如 /e/7b/xxx),极大提升文件查找速度。

keys_zone:放在共享内存中,Nginx Worker 进程能快速判断 HIT/MISS,无需每次查磁盘。

use_temp_path=off:减少不必要的磁盘写入,提高性能。

 

2. 精细化缓存策略 (proxy_cache_valid)

决定缓存生效时间,避免缓存过久导致内容更新不及时 。

配置示例:

proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m;

原理与技巧:明确指定仅缓存 HTTP 200/302 成功响应。

不要缓存 5xx 错误,否则会导致服务瘫痪期间用户持续看到错误页面 。

 

3. 防止缓存击穿 (proxy_cache_lock)

在高并发场景下,如果大量请求同时 MISS,都会穿透到后端造成“缓存击穿” 。

配置示例:

proxy_cache_lock on; proxy_cache_lock_timeout 5s;

开启 lock 后,当多个相同请求同时到达时,只有一个请求能回源后端。

其余请求在 Nginx 内部等待,直到第一个请求写入缓存,这能瞬间降低后端压力 。

 

4.静态文件

静态文件(图片、CSS、JS)适合浏览器端 + Nginx 端双缓存,能让页面加载速度提升数倍。

server {
    listen 80;
    server_name example.com;

    # 静态资源长缓存
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff2)$ {
        expires 30d;                          # 浏览器缓存 30 天
        add_header Cache-Control "public, immutable";  # 告诉浏览器无需重新验证
        access_log off;                       # 减少日志 I/O
        try_files $uri =404;
    }
}

结合 gzip 压缩,进一步减少传输量:

gzip on;
gzip_vary on;
gzip_min_length 1k;
gzip_comp_level 6;      # 平衡 CPU 与压缩率
gzip_types text/plain text/css application/javascript application/json;

然后,结合监控命中率。

在 access_log 中记录 $upstream_cache_status,或用 nginx -V 检查模块。

 

评论交流
    说说你的看法