← 返回笔记列表
● 建站

这个站点是怎么搭起来的

需求很简单:一个域名 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,避免压缩美化带宽数字;该路径现已整体下线。