Skip to content
huazaiki's blog
Go back

上手配置一台新的服务器(三):运行环境与 Nginx

Edit page

前两篇完成了安全加固和终端环境配置,这篇来装运行环境。我的目标是让这个 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.jsonpackageManager 字段和 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 本身我会留着。哪天想把博客迁到其他机器,或者未来在服务器上跑更多需要隔离的服务,它就是个现成的起点。

收尾

现在的状态:

下一篇做最后一步:把代码拉下来、改配置、构建、挂上域名和 HTTPS。


Edit page

Previous Post
上手配置一台新的服务器(四):部署博客与 HTTPS
Next Post
上手配置一台新的服务器(二):终端美化与常用工具