前三篇完成了安全加固、终端环境配置和运行环境安装,这一篇把博客真正跑起来。
设置博客域名
在 astro-paper.config.ts 里的 SITE.url 设置成自己的域名:
// astro-paper.config.ts
site: {
url: "https://blog.huazaiki.com", // 改成实际域名
// ...
}
构建
pnpm install --frozen-lockfile
pnpm build
pnpm build 做了三件事:类型检查、Astro 静态生成、Pagefind 搜索索引。完成后 dist/ 目录里就是完整的静态网站。
Nginx 站点配置
Nginx 需要把 http://blog.huazaiki.com/ 的请求指向构建的 dist/ 目录。在 /etc/nginx/conf.d 文件夹下创建 Nginx 配置文件:
sudo vim /etc/nginx/conf.d/blog.huazaiki.com.conf # 如果是自己部署,修改成自己的域名.conf
server {
listen 80;
listen [::]:80;
server_name blog.huazaiki.com;
access_log /var/log/nginx/blog.access.log;
error_log /var/log/nginx/blog.error.log;
root /var/www/blog/dist;
index index.html;
location / {
try_files $uri $uri/ /index.html
proxy_http_version 1.1;
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 Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
验证配置并重载:
sudo nginx -t # 先验证语法
sudo systemctl reload nginx
此时访问 http://blog.huazaiki.com/(或暂时用 IP),应该能看到博客首页。
DNS 解析
在域名管理后台(阿里云 DNS / Cloudflare 等)添加 A 记录:
| 类型 | 主机记录 | 记录值 |
|---|---|---|
| A | blog | 服务器公网 IP |
生效时间取决于 TTL 设置,通常几分钟到几小时不等。用 dig 你的域名.com 或 nslookup 查看是否已解析。
在国内云购买服务器和域名,如果想使用域名解析服务,需要进行网站备案
HTTPS:Let’s Encrypt + Certbot
有了域名 + DNS 解析,我们还需要为网站添加 SSL 证书以实现安全加密访问。
Ubuntu 下安装 certbot 及其 Nginx 插件:
sudo apt install -y certbot python3-certbot-nginx
--nginx 插件能自动读取 Nginx 配置中的 server_name,自动完成证书申请和配置:
sudo certbot --nginx -d 你的域名.com
过程中会问几个问题:
- 输入邮箱(用于证书过期提醒)
- 同意服务条款
- 是否自动重定向 HTTP 到 HTTPS(选 no)。
选 no 的原因是因为 certbot 的自动重定向会把 80 端口的 server 块替换成一个纯跳转块(
return 301 https://...),原有 location 配置丢失。选 no 保留我们手写的 80 端口配置,后面手动加上重定向更可控。
申请成功后,certbot 会在配置文件中追加 443 端口的 SSL server 块,但不会自动放行 443 端口。需要手动操作:
# UFW 放行 HTTPS
sudo ufw allow 443/tcp
# 阿里云安全组也要添加 443 端口入方向规则
然后手动在 80 端口的 server 块末尾加上 HTTPS 重定向——把原来博客配置底部的 80 server 块改成:
server {
listen 80;
server_name huazaiki.com www.huazaiki.com;
return 301 https://$host$request_uri;
}
最终的 blog.conf 是两块 server(443 放内容、80 跳 HTTPS)。完整配置参考:
# == HTTPS server(certbot 自动生成的 443 块,手动保留内容 location)==
server {
server_name blog.huazaiki.com;
access_log /var/log/nginx/blog.access.log;
error_log /var/log/nginx/blog.error.log;
root /var/www/blog/dist;
index index.html;
location / {
try_files $uri $uri/ /index.html
proxy_http_version 1.1;
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 Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/blog.huazaiki.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/blog.huazaiki.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
# == HTTP server:全部跳转 HTTPS ==
server {
if ($host = blog.huazaiki.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name blog.huazaiki.com;
return 404; # managed by Certbot
}
重载配置:
sudo nginx -t && sudo systemctl reload nginx
使用以下命令验证自动续期是否正常:
sudo certbot renew --dry-run
如果输出 “Congratulations, all simulated renewals succeeded”,就没问题。certbot 默认通过 systemd timer 每天检查一次,证书到期前 30 天自动续期。
收尾
博客部署之后,日常更新文章的流程将在下一篇文章中讲述,涉及使用 Github Actions、配置 Webhook 等。