跳到正文
SL Blog 技术探索 · 工程实践 · AI 时代思考
返回

为 AstroPaper 博客绑定自定义域名并启用 HTTPS

文章目录
  1. 读完本文,你能完成什么
  2. 前提
  3. 一、DNS 解析
  4. 二、修改站点 URL
  5. 三、Nginx 站点配置
  6. 四、申请 Let’s Encrypt 证书
  7. 五、重新构建并发布
  8. 六、验证

读完本文,你能完成什么

本文是一份可复现的记录,照着做,你能够:

  • 把已上线的 AstroPaper 静态博客,从「IP + 端口」访问升级为自定义域名;
  • 用 Nginx 配置 80 → 443 跳转并托管 HTTPS;
  • 申请 Let’s Encrypt 免费证书,并配置自动续期;
  • 让站点规范链接(canonical / sitemap)同步切换为新域名。

前提

  • 博客已能通过 http://<服务器IP>:8081/ 访问(Nginx 静态托管);
  • 拥有域名的 DNS 解析控制台权限;
  • 域名已完成必要的实名 / 备案手续(按需)。

一、DNS 解析

在 DNS 控制台添加两条 A 记录,指向服务器公网 IP:

记录类型主机记录记录值
A@你的服务器公网 IP
Awww你的服务器公网 IP

验证是否生效:

dig +short example.com

返回你的公网 IP,说明解析已生效。

二、修改站点 URL

编辑 astro-paper.config.ts,把 site.url 改成 HTTPS 域名(结尾带 /):

export default defineAstroPaperConfig({
  site: {
    url: "https://example.com/",
    // ...
  },
});

这一步会影响 sitemap、canonical、OG 图等所有绝对链接,改完必须重新构建(见第五节)。

三、Nginx 站点配置

先新建 80 端口的站点配置(用于 Let’s Encrypt 校验,并在拿到证书后做 301 跳转)。写入 /etc/nginx/sites-available/example:

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;

    location ^~ /.well-known/acme-challenge/ {
        root /var/www/astropaper;
        default_type "text/plain";
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

启用并重载:

sudo ln -s /etc/nginx/sites-available/example /etc/nginx/sites-enabled/example
sudo nginx -t
sudo systemctl reload nginx

四、申请 Let’s Encrypt 证书

使用 snap 版 certbot(自带隔离环境,可避免与系统 Python 依赖冲突):

sudo snap install --classic certbot
sudo certbot certonly --webroot \
  -w /var/www/astropaper \
  -d example.com -d www.example.com \
  --preferred-challenges http

首次运行会要求填写邮箱并同意条款。证书生成后,certbot 会自动创建后台定时任务负责续期。

证书就绪后,把 443 段补进同一份配置:

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.com www.example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    root /var/www/astropaper;
    index index.html;

    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_types text/plain text/css text/xml application/json application/javascript application/xml application/rss+xml image/svg+xml;

    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;

    location /_astro/ {
        expires 1y;
        add_header Cache-Control "public, max-age=31536000, immutable";
        try_files $uri =404;
    }

    location /pagefind/ {
        expires 1h;
        add_header Cache-Control "public, max-age=3600";
        try_files $uri =404;
    }

    location / {
        try_files $uri $uri/ =404;
    }

    error_page 404 /404.html;
}

再次校验并重载:

sudo nginx -t
sudo systemctl reload nginx

五、重新构建并发布

因为 site.url 变了,需要重新构建,让新域名写入 sitemap 与页面链接:

cd /opt/astropaper
pnpm install --frozen-lockfile
pnpm build
sudo rsync -a --delete dist/ /var/www/astropaper/
sudo systemctl reload nginx

六、验证

curl -I https://example.com/    # 200
curl -I http://example.com/     # 301 -> https
curl -s https://example.com/ | grep canonical   # 应为 https://example.com/

至此,博客已通过自定义域名以 HTTPS 提供访问。


RAG 智能问答

针对本文继续提问:《为 AstroPaper 博客绑定自定义域名并启用 HTTPS》