把 Astro 博客部署到云服务器
本站用 Astro 构建,npm run build 后 dist/ 里就是一堆预渲染好的 HTML。静态站不需要 Node 进程,也不需要反向代理,服务器上只做三件事:把域名指过来、把文件放上去、让 Nginx 知道怎么找到它们。
以下是个人环境的操作记录,命令里含
rm、--delete等删除操作,照抄前请确认路径、登录用户和目标机器。下文<用户>指有 sudo 权限的普通账号,<公网IP>指服务器公网地址。
一、配置域名解析
在域名控制台添加 A 记录,把域名指向服务器公网 IP:
| 记录类型 | 主机记录 | 记录值 |
|---|---|---|
| A | @ | 服务器公网 IP |
| A | www | 服务器公网 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;
}
}
server_name靠 HTTP 的 Host 头匹配域名,精确匹配优先于default_server;root要和建目录、rsync 目标的路径完全一致;try_files是关键:Astro 的页面是about/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 本身。