Nginx作为高性能Web服务器与反向代理,其缓存机制是提升网站性能的关键手段。通过将后端响应(静态资源、动态内容)存储在本地(内存或磁盘),Nginx可在后续相同请求中直接返回缓存内容,减少后端服务器负载、降低网络延迟、提高响应速度(尤其适用于高并发场景)。
作用:作为反向代理时,缓存后端服务器(如应用服务器、API服务器)的响应,适用于动态内容(如首页、列表页)或静态资源的代理场景。
核心指令:proxy_cache_path(定义缓存路径、大小)、proxy_cache(启用缓存)、proxy_cache_valid(设置缓存有效期)。
示例配置:
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_proxy_cache:10m max_size=1g inactive=60m;
server {
location / {
proxy_cache my_proxy_cache;
proxy_pass http://backend_server;
proxy_cache_valid 200 302 10m; # 200/302状态码缓存10分钟
proxy_cache_valid 404 1m; # 404状态码缓存1分钟
}
}
}
作用:直接缓存图片、CSS、JavaScript等静态资源,利用浏览器Cache-Control头部减少重复请求,提升页面加载速度。
核心指令:expires(设置浏览器缓存时间)、add_header Cache-Control(控制缓存行为)。
示例配置:
server {
location ~* \.(jpg|jpeg|png|gif|css|js)$ {
expires 365d; # 浏览器缓存1年
add_header Cache-Control "public, no-transform"; # 允许公共缓存,不转换内容
}
}
作用:针对PHP、Python等动态应用,缓存FastCGI服务器的响应(如PHP-FPM生成的HTML页面),减少脚本执行次数。
核心指令:fastcgi_cache_path(定义缓存路径)、fastcgi_cache(启用缓存)、fastcgi_cache_valid(设置缓存有效期)。
示例配置:
http {
fastcgi_cache_path /var/cache/nginx/fcgi levels=1:2 keys_zone=my_fcgi_cache:10m max_size=1g inactive=60m;
server {
location ~ \.php$ {
fastcgi_cache my_fcgi_cache;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_cache_valid 200 30m; # 200状态码缓存30分钟
}
}
}
proxy_cache_path(反向代理缓存路径)levels=1:2:缓存目录层级(1级目录+2级子目录,如/var/cache/nginx/a/b/),避免单个目录文件过多;keys_zone=my_cache:10m:共享内存区域(用于存储缓存键),10m表示10MB内存;max_size=1g:缓存最大容量(1GB),超过后自动清理旧缓存;inactive=60m:缓存未访问的超时时间(60分钟),超时则删除。proxy_cache_valid(缓存有效期)proxy_cache_valid 200 302 10m;表示200(成功)和302(重定向)状态码的响应缓存10分钟。add_header(缓存状态标识)X-Proxy-Cache:显示缓存状态(HIT表示命中、MISS表示未命中、EXPIRED表示过期);Cache-Control:控制浏览器缓存行为(如public表示允许公共缓存、no-transform表示不转换内容)。add_header X-Proxy-Cache $upstream_cache_status;$scheme$proxy_host$request_uri(协议、主机名、URI),可通过proxy_cache_key自定义(如排除查询参数proxy_cache_key "$scheme$proxy_host$request_uri"),减少因参数变化导致的缓存未命中。inactive参数:根据业务场景设置合理的未访问超时时间(如静态资源设为30d,动态内容设为1h),避免频繁清理缓存。GET请求(if ($request_method = GET) { proxy_cache my_cache; }),避免POST(含用户提交数据)或PUT/DELETE(修改数据)请求的缓存。365d,动态内容(如首页)设为10m,兼顾性能与数据新鲜度。cron定时任务(如0 0 * * * nginx -s reload)每天凌晨重新加载Nginx,清理过期缓存;或利用inactive参数自动清理长期未访问的缓存。/purge接口(需授权),使用proxy_cache_purge模块清除指定URL的缓存(如curl -X PURGE http://example.com/purge?url=/path/to/resource)。proxy_ignore_headers Set-Cookie忽略响应中的Set-Cookie头部,防止缓存带会话信息的响应。内存缓存(proxy_cache_path的keys_zone),大量静态数据(如图片)用磁盘缓存(/var/cache/nginx),平衡速度与容量。proxy_cache、fastcgi_cache),Ubuntu默认仓库的Nginx通常已包含这些模块。