静态化落地其实只有三段:把页面输出成 .html 文件、让 Nginx 直接返回这个文件、按固定节奏重新生成。真正卡住人的地方,往往在动手之前:不知道当前站点是否已经在返回静态文件,不知道发布目录在哪,也不知道生成进程有没有写权限。所以建议先做一次判断,再改配置,比直接装一个带“静态化”字样的插件更稳妥。
判断路径:匿名访客看到的内容基本一致的页面(文章详情、列表、分类、帮助页)适合做全站静态化;带登录态、购物车、实时库存的页面只做局部静态化或不静态化。动作是先 curl -I 看响应头有没有缓存层,再确认发布目录里是否存在 .html 文件;验证以 Nginx 返回 200、且文件 mtime 跟着生成时间更新为准;边界是发布目录的写权限和回滚方式,切换目录前保留上一版。
网站静态化怎么做的啊?
这一步对应的是“判断与定位”,也就是先确认你现在看到的那份 HTML,到底是静态文件,还是后端每次临时生成的。不要在后台看到“缓存已开启”就认定为静态化:页面缓存只会在规定时间内把动态内容存起来,静态化则是把文件写到发布目录,由 Nginx 直接从磁盘读取并返回。
可以用下面这几处入口来核对:
- 响应头:
curl -sI https://example.com/post/1.html | grep -iE 'HTTP/|content-type|age|cache-control|x-cache'。出现Age、X-Cache,说明前面有缓存层;只有Server: nginx加一个Content-Length,更像直接读了静态文件。 - 服务器配置:
nginx -T | grep -n "root\|try_files\|index",确认站点根目录指向哪里,有没有try_files回落到后端。 - 发布目录:
ls -l --time-style=long-iso /var/www/site-static/ | head,看 .html 文件是否存在、mtime 是不是最近一次生成时间。 - 访问日志:
tail -f /var/log/nginx/access.log,看同一个路径是持续落到 PHP-FPM 或 Node 入口,还是直接 200 返回静态文件。 - 后台面板:插件或模块列表页里的“状态”和“输出目录”字段,记下它写的路径,和上面
root指向的路径对一下是否一致。
网站静态化怎么做的啊视频
搜“视频”的人真正想要的是一段能照着复现的操作,所以这一节对应的是“验证与复现”。看演示时不要只关注界面上点了哪个按钮,重点看三个可核对的字段:发布目录里的文件有没有生成、Nginx 返回的状态码和内容类型、第二次请求的耗时是否明显变短。
可以在本地终端用一条命令做对照,连续执行两次:
curl -s -o /dev/null -w 'code=%{http_code} size=%{size_download} time=%{time_total}\n' https://example.com/post/1.html
time_total 第二次变小,只能说明前面有缓存或在命中静态文件,不能单独证明静态化成功;还要回到发布目录 ls 确认文件真的写进去了、大小不为 0。浏览器侧看 DevTools 的 Network 面板,Size 列显示 disk cache、memory cache 是缓存层在起作用,Response Headers 里的 Age 可以辅助判断,但别把它当成唯一依据。

网站静态化之前先确认这三件事
版本、权限、入口位置,这三件事缺一个都会卡住,而且它们各自的查看位置是固定的。
- 版本:
nginx -v(注意是大写 V 才输出详细版本)、php -v或node -v;CMS 插件版本在后台插件列表页的“版本”列里看。版本会影响try_files与root/alias的匹配行为、生成命令的参数名,动手前先记下当前版本号。 - 权限:
whoami、ls -ld /var/www/site-static、id www-data。生成进程的身份要对该目录有写权限,Nginx 的 worker 身份要能读。权限不对时,最常见的表现是生成脚本不报错、目录里却只有空文件夹。 - 入口位置:
nginx -T | grep -n "server_name\|root"找到当前生效的站点配置文件,一般在/etc/nginx/conf.d/或/etc/nginx/sites-enabled/;CMS 的伪静态规则、生成任务的触发入口、计划任务的配置文件都在各自的后台或crontab -l输出里。nginx -T显示的是合并后的最终配置,比翻目录更可靠。
网站静态化:最短可用路径
下面是一条能跑通的最小路径,以镜像抓取作为生成方式,CMS 自带导出功能的跳过第一步的抓取、直接用它输出的目录即可。
- 建发布目录并授权:
mkdir -p /var/www/site-static/example.com && chown -R www-data:www-data /var/www/site-static && chmod -R 755 /var/www/site-static。做完ls -ld应看到属主是www-data。 - 生成静态文件:
wget --mirror --page-requisites --convert-links --adjust-extension --no-parent --domains=example.com --directory-prefix=/var/www/site-static https://example.com/。其中--adjust-extension让无扩展名的 URL 存成 .html,--convert-links把站内链接改成相对路径。做完find /var/www/site-static -name '*.html' | head应能看到文件。 - 改用静态根目录:在站点配置文件里把
root指向/var/www/site-static/example.com,并加location / { try_files $uri $uri/ $uri.html =404; }。做完nginx -t应输出 syntax is ok、test is successful。 - 重载并验证:
nginx -s reload,然后curl -sI https://example.com/post/1.html应返回 200 和Content-Type: text/html。 - 定时重建:
crontab -e加入20 3 * * * /usr/bin/wget -q --mirror --page-requisites --convert-links --adjust-extension --no-parent --domains=example.com --directory-prefix=/var/www/site-static https://example.com/,第二天用ls -l --time-style=long-iso看 mtime 是否变了。
网站静态化:一个真实场景的完整做法
场景设定:一个 CMS 驱动的内容站,约两万篇文章,另有分类页和文章列表页,匿名访客占绝大多数,评论区由第三方脚本在前端挂载。这类站点适合全站静态化,后台、搜索页、带参数的列表页不生成。
CMS 后台的静态导出插件设置页里,填三个值:导出目录 /var/www/site-static/releases/20240101、排除规则 /admin/* 和 /*?s=*、资源域名保持原站域名。Nginx 侧用软链接切换,root 指到 /var/www/site-static/current,站点配置文件里写成:
server {
listen 80;
server_name example.com;
root /var/www/site-static/current;
index index.html;
location / {
try_files $uri $uri/ $uri.html =404;
}
location ~* \.(css|js|jpg|png|svg|woff2)$ {
expires 7d;
add_header Cache-Control "public";
}
}
每次生成完后,先确认新目录可访问,再切换:ln -sfn /var/www/site-static/releases/20240101 /var/www/site-static/current,回滚就是把软链接指回上一版目录,不用改 Nginx 配置。crontab -l 里挂一条夜间执行导出的命令即可。
最容易踩的坑:把动态页面的缓存当成静态化。装了缓存插件、面板显示命中率不错,就以为静态化做完了,结果停掉后端进程,页面立刻 500,说明磁盘上根本没有可返回的文件。另一个同样高频的坑是 try_files $uri $uri/ $uri.html 让 /post/1 和 /post/1.html 两份都能访问,变成重复 URL,需要在页面里确认 canonical 指向哪一个,或者干脆只保留一种访问形式。抓取生成之后,建议先 du -sh 看一下发布目录的体积和文件数量,如果数量远超文章数,多半是把分页参数、搜索词、跟踪参数一起抓成了独立目录。