把 Astro 博客部署到云服务器

本站用 Astro 构建,npm run build 后 dist/ 里就是一堆预渲染好的 HTML。静态站不需要 Node 进程,也不需要反向代理,服务器上只做三件事:把域名指过来、把文件放上去、让 Nginx 知道怎么找到它们。

以下是个人环境的操作记录,命令里含 rm、--delete 等删除操作,照抄前请确认路径、登录用户和目标机器。下文 <用户> 指有 sudo 权限的普通账号,<公网IP> 指服务器公网地址。

一、配置域名解析

在域名控制台添加 A 记录,把域名指向服务器公网 IP:

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

其余保持默认(解析线路默认、TTL 默认)。@ 对应根域,www 对应 www. 子域,两条都加才能都访问。

dig +short fishcompanion.top   # 返回公网 IP 即生效

前提是服务器安全组放行了 80/443,且域名已完成备案并接入这台服务器,否则 80 端口会被拦截。

二、上传构建产物

服务器上先建文档根:

sudo mkdir -p /var/www/fishcompanion

本地构建并上传:

npm run build && rsync -avz --delete dist/ <用户>@<公网IP>:/var/www/fishcompanion/

dist/ 末尾的斜杠表示「传目录里的内容」,写成 dist 会多套一层目录;用 && 连接是为了保证构建成功才同步,避免把残缺产物推上线。

--delete 不是单纯的上传,而是以本地 dist/ 为准做镜像:远端多出来的文件会被删掉(范围仅限目标目录)。所以手工添加的 robots.txt、备案核查文件之类不要直接放到服务器,应该放进项目的 public/,由构建带出去;改动较大时可以先加 --dry-run 预览将要删除的内容。上传后目录里应直接看到 index.html、about/、posts/。

文件属主取决于登录用户,为避免 Nginx 的 www-data 读不到,后面统一处理权限。

三、配置 Nginx

写 /etc/nginx/conf.d/fishcompanion.conf:

server {
    listen 80;
    server_name fishcompanion.top www.fishcompanion.top;
    root /var/www/fishcompanion;
    index index.html;

    location / {
        try_files $uri $uri/ $uri/index.html =404;
    }
}

然后让配置生效:

sudo rm -f /etc/nginx/sites-enabled/default
sudo chown -R www-data:www-data /var/www/fishcompanion
sudo find /var/www/fishcompanion -type d -exec chmod 755 {} \;
sudo find /var/www/fishcompanion -type f -exec chmod 644 {} \;
sudo nginx -t && sudo systemctl reload nginx

nginx -t 只校验语法,reload 让 master 重读配置且不中断已有连接。验证:

curl -I http://fishcompanion.top
curl -I http://fishcompanion.top/posts/

返回 200 就上线了。如果看到 403,通常是 root 目录下没有 index.html(上传层级错了)或 www-data 读不到文件,sudo tail -n 30 /var/log/nginx/error.log 会写明具体原因。

之后

HTTPS 的证书签发、443 配置与自动续期写在下一篇《给 Astro 博客加上 HTTPS》。

解析、目录、Nginx 配置、证书都是一次性的;以后写新文章只需要:

npm run build && rsync -avz --delete dist/ <用户>@<公网IP>:/var/www/fishcompanion/

不用重启任何服务 —— 静态站的「应用」就是那堆 HTML 本身。

← 返回文章列表