照片墙部署优化清单
type
Post
status
Published
date
Jun 10, 2026
slug
photowall-list
summary
tags
category
个人文档
icon
password
# 照片墙 · 服务器部署调优清单
针对这个纯静态站点(HTML + CSS + JS + 大量 WebP 图片)的访问速度优化。
代码层面已做「按需懒加载 + 按相册构建」,本清单是服务器/部署层面的配合优化,按收益从高到低排列。
---
## 1. 开启 HTTP/2(或 HTTP/3)—— 收益最大
照片墙是「大量小文件(图片)」的典型场景。HTTP/1.1 每个域名只能并发约 6 个连接,几百张图会排长队;HTTP/2 在单条连接上多路复用,能同时高效传输大量图片,几乎是为这种站点量身定做的。
- Nginx:`listen 443 ssl http2;`(需配 HTTPS,HTTP/2 实际都跑在 TLS 上)
- 有条件再开 HTTP/3:`listen 443 quic reuseport;` + `add_header Alt-Svc 'h3=":443"; ma=86400';`
- 验证:浏览器 DevTools → Network → 右键表头勾选「Protocol」,应显示 `h2` 或 `h3`。
---
## 2. 设置缓存头(Cache-Control)—— 回访几乎零等待
图片和库文件内容基本不变,应让浏览器长期缓存,回访时直接读本地、不再请求服务器。
| 资源 | 建议策略 |
|---|---|
| 图片 `*.webp`、`*.jpg`、`*.svg` | `Cache-Control: public, max-age=31536000, immutable`(一年) |
| `script.js`、`styles.css` | 一年长缓存,但**更新后需改文件名**(见下方「缓存失效」) |
| `index.html` | `Cache-Control: no-cache` 或很短(如 5 分钟),保证改动能及时生效 |
**缓存失效(重要)**:把 JS/CSS 设成长缓存后,将来改了内容浏览器不会重新拉。解决办法是引用时带版本号,例如 `styles.css?v=20260523`,每次改动改一下这个值即可。
Nginx 示例:
```nginx
# 图片:长缓存 + immutable
location ~* \.(webp|jpg|jpeg|png|gif|svg|ico)$ {
expires 1y;
add_header Cache-Control "public, immutable";
access_log off;
}
# JS/CSS:长缓存(配合 ?v= 版本号)
location ~* \.(js|css)$ {
expires 1y;
add_header Cache-Control "public";
}
# HTML:不缓存,保证更新即时可见
location = /index.html {
add_header Cache-Control "no-cache";
}
```
---
## 3. 压缩(gzip / brotli)—— 只压文本,别压图片
- **要压**:`index.html`、`script.js`、`styles.css`(文本能压掉 60%~80%)。
- **不要压**:`.webp` / `.jpg` 本身已是压缩格式,再压几乎没效果,还白白浪费 CPU。
Nginx 示例(注意 types 里不含图片):
```nginx
gzip on;
gzip_comp_level 5;
gzip_min_length 1024;
gzip_types text/plain text/css application/javascript image/svg+xml;
# 如装了 ngx_brotli 模块,优先 brotli(压缩率更高)
# brotli on;
# brotli_comp_level 5;
# brotli_types text/plain text/css application/javascript image/svg+xml;
```
---
## 4. 自托管第三方库 + preconnect
目前 `index.html` 还从 unpkg / cdnjs 加载 Masonry 和 Font Awesome。跨域加载要额外做 DNS 解析 + TLS 握手,且这些公共 CDN 偶尔会慢或被墙。
**两个选择,二选一:**
**A. 自托管(推荐,最稳)**:把 `masonry.pkgd.min.js` 和 Font Awesome 下载到本地目录,改成相对路径引用。这样所有资源同源,HTTP/2 下一并多路复用,也不依赖外网。
**B. 保留 CDN 但加 preconnect**:在 `<head>` 顶部加预连接,提前完成握手:
```html
<link rel="preconnect" href="https://unpkg.com" crossorigin>
<link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin>
```
> 备注:当前页面只用了 Font Awesome 的左右箭头图标,其实可以用内联 SVG 或 Unicode 箭头替代,从而**整包移除 Font Awesome**,省一个较大的外部请求。需要的话我可以帮你换。
---
## 5. 用 CDN 分发图片(访问量大或用户分布广时)
把 `gz/ sz/ son/ son100/ son1year/` 等图片目录交给 CDN(Cloudflare、又拍云、七牛、阿里云 OSS+CDN 等)边缘节点就近分发。用户离边缘节点近,图片首字节时间显著下降。静态站点本身也可整体托管到 Cloudflare Pages / Vercel / Netlify,自带全球 CDN 和 HTTP/2。
---
## 6. 确保正确的 MIME 类型与传输优化
- 确认 `.webp` 返回 `Content-Type: image/webp`(个别老服务器默认没有这条,会导致下载而非显示)。Nginx 在 `mime.types` 里确认含 `image/webp webp;`。
- 开启 `sendfile on;`、`tcp_nopush on;`(Nginx 默认),提升大文件/多文件传输效率。
---
## 7. 进阶(可选,收益视情况)
- **响应式图片**:为不同屏幕再生成几档尺寸,用 `srcset` 让手机只下小图。工作量较大,仅在移动端流量敏感时考虑。
- **首屏优先**:当前懒加载已只取「接近视口」的图。若想更快出首屏,可对第一屏的几张图去掉懒加载、直接预加载。
- **监控**:用 Lighthouse / PageSpeed Insights 跑一次,重点看 LCP(最大内容绘制)和图片相关建议。
---
## 一句话总结
**最关键三步:开 HTTP/2 + 图片长缓存 + 文本压缩。** 这三项配置成本低、收益最大,配合代码里已经做好的按需懒加载,访问速度问题基本能解决。自托管第三方库和上 CDN 作为第二梯队,按需要再做。
上一篇
照片墙使用说明
下一篇
Linux系统配置
Loading...