Nginx缓存静态资源,减轻PHP与数据库压力
当网站访问变慢、PHP-FPM进程频繁跑满、数据库连接数飙升时,很多问题其实出在静态资源重复请求上。
Nginx缓存静态资源,减轻PHP与数据库压力,是零基础站长也能快速上手的优化手段。
本文从准备条件讲起,逐步配置缓存规则,并给出避坑与验证方法,帮你把图片、CSS、JS等文件直接由Nginx返回,不再反复穿透到PHP和数据库。
先确认环境与缓存目标
操作前需要一台已安装Nginx的服务器,并确认网站根目录位置。
以常见LNMP环境为例,网站根目录可能是/home/wwwroot/你的域名。
你可以通过nginx -v查看版本,用nginx -t检查配置语法。
需要缓存的静态资源通常包括:
- 图片:
.jpg、.png、.gif、.webp - 样式与脚本:
.css、.js - 字体与图标:
.woff、.woff2、.ttf、.svg - 其他:
.ico、.pdf
核心判断:如果这些文件每次访问都经过PHP处理或查询数据库,就值得开启Nginx缓存。
配置Nginx缓存静态资源
打开站点配置文件,通常位于/usr/local/nginx/conf/vhost/你的域名.conf或/etc/nginx/conf.d/你的域名.conf。
在server块内添加以下规则:
location ~* \.(jpg|jpeg|png|gif|webp|css|js|woff|woff2|ttf|svg|ico)$ {
expires 30d;
add_header Cache-Control "public, max-age=2592000";
access_log off;
}
这段配置告诉浏览器和Nginx:静态资源缓存30天,期间不再向PHP请求。
注意expires 30d和max-age单位是秒,2592000秒等于30天。
保存后执行nginx -t测试语法,通过后重载Nginx:
nginx -s reload
如果使用宝塔面板,可以在“网站”->“设置”->“配置文件”中直接修改,保存后重载服务。
避坑:缓存不是万能,注意这些细节
不要缓存动态接口。
上述规则只匹配静态后缀,但如果你有.php伪静态或API路径,不要误加入缓存列表。
缓存时间不宜过短或过长。
30天适合不常更新的图片和字体;
CSS和JS如果频繁改版,可以缩短到7天,或通过文件名哈希(如style.a1b2c3.css)强制更新。
开启缓存后要清理旧缓存。
如果修改了静态文件但浏览器仍加载旧版,可强制刷新(Ctrl+F5)或修改文件名。
Nginx缓存与浏览器缓存是两回事。expires主要控制浏览器缓存,Nginx自身不会存储文件副本,而是告诉浏览器“下次别再问我”。
真正减轻PHP压力的是浏览器不再重复请求。
验证缓存是否生效
配置完成后,用浏览器开发者工具(F12)打开“网络”面板,刷新页面,查看静态资源的响应头。
如果看到Cache-Control: public, max-age=2592000和Expires日期,说明缓存已生效。
也可以使用curl命令检查:
curl -I https://你的域名/style.css
观察返回头中是否有Cache-Control和Expires字段。
同时,观察服务器负载:top命令查看PHP-FPM进程CPU占用是否下降,mysqladmin status查看数据库查询量是否减少。
可独立摘录的结论:Nginx缓存静态资源后,浏览器在缓存有效期内不会重复请求这些文件,因此PHP和数据库的请求量会明显下降。
常见疑问
问:缓存后网站样式错乱怎么办?
答:通常是浏览器缓存了旧CSS。强制刷新或修改CSS文件名加版本号即可。
问:所有静态资源都适合缓存30天吗?
答:不。经常更新的图片或JS建议缩短时间,或使用文件名哈希。
问:Nginx缓存能替代CDN吗?
答:不能完全替代。Nginx缓存主要减轻源站PHP压力,CDN还能加速全国访问,两者可以配合使用。
问:配置后Nginx报错怎么排查?
答:先运行nginx -t查看具体错误行,常见问题是缺少分号或路径错误。
按以上步骤配置后,你可以用ab或wrk简单压测对比,观察请求静态文件时PHP-FPM的活跃进程数是否下降。
如果效果不明显,检查是否有其他动态请求绕过了缓存规则。