blog.starbugs.net Markdown 文档站部署记录

系统

架构

参照 vi.starbugs.net 的「nginx 反代 127.0.0.1 服务」模式:

外网 → nginx (443 ssl/quic, blog.starbugs.net) → 反代 → 127.0.0.1:8010 (blog-md Python 服务)
                                                              ↓ 渲染
                                                      /var/local/docs/*.md

已完成

临时方案:挂在 vi.starbugs.net/blog/ 下(已生效)

blog.starbugs.net 证书暂时签不了(见下方阻塞点),故先把同一个渲染服务挂到已有 证书的 vi.starbugs.net 的 /blog 子路径下对外提供访问:

nginx location = /blog { return 301 /blog/; } location /blog/ { proxy_pass http://127.0.0.1:8010/; # 末尾斜杠:剥掉 /blog 前缀 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Prefix /blog; proxy_redirect off; }

待 blog.starbugs.net 证书签发后,可保留此 /blog 入口,或在 blog 域名根路径独立提供,二者共用同一服务。

未完成(待后续)

阻塞点:Let's Encrypt 证书签发失败(DNS 地域解析问题)

certbot certonly --webroot 失败,CA 报错:

Domain: blog.starbugs.net
Type:   unauthorized
Detail: 43.174.225.201: Invalid response from
        https://dnspod.qcloud.com/static/webblock.html?d=blog.starbugs.net

原因:blog.starbugs.net 在 DNSPod 做了地域智能解析——

Let's Encrypt 的验证节点在境外,取到的是 EdgeOne 边缘,.well-known challenge 被拦截,故 HTTP-01 验证无法通过。对比 vi.starbugs.net 全球均解析到源站,所以 vi 能签发。

决定的解决方案:DNS 改回源站

在 DNSPod 控制台对 starbugs.net 操作:

  1. 找到主机记录 blog(类型 A)的境外/国外线路记录(或指向 EdgeOne 的记录)。
  2. 把该线路的值改为 49.235.116.153,或直接删除该 EdgeOne 加速记录, 只保留 默认 线路 A → 49.235.116.153(全地域回源,与 vi 一致)。
  3. 若 blog 在 EdgeOne CDN 中已接入域名,一并停用/移除,避免拦截。
  4. TTL 600s,等待约 10 分钟境外生效。

自检(应只剩源站 IP):

curl -s "https://dns.google/resolve?name=blog.starbugs.net&type=A"
# 期望 Answer 仅含 49.235.116.153

DNS 生效后剩余步骤

  1. 重签证书:

bash certbot certonly --webroot -w /var/www/blog.starbugs.net -d blog.starbugs.net \ --non-interactive --agree-tos --register-unsafely-without-email --keep-until-expiring

  1. 用最终站点配置替换临时 80 配置 /etc/nginx/conf.d/blog.starbugs.net.conf (仿 vi,注意 HTTP/3 不要重复 reuseport,该参数已被 vi 的 443 quic 占用):

```nginx server { listen 80; server_name blog.starbugs.net;

   location /.well-known/acme-challenge/ {
       root /var/www/blog.starbugs.net;
   }
   location / {
       return 301 https://$host$request_uri;
   }

}

server { listen 443 ssl; listen 443 quic; # 不加 reuseport(vi 已占用) http2 on; http3 on;

   server_name blog.starbugs.net;

   ssl_certificate /etc/letsencrypt/live/blog.starbugs.net/fullchain.pem;
   ssl_certificate_key /etc/letsencrypt/live/blog.starbugs.net/privkey.pem;
   ssl_protocols TLSv1.2 TLSv1.3;
   ssl_prefer_server_ciphers off;

   add_header Alt-Svc 'h3=":443"; ma=86400' always;
   add_header QUIC-Status $http3 always;

   location / {
       proxy_pass http://127.0.0.1:8010;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Proto $scheme;
       proxy_redirect off;
   }

} ```

  1. 应用并验证:

bash nginx -t && systemctl reload nginx curl --noproxy '*' -I --http2 --resolve blog.starbugs.net:443:127.0.0.1 https://blog.starbugs.net curl --noproxy '*' -s --resolve blog.starbugs.net:443:127.0.0.1 https://blog.starbugs.net | head certbot renew --dry-run

期望:HTTP/2 200、响应头含 alt-svc: h3=":443"、正文为文档索引。

关键文件

运维命令

# 服务
systemctl status blog-md --no-pager
journalctl -u blog-md -n 50 --no-pager
systemctl restart blog-md

# 本地访问(证书签发前即可测)
curl -s --noproxy '*' http://127.0.0.1:8010/

# 新增/修改文档:直接放入 /var/local/docs/*.md,刷新即生效(无需重启服务)

注意事项