前两篇完成了安全加固和终端环境配置,这篇来装运行环境。我的目标是让这个 Astro 博客跑在自己的服务器上。
Node.js:用 fnm + brew 管理版本
不推荐直接 apt install nodejs——Ubuntu 仓库的版本通常很旧,而且以后升级困难。用 fnm(Fast Node Manager)可以随时切换 Node 版本,类似于 nvm 但更快。
既然有 brew 了,fnm 一行装好:
brew install fnm
装完之后还需要配置 shell 初始化脚本,brew 不会自动帮你做这一步。具体配置方式参考 fnm 官方文档 - Shell Setup,核心是在 ~/.zshrc 中加入:
eval "$(fnm env --use-on-cd --shell zsh)"
--use-on-cd 是可选的,效果是进入带有 .node-version 或 .nvmrc 的目录时自动切换 Node 版本。加上这行后 source ~/.zshrc 让 fnm 在当前 shell 生效。
如果
brew install fnm因为网络问题失败,也可以回退到curl -fsSL https://fnm.vercel.app/install | bash和 DNS 那步类似,手动查fnm.vercel.app的 IP 写入/etc/hosts。curl 安装方式会自动在.zshrc中写入初始化代码,不需要手动加。
确认安装成功后,安装 Node.js。这个博客项目的 package.json 里写了 engines.node >= 22.12.0,CI 里用的是 Node 24,直接装最新 LTS:
fnm list-remote # 看一眼有哪些版本
fnm install 24 # 装 Node 24
fnm default 24 # 设为默认版本
fnm use 24 # 当前 shell 使用
node -v # 验证
fnm 是 per-user 的,上面这些操作都是用 blogadmin 执行的,Node 也只对这个用户可见。如果后续其他用户也需要 Node,得各自安装——但对于一个博客部署来说,blogadmin 一个人用就够了。
pnpm
项目用的包管理器是 pnpm,锁文件也是 pnpm-lock.yaml:
# fnm 的 Node 自带 corepack,一行启用
corepack enable
corepack prepare pnpm@11.3.0 --activate
pnpm --version # 验证
版本号 11.3.0 对应项目的 package.json 中 packageManager 字段和 CI 配置。不用 corepack 的话也可以 npm i -g pnpm,但 corepack 能保证版本和项目锁死,更可控。
Nginx
Nginx 作为系统服务走 apt,便于 systemd 管理,也方便后续 certbot 自动集成:
sudo apt install -y nginx
sudo systemctl enable --now nginx
此时访问服务器 IP 的 80 端口,应该能看到 Nginx 默认欢迎页。
如果看不到,请检查防火墙和云服务器安全组。
目录规划
部署之前,先规划好文件和权限结构。我习惯把 Web 相关内容放在一个统一的位置:
# 创建部署目录
sudo mkdir -p /var/www/blog
sudo chown -R $USER:$USER /var/www/blog # 修改目录所有者
# 网站根目录
ls -la /var/www/blog
后续博客的静态文件会构建到 /var/www/blog/dist 或直接放在 /var/www/blog,具体看下一篇的部署步骤。
这里有一个值得记一笔的想法:我为什么不用 Docker?
这个项目根目录下其实有个现成的 Dockerfile——多阶段构建,Node 编译后把 dist/ 扔进 Nginx 镜像,最后暴露 80 端口。对静态博客来说,Docker 带来的好处(环境隔离、一致性)在我的场景里意义不大:
| 考量 | 结论 |
|---|---|
| 依赖复杂度 | 静态 HTML/CSS/JS,零运行时依赖 |
| 服务数量 | 只有一个博客,没有微服务编排需求 |
| 资源 | 512MB 内存的轻量机器,省一点是一点 |
| 更新频率 | 手动发布文章,不需要容器化 CI |
多一层 Docker 就多一个维护面——镜像更新、日志收集、磁盘占用(镜像层累积起来很可观)。宿主机直接跑 Nginx,apt upgrade nginx 就升级了,开发工具走 brew upgrade,各管各的。
不过 Dockerfile 本身我会留着。哪天想把博客迁到其他机器,或者未来在服务器上跑更多需要隔离的服务,它就是个现成的起点。
收尾
现在的状态:
- Node 24 + pnpm 11.3.0 就绪,可以构建项目
- Nginx 运行中,80 端口已开放
/var/www/blog目录准备好,等着放网站文件
下一篇做最后一步:把代码拉下来、改配置、构建、挂上域名和 HTTPS。