读完本文,你能完成什么
本文是一份可复现的记录,照着做,你能够:
- 把已上线的 AstroPaper 静态博客,从「IP + 端口」访问升级为自定义域名;
- 用 Nginx 配置 80 → 443 跳转并托管 HTTPS;
- 申请 Let’s Encrypt 免费证书,并配置自动续期;
- 让站点规范链接(canonical / sitemap)同步切换为新域名。
前提
- 博客已能通过
http://<服务器IP>:8081/访问(Nginx 静态托管); - 拥有域名的 DNS 解析控制台权限;
- 域名已完成必要的实名 / 备案手续(按需)。
一、DNS 解析
在 DNS 控制台添加两条 A 记录,指向服务器公网 IP:
| 记录类型 | 主机记录 | 记录值 |
|---|---|---|
| A | @ | 你的服务器公网 IP |
| A | www | 你的服务器公网 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 提供访问。