Nginx缓存原理详解:如何提高10倍性能!

Nginx是大型架构的核心,下面我重点详解Nginx缓存@mikechen

Nginx缓存

Nginx 缓存:是构建高并发架构的“核武器”。

Nginx缓存原理详解:如何提高10倍性能!

它通过将后端服务器(如 Tomcat、PHP-FPM)处理后的结果存储在本地。

让后续相同的请求直接由 Nginx 响应,从而实现毫秒级的访问速度。

 

Nginx缓存工作原理

Nginx作为高性能反向代理/HTTP服务器,其缓存机制主要基于代理缓存(proxy_cache)与FastCGI缓存(fastcgi_cache)。

通过将上游服务器响应存储于本地磁盘或内存,以减少对后端的请求频率与响应延迟。

Nginx缓存原理详解:如何提高10倍性能!

其工作流程如下:

请求拦截:客户端发起请求,Nginx 首先检查本地缓存目录下是否存在该请求的“指纹”(URL 的 MD5 摘要)。

命中(Hit):如果缓存存在且未过期,直接读取磁盘文件并返回,不触发后端请求。

缺失/过期(Miss/Expired):如果不存在或已过期,Nginx 将请求转发给后端服务器。

获取数据后一方面返回给客户端,另一方面异步存入本地磁盘。

 

Nginx缓存实战案例

Nginx缓存,适用于典型的高并发Web应用场景。

http {
    # 定义缓存存储路径、层级、内存区域大小、磁盘上限、过期时间
    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:100m 
                     max_size=10g inactive=60m use_temp_path=off;

    server {
        location /api/ {
            proxy_cache my_cache;               # 启用名为 my_cache 的空间
            proxy_cache_key $host$uri$is_args$args; # 定义缓存唯一标识
            
            # 针对不同状态码设置缓存时间
            proxy_cache_valid 200 302 10m;
            proxy_cache_valid 404 1m;

            # 添加命中状态响应头(方便调试)
            add_header Nginx-Cache "$upstream_cache_status";

            proxy_pass http://backend_server;
        }
    }
}

缓存锁(Cache Lock): 当缓存过期时,如果有 1000 个并发请求进来,proxy_cache_lock on。

会确保只有一个请求去后端取数据,其他 999 个等待该请求完成后直接读取缓存,防止缓存击穿。

陈旧数据兜底(Stale Content): proxy_cache_use_stale error timeout updating;。

当后端服务器宕机时,Nginx 依然可以返回过期的缓存内容给用户,确保服务不中断。

零拷贝与异步 IO: 配合 sendfile on; 和 aio on。

提升从磁盘读取缓存文件并发送到网卡的效率。

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧