
配置 Nginx 缓存可以显著提升网站性能,减少后端服务器压力。以下是 全面详细的缓存配置指南,涵盖静态资源缓存、代理缓存、缓存优化策略及常见问题排查:
一、静态资源缓存
1. 基础配置(浏览器缓存)
server {
listen 80;
server_name example.com;
location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
expires 365d; # 缓存365天
add_header Cache-Control "public, immutable"; # 公共缓存,内容不可变
access_log off; # 关闭访问日志减少IO
}
}
关键指令:
expires
:设置缓存过期时间(如7d
、24h
)。Cache-Control
:覆盖expires
,现代浏览器优先使用。public
:允许代理和浏览器缓存。immutable
:资源内容不变时跳过验证(适合带哈希的文件)。
2. 带哈希资源的缓存破坏(Cache Busting)
location ~* ^/.+.([a-f0-9]+).(css|js)$ {
rewrite ^/(.+).w+.(css|js)$ /$1.$2 break; # 移除哈希部分
expires max; # 永久缓存
}
适用场景:
文件命名如 style.a1b2c3.css
,内容变化时哈希值改变,强制客户端获取新版本。
二、代理缓存(反向代理缓存后端响应)
1. 定义缓存路径和参数
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m
inactive=60m use_temp_path=off max_size=1g;
server {
location / {
proxy_pass http://backend;
proxy_cache my_cache; # 启用缓存
proxy_cache_key "$scheme$request_method$host$request_uri"; # 缓存键
proxy_cache_valid 200 302 10m; # 缓存200/302状态码10分钟
proxy_cache_valid 404 1m; # 缓存404状态码1分钟
}
}
}
参数说明:
参数 | 作用 |
---|---|
levels |
缓存目录层级(如 1:2 表示1级子目录,每级2字符)。 |
keys_zone |
共享内存区名称和大小(10m 可存储约8万键)。 |
inactive |
缓存未被访问的保留时间(超时自动删除)。 |
max_size |
缓存总大小限制(如 1g )。 |
use_temp_path |
禁用临时路径,直接写入缓存目录。 |
2. 高级缓存控制
location / {
proxy_cache my_cache;
proxy_cache_lock on; # 防止缓存击穿(同一请求只回源一次)
proxy_cache_use_stale error timeout updating; # 源站异常时返回旧缓存
proxy_cache_background_update on; # 后台更新缓存
add_header X-Cache-Status $upstream_cache_status; # 显示缓存命中状态
}
缓存命中头:
X-Cache-Status: HIT
(命中缓存)X-Cache-Status: MISS
(未命中)
三、FastCGI 缓存(PHP/Python 等动态内容)
http {
fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=fcgi_cache:10m inactive=60m;
server {
location ~ .php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_cache fcgi_cache;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_valid 200 60m;
fastcgi_cache_bypass $no_cache; # 通过条件跳过缓存
fastcgi_no_cache $no_cache; # 定义不缓存的条件
}
}
}
跳过缓存的场景示例:
set $no_cache 0;
if ($request_method = POST) { set $no_cache 1; } # POST请求不缓存
if ($query_string != "") { set $no_cache 1; } # 带参数的URL不缓存
四、缓存优化技巧
1. 分片缓存(适合大文件)
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=large:10m max_size=10g
inactive=30d use_temp_path=off;
location /video/ {
proxy_cache large;
proxy_cache_valid 200 302 24h;
slice 1m; # 分片大小1MB
proxy_cache_key "$uri$slice_range";
proxy_set_header Range $slice_range;
}
2. 缓存微调
proxy_ignore_headers Cache-Control Set-Cookie; # 强制缓存动态内容(慎用)
proxy_cache_min_uses 3; # 请求3次后才缓存
proxy_cache_revalidate on; # 过期缓存需验证
3. 清除缓存(Purge)
location ~ /purge(/.*) {
proxy_cache_purge my_cache "$scheme$request_method$host$1";
allow 127.0.0.1; # 限制仅本地可清除
deny all;
}
调用方式:
curl -X PURGE http://example.com/purge/url-to-clear
五、完整配置示例
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=proxy_cache:10m inactive=60m max_size=1g;
fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=fcgi_cache:10m inactive=30m;
server {
listen 80;
server_name example.com;
# 静态资源缓存
location ~* .(css|js|jpg|png)$ {
expires 365d;
add_header Cache-Control "public, immutable";
access_log off;
}
# 动态内容代理缓存
location /api/ {
proxy_pass http://backend;
proxy_cache proxy_cache;
proxy_cache_valid 200 5m;
proxy_cache_lock on;
add_header X-Cache-Status $upstream_cache_status;
}
# PHP FastCGI缓存
location ~ .php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_cache fcgi_cache;
fastcgi_cache_valid 200 302 10m;
}
}
}
六、验证与调试
1. 检查缓存目录
ls -lh /var/cache/nginx # 查看缓存文件大小和数量
2. 测试缓存命中
curl -I http://example.com/api/data # 观察 X-Cache-Status 头
3. 日志记录缓存状态
log_format cache_log '$remote_addr - $upstream_cache_status - $request_uri';
access_log /var/log/nginx/cache.log cache_log;
4. 手动清除缓存
rm -rf /var/cache/nginx/* # 直接删除缓存文件(需reload)
七、常见问题
缓存不生效
- 检查
proxy_cache_valid
是否匹配状态码。 - 确认后端未返回
Cache-Control: private/no-store
。
- 检查
内存不足
- 增加
keys_zone
大小(如keys_zone=my_cache:100m
)。
- 增加
磁盘空间不足
- 调整
max_size
或缩短inactive
时间。
- 调整
动态内容误缓存
- 使用
proxy_cache_bypass
排除敏感路径(如/admin
)。
- 使用
通过合理配置 Nginx 缓存,可显著降低服务器负载并提升用户体验。建议结合业务场景调整参数,并通过监控工具(如 nginx_status
、Prometheus)持续观察缓存命中率。
学在每日,进无止境!更多精彩内容请关注微信公众号。

原文出处:
内容由AI生成仅供参考,请勿使用于商业用途。如若转载请注明原文及出处。
出处地址:http://www.07sucai.com/tech/973.html
版权声明:本文来源地址若非本站均为转载,若侵害到您的权利,请及时联系我们,我们会在第一时间进行处理。