这个站点是怎么搭起来的
需求很简单:一个域名 speedtest.heodiy.com,指向一台 1 核 1G 的海外 VPS,
想在上面放一个"静态博客 + 测速入口"。于是整个栈只用了三层:Nginx、静态文件、浏览器 JS。
为什么不做 WordPress
这台机器同时还跑着代理服务,内存本来就紧。PHP + MySQL 的组合光空转就要几百 MB, 而博客的内容一个月可能只更新两三次。静态站点的代价是:改文章要重新写 HTML; 收益是:无状态、抗并发、断电重启也能立刻服务,而且测速时不会有后端逻辑干扰带宽测量。
目录结构
/var/www/speedtest.heodiy.com # 当前结构(2026-11 收紧后)
├── index.html # 首页:介绍 + 双栈网络信息 + 能力说明
├── speedtest.html # 测速能力说明(纯静态,无任何传输)
├── 404.html # 自定义 404
├── posts/ # 文章(纯 HTML)
│ ├── welcome.html
│ ├── speedtest-workflow.html
│ └── ipv6-off.html
├── assets/
│ ├── style.css # 深/浅色主题、卡片、表格
│ └── theme.js # 主题切换(localStorage)
├── robots.txt
└── sitemap.xml
已移除:assets/app.js · st/ping.txt · st/1mb.bin · st/10mb.bin · st/100mb.bin · st/upload/
下面保留这些文件的历史说明以便对照,但它们已不在磁盘上,目录本身也已删除;
任何对 /st/ 的请求一律返回 410 Gone。
曾经:测速文件为什么用稀疏文件
三个 .bin 是用 truncate -s 生成的稀疏文件,磁盘实际只占 4 KB,
但网络读取时仍然是完整的 100 MB 零字节流。既不占空间,又能测出真实的链路吞吐。
truncate -s 1M /var/www/speedtest.heodiy.com/st/1mb.bin
truncate -s 10M /var/www/speedtest.heodiy.com/st/10mb.bin
truncate -s 100M /var/www/speedtest.heodiy.com/st/100mb.bin
现状:三个 .bin 与 ping.txt 已于 2026-11 从磁盘删除,/st/ 已改为 return 410。
曾经:上传端点(已移除)
这段 ngx_http_dav_module 配置已从站点配置中删除:匿名 PUT 是最容易被刷爆的写入面,收紧后站点完全只读。下面的配置仅作历史存档。
纯静态站点没有后端,无法接收上传。这里利用 Nginx 编译时就带的
ngx_http_dav_module,把 /st/upload/ 变成只允许 PUT 的落盘目录:
location /st/upload/ {
client_max_body_size 200m;
dav_methods PUT;
dav_access user:rw group:rw all:r;
create_full_put_path on;
limit_except PUT { deny all; }
autoindex off;
gzip off;
}
随机文件名 + 定时清理,避免目录越积越大。autoindex off 也保证这些文件不会被列出来。
静态不等于不能测量。下载是读,上传是写,Nginx 两件事都能做,只是需要把"写"限制在一个很小的、会自己清理的口袋里。
HTTPS
证书用 certbot 的 nginx 插件签发,带 HTTP/2 与自动续期。历史上的测速端点曾对 /st/ 关闭 gzip,避免压缩美化带宽数字;该路径现已整体下线。