网站的访问速度,很大一部分取决于静态资源的输出效率,图片、JS、CSS、字体、静态页面这类资源占据绝大多数请求。很多站长只依赖CDN加速,却忽略Nginx源站层面的静态资源优化。源站配置差,即便接入CDN,回源阶段依旧会拖慢整体体验。
本文带来Nginx原生静态资源全套高性能配置,无需额外插件,直接修改nginx.conf或者站点conf文件,实现文件缓存、压缩、文件读取优化,降低服务器CPU与带宽消耗,同时对搜索引擎友好,适配个人源码站、博客、企业站点。
一、开启Gzip压缩,减小传输体积
Gzip是性价比最高的优化手段,对文本类资源进行压缩,JS、CSS、HTML、JSON体积最高可以压缩60%‑80%。图片、字体类本身已经压缩,不需要重复gzip。
nginx
gzip on;
gzip_vary on;
gzip_min_length 1k;
gzip_comp_level 6;
gzip_types text/plain text/css
text/xml text/javascript
application/json
application/javascript;
gzip_disable "MSIE [1-6].";
参数说明:
- gzip_min_length 1k:小于1k的小文件不压缩,避免压缩开销大于收益
- gzip_comp_level 6:压缩等级,6属于平衡,等级越高越消耗CPU,不建议开到9
- gzip_types:指定哪些类型文件开启压缩,图片不要加入列表
如果使用CDN,部分CDN会接管gzip,源站开启也不会冲突。
二、静态文件浏览器缓存设置
通过 expires 指令告诉浏览器本地缓存周期,用户再次访问不再重复请求服务器,减少请求次数。区分不同资源设置不同缓存时间,避免修改后用户看不到更新。
nginx
location ~* .(jpg|jpeg|png|gif|webp|ico|woff|woff2|ttf)$ {
expires 30d;
add_header Cache-Control "public";
}
location ~* .(css|js)$ {
expires 7d;
add_header Cache-Control "public";
}
location ~* .(php)$ {
expires -1;
add_header Cache-Control "no-store, no-cache, must-revalidate";
}
- 图片字体:30天长缓存,改动图片建议修改文件名强制刷新缓存
- css/js:7天缓存,兼顾速度和版本更新
- php动态程序:完全禁用浏览器缓存,保证实时输出内容
三、开启高效文件读取模块open_file_cache
open_file_cache是Nginx核心性能参数,缓存文件描述符、文件元信息,减少磁盘IO,高并发站点效果尤为明显。
nginx
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
- max=1000:最多缓存1000个文件句柄
- inactive=20s:20秒没有访问就释放缓存
- open_file_cache_min_uses 2:访问2次以上的文件才进入缓存
适合静态文件多的站点;文件频繁修改的场景不建议调太大。
四、关闭不必要的功能,减少额外响应开销
- 隐藏Nginx版本号
防止攻击者利用版本漏洞扫描:
nginx
server_tokens off;
- 关闭多余ETag(可选)
如果已经使用expires缓存策略,可以关闭ETag,减少响应头开销。
nginx
etag off;
五、开启tcp_nopush与tcp_nodelay优化网络传输
nginx
tcp_nopush on;
tcp_nodelay on;
tcp_nopush把小数据包合并成完整包再发送;tcp_nodelay用于响应快速返回,二者搭配优化TCP传输,减少网络往返延迟。
六、完整站点片段参考
nginx
server {
listen 80;
server_name example.com;
root /www/wwwroot/example;
gzip on;
gzip_vary on;
gzip_min_length 1k;
gzip_comp_level 6;
gzip_types text/plain text/css
text/xml text/javascript
application/json
application/javascript;
gzip_disable "MSIE [1-6].";
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
tcp_nopush on;
tcp_nodelay on;
server_tokens off;
location ~* \.(jpg|jpeg|png|gif|webp|ico|woff|woff2|ttf)$ {
expires 30d;
add_header Cache-Control "public";
}
location ~* \.(css|js)$ {
expires 7d;
add_header Cache-Control "public";
}
location ~* \.(php)$ {
expires -1;
add_header Cache-Control "no-store, no-cache, must-revalidate";
}
}
修改完成后校验配置是否正确:
bash
nginx -t
校验成功重载生效:
bash
nginx -s reload
七、常见踩坑提醒
1. 浏览器缓存设置太长,修改css/js图片后,访客看不到更新。解决方案:静态资源修改时带上版本号,例如 style.css?v=2 。
2. open_file_cache不要在频繁改动文件的目录使用,会读取到旧文件。
3. gzip不要对图片、mp4开启,不会变小还浪费CPU。
4. 搭配CDN时,源站expires会传递给CDN作为缓存参考,源站配置会直接影响CDN缓存行为。
总结
静态资源性能优化分为三层:源站Nginx压缩、浏览器本地缓存、CDN边缘缓存。Nginx作为源头,做好gzip、文件缓存、响应头控制,能够大幅降低服务器CPU、磁盘IO、带宽压力。
这套配置不用依赖第三方组件,直接落地,不管是裸机Nginx还是宝塔、1Panel面板都可以使用。优化完成后配合CDN,网站加载速度会有非常直观的提升。




