一、文档定位与目标
本指南是基于真实环境(Aliyun ECS 1核 0.5GB内存)的搭建记录复盘。旨在为零基础用户提供一份可逐行复制执行的操作手册,涵盖从服务器初始化、安全加固、资源优化到 Hexo 博客自动化部署的全过程。文档兼具教学价值与故障排除手册功能。
二、项目概览与技术栈
- 项目目标:搭建独立部署的个人博客,实现 “本地写作 -> 一键推送 -> 自动发布” 的 DevOps 流程。
- 硬件约束:0.5GB RAM (极度受限,需精细化内存管理,严防 OOM)。
- 操作系统:Ubuntu 22.04 LTS。
- 完整技术栈:
- 云平台:阿里云 ECS (Elastic Compute Service)
- Web服务器:Nginx (高性能,低内存占用)
- 静态生成器:Hexo (本地生成,服务器仅托管静态文件)
- 自动化:Git Hooks (实现 CI/CD 流水线)
- 安全:SSH Key认证 + 自动 Swap + 防火墙 + SSHD 硬化
三、分阶段详细操作手册
阶段 1:服务器初始访问与安全基线
阶段目标:建立安全的远程连接,摒弃不安全的密码登录,启用密钥认证体系。
1.1 首次连接(密码验证)
前置检查:在阿里云控制台重置实例密码,并重启实例。确认安全组(防火墙)入方向已放行 22 端口。
# 在本地终端(PowerShell 或 Terminal)执行
# 格式:ssh root@<公网IP>
ssh root@47.xxx.xxx.xxx
- 交互说明:
- 出现
Are you sure you want to continue connecting (yes/no/fingerprint)?-> 输入yes并回车。 - 出现
root@... password: -> 输入密码(注意:Linux 终端输入密码不显示任何字符),输完盲打回车。 - 预期输出:出现
Welcome to Alibaba Cloud Elastic Compute Service!及命令提示符root@...:~#。
- 出现
1.2 配置 SSH 密钥登录(免密)
前置检查:本地需已有 SSH 公钥(通常在 ~/.ssh/id_rsa.pub 或 ~/.ssh/id_ed25519.pub)。若无,请先运行 ssh-keygen 生成。
步骤 A:本地获取公钥
# Windows PowerShell 执行
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub
# 复制输出的整行内容(以 ssh-ed25519 或 ssh-rsa 开头,以邮箱或主机名结尾)
步骤 B:服务器端写入白名单
# 在服务器终端执行
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# 将下方 [YOUR_PUBLIC_KEY] 替换为你刚才复制的内容
echo "[YOUR_PUBLIC_KEY]" >> ~/.ssh/authorized_keys
# 锁定权限(关键步骤,权限不对会导致免密失效)
chmod 600 ~/.ssh/authorized_keys
验证步骤:保持当前窗口不关,新建一个本地终端窗口,执行 ssh root@<IP>。若直接登录无需密码,则成功。
1.3 SSH 服务硬化(禁用密码登录)
警告:必须先验证密钥登录成功,否则会把自己锁在门外。
# 编辑配置文件
nano /etc/ssh/sshd_config
# 使用方向键找到并修改以下参数(去掉行首 # 号):
PasswordAuthentication no # 彻底禁止密码登录
PermitRootLogin prohibit-password # 仅允许密钥登录root,禁止密码登录root
# 保存退出:Ctrl+O -> Enter -> Ctrl+X
# 语法检查与重启服务
sshd -t # 若无输出则配置正确,若报错请重新检查文件
systemctl restart ssh
阶段 2:资源优化与生存保障(0.5GB 专用)
阶段目标:移除云厂商监控代理(节省 ~50MB 内存),配置 Swap 防止 OOM(内存溢出)崩溃。
2.1 移除阿里云监控插件
说明:低配机器上,监控插件是主要内存杀手。
# 1. 停止并禁用 Argus Agent (云监控)
systemctl stop argusagent
pkill -9 argusagent # 强制查杀残留进程
rm -rf /usr/local/cloudmonitor # 删除文件
# 2. 卸载安骑士 (AliYunDun/安全中心) - 下载官方卸载脚本
wget http://update.aegis.aliyun.com/download/uninstall.sh
chmod +x uninstall.sh
./uninstall.sh
- 验证步骤:执行
top命令,确保列表中不再有AliYunDun或argusagent进程。
2.2 创建 Swap 交换空间(生命线)
说明:当物理内存耗尽时,利用磁盘充当虚拟内存,防止系统卡死或杀进程。
# 1. 创建 2GB 的 Swap 文件 (物理内存的4倍)
fallocate -l 2G /swapfile
# 2. 设置权限(安全要求:仅 root 可读写)
chmod 600 /swapfile
# 3. 格式化并启用
mkswap /swapfile
swapon /swapfile
# 4. 永久化配置(开机自动挂载)
# 警告:必须是两个箭头 >>,切勿漏写导致覆盖文件
cp /etc/fstab /etc/fstab.bak
echo '/swapfile none swap sw 0 0' >> /etc/fstab
- 验证步骤:执行
free -h。确保 Swap: 行显示 Total 为 2.0Gi。
阶段 3:Web 服务器部署与修复
阶段目标:修复系统依赖,安装 Nginx 并配置静态站点托管。
3.1 系统更新与依赖修复
常见问题:0.5GB 机器在 apt update 时容易因内存不足卡死或被中断,导致锁文件残留。
# 1. 强力清理可能残留的锁
rm /var/lib/dpkg/lock*
rm /var/lib/apt/lists/lock
# 2. 修复中断的安装过程(自我疗愈)
dpkg --configure -a
# 3. 更新系统软件 (耐心等待,可能需 2-5 分钟)
apt update && apt upgrade -y
3.2 安装与启动 Nginx
# 安装
apt install nginx -y
# 启动并设置开机自启
systemctl enable nginx
systemctl start nginx
# 检查状态
systemctl status nginx
- 验证步骤:浏览器访问
http://<服务器IP>。应看到Welcome to nginx!页面。
阶段 4:自动化部署流水线搭建
阶段目标:利用 Git Hooks 实现代码推送到服务器后,自动部署到 Nginx 目录。
4.1 创建目录结构
# 1. 网站根目录 (Nginx 展示的地方)
mkdir -p /var/www/hexo
# 2. Git 裸仓库 (接收代码的中转站)
mkdir -p /var/repo/hexo.git
cd /var/repo/hexo.git
git init --bare
4.2 编写 Post-Receive 钩子
核心逻辑:Git 收到代码后,强制检出(Checkout)到网站目录。
cd hooks
nano post-receive
# --- 在编辑器中写入以下两行 (第一行是 Shebang) ---
#!/bin/bash
git --work-tree=/var/www/hexo --git-dir=/var/repo/hexo.git checkout -f
# -----------------------------------------------
# 保存退出:Ctrl+O -> Enter -> Ctrl+X
# 赋予执行权限(至关重要,否则推送会显示 hooks 无法运行)
chmod +x post-receive
4.3 配置 Nginx 指向新目录
nano /etc/nginx/sites-enabled/default
# 修改 root 路径
# 原来:root /var/www/html;
# 改为:root /var/www/hexo; <-- 注意分号
# 保存退出并重载配置
systemctl reload nginx
阶段 5:本地开发环境与部署 (Windows 端)
阶段目标:在本地生成博客内容并推送到服务器。
5.1 Node.js 环境准备
注意:Hexo 7+ 需要 Node.js 14+。若版本过低需升级。
# 检查版本
node -v
# 若版本低于 v18,推荐下载官方 MSI 安装包进行覆盖安装
# 若安装后版本未变,检查环境变量 PATH 设置
5.2 Hexo 初始化与配置
# 全局安装 Hexo CLI
npm install -g hexo-cli
# 初始化博客目录 (选一个你存放代码的目录)
hexo init myblog
cd myblog
npm install
# 安装 Git 部署插件
npm install hexo-deployer-git --save
5.3 配置连接参数
编辑博客根目录下的 _config.yml 文件,修改底部 deploy 部分:
deploy:
type: git
repo: root@<服务器IP>:/var/repo/hexo.git
branch: master
5.4 首次部署
# 清理 -> 生成 -> 部署 (PowerShell 中建议分步执行或用分号)
hexo clean; hexo g; hexo d
- 验证步骤:
- 终端显示
INFO Deploy done: git。 - 浏览器访问
http://<服务器IP>,应看到Hexo默认博客页面。
- 终端显示
四、常见 DEBUG 场景库(故障排除中心)
场景 1:SSH 连接被拒绝或卡死
- 现象:
Permission denied (publickey)Connection closed by remote host- 输入命令后光标闪烁无反应(卡死)
- 可能原因:
- 密钥未正确添加到
authorized_keys。 - 服务器负载过高(CPU/内存满载)导致 SSH 无法响应。
- 防火墙/安全组未放行端口 22。
- 密钥未正确添加到
- 解决方案:
- 权限排查:尝试带详细日志连接
ssh -v root@IP。 - 强制重启:若长时间无反应,去阿里云控制台“强制重启”实例。重启后立即执行
rm /var/lib/dpkg/lock*清理残留锁。 - 回退密码:若密钥完全失效,去控制台使用 VNC 登录修改
sshd_config重新允许密码登录 (PasswordAuthentication yes)。
- 权限排查:尝试带详细日志连接
场景 2:apt/dpkg 安装软件时卡住或被 Killed
- 现象:
Processing triggers for man-db...卡住不动。- 出现
Killed字样,随后进程终止。
- 可能原因:
- OOM (Out of Memory):内存耗尽,Linux 内核杀死了 apt 进程。
- 解决方案:
- 检查 Swap:执行
free -h确认 Swap 是否存在且被使用。若无,参考阶段 2 重建。 - 自我修复:
- 检查 Swap:执行
# 杀掉卡死的进程
killall apt apt-get
# 删除锁
rm /var/lib/apt/lists/lock
rm /var/lib/dpkg/lock*
# 重新配置半安装状态的包
dpkg --configure -a
场景 3:Hexo 部署成功但访问仍是 “Welcome to nginx”
- 现象:本地显示
Deploy done: git,但网页内容未变。 - 可能原因:
Nginx配置文件中的root路径未修改。Git Hook脚本没有执行权限 (chmod +x)。- 浏览器缓存。
- 诊断步骤:
- 检查文件是否到了服务器:
ls /var/www/hexo。 - 检查
Nginx配置:cat /etc/nginx/sites-enabled/default。 - 检查
Hook权限:ls -l /var/repo/hexo.git/hooks/post-receive(必须有 x 位)。
- 检查文件是否到了服务器:
场景 4:Windows 本地 hexo server 报错
- 现象:
hexo: 无法将“hexo”项识别为 cmdlet… 或 ERR_REQUIRE_ESM。 - 可能原因:
Node.js路径变更导致环境变量失效。Hexo版本与Node.js版本不兼容 (Hexo 7+需要Node 14+)。
- 解决方案:
- 重新安装 CLI:
npm install -g hexo-cli。 - 使用 npx:尝试
npx hexo server。 - 重装依赖:删除
node_modules文件夹后重新npm install。
- 重新安装 CLI:
五、命令速查表
系统健康检查
free -h # 检查内存和 Swap 使用量(关键)
df -h # 检查磁盘空间
top # 实时查看 CPU/内存占用(按 q 退出)
ss -antpl | grep 80 # 检查 Nginx 是否在监听 80 端口
服务管理
systemctl status nginx # 查看 Nginx 状态
systemctl restart nginx # 重启 Nginx
systemctl reload nginx # 重载配置(不中断连接)
Git 钩子调试
# 手动运行钩子看是否有报错
cd /var/repo/hexo.git/hooks
./post-receive
六、配置示例库
1. 安全加固版 /etc/ssh/sshd_config (关键参数)
Port 22
PermitRootLogin prohibit-password # 禁止 root 密码登录
PubkeyAuthentication yes # 开启密钥登录
PasswordAuthentication no # 禁止普通密码登录
2. Git Post-Receive 钩子 /var/repo/hexo.git/hooks/post-receive
#!/bin/bash
# 强制将代码检出到 Web 目录
git --work-tree=/var/www/hexo --git-dir=/var/repo/hexo.git checkout -f
3. Hexo 部署配置 _config.yml
# 位于文件底部
deploy:
type: git
repo: root@<你的公网IP>:/var/repo/hexo.git
branch: master