阿里云服务器运维全记录(Day 2 安全加固与性能优化)

一、文档定位与目标

本文档为《阿里云服务器搭建全记录》的进阶篇,专注于Day 2 运维场景。针对 1核 0.5GB 内存 的极限环境,提供一套“轻量级、高生存率”的安全加固与性能优化方案。

适用人群:已完成 Hexo 博客基础部署,希望提升服务器安全性、访问速度及建立容灾体系的初学者。

核心价值

  1. 安全加固:从网络层到应用层构建四道防线,抵御自动化脚本攻击。
  2. 性能压榨:在不升级硬件的前提下,通过 Gzip 和缓存策略大幅提升加载速度。
  3. 容灾自动化:建立“异地双备份”与“一键发布”流程,确保数据万无一失。

二、安全加固全景图 (Security Panorama)

在执行本指南前,请对照下表确认当前状态。

检查项加固前 (Risky)加固后 (Hardened)作用
登录方式Root 账户 + 密码登录普通用户 + 仅密钥登录防止暴力破解密码
防火墙阿里云安全组 (端口全开)UFW 防火墙 (仅开 22/80/443)最小化攻击面
主动防御Fail2Ban (自动封禁恶意 IP)阻断 SSH 爆破脚本
Web 伪装Nginx 显示版本号 (如 1.18.0)隐藏版本号减少针对特定版本的漏洞攻击
SSL 证书手动申请,90天后过期Certbot 自动续期防止证书过期导致网站不可用

三、分阶段加固操作手册

阶段 1:账号与 SSH 访问控制

阶段目标:切断 Root 密码登录入口,仅允许持有密钥的用户进入。

1.1 创建普通 Sudo 用户(可选但推荐)

说明:避免直接使用 root 操作是 Linux 安全的最佳实践。

1
2
3
4
5
# 1. 创建用户 (将 <user> 替换为你喜欢的用户名)
adduser azure

# 2. 赋予 sudo 权限
usermod -aG sudo azure

1.2 强制 SSH 密钥认证

警告:修改配置前,请务必确保你已经可以通过 SSH 密钥成功登录服务器,否则会把自己锁在门外

1
2
3
4
5
6
7
8
9
10
11
12
13
# 编辑 SSH 配置文件
sudo nano /etc/ssh/sshd_config

# --- 修改以下参数 ---
PermitRootLogin no # 禁止 root 直接登录 (若未创建普通用户,可暂设为 prohibit-password)
PasswordAuthentication no # 彻底禁止密码登录 (强制使用密钥)
PubkeyAuthentication yes # 确保开启密钥认证
# ------------------

# 保存退出:Ctrl+O -> Enter -> Ctrl+X

# 重启 SSH 服务生效
sudo systemctl restart ssh
  • 验证步骤:保持当前终端不关闭,新开一个终端尝试登录。如果不需要输入密码直接进入,则配置成功。

阶段 2:构建系统防火墙 (UFW)

阶段目标:启用 Ubuntu 自带的 UFW 防火墙,只允许必要的端口通讯。

高危操作提示:必须先执行 allow ssh,否则启用防火墙瞬间会断开连接。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 1. 检查状态 (默认为 inactive)
sudo ufw status

# 2. 【关键】放行 SSH 端口 (防止自锁)
sudo ufw allow ssh
# 注意:如果你修改过 SSH 端口 (如 2222),请使用 sudo ufw allow 2222

# 3. 放行 Web 服务 (80 和 443)
sudo ufw allow 'Nginx Full'

# 4. 启用防火墙
sudo ufw enable
# 提示 "Command may disrupt existing ssh connections..." 输入 y 并回车
  • 验证步骤:执行 sudo ufw status,应看到 Status: active 且包含 SSHNginx Full 的规则。

阶段 3:Nginx 隐身与 SSL 续期

阶段目标:隐藏 Nginx 版本号,并确保 HTTPS 证书能自动续命。

3.1 隐藏 Nginx 版本号

1
2
3
4
5
6
7
8
9
10
11
12
# 编辑 Nginx 主配置
sudo nano /etc/nginx/nginx.conf

# 在 http { ... } 块中添加或取消注释:
http {
...
server_tokens off; # <--- 关键配置
...
}

# 重载 Nginx
sudo systemctl reload nginx
  • 验证步骤:在本地终端执行 curl -I http://<服务器IP>。响应头 Server 字段应仅显示 nginx,无数字版本号。

3.2 验证 SSL 自动续期

Let's Encrypt 证书有效期仅 90 天。Certbot 通常会自动配置定时任务。

1
2
3
4
5
# 1. 检查定时器是否存活
systemctl list-timers | grep certbot

# 2. 模拟续期测试 (Dry Run) - 关键验证
sudo certbot renew --dry-run
  • 预期输出:若显示 Congratulations, all simulated renewals succeeded,则自动化机制正常。

阶段 4:部署 Fail2Ban (反暴力破解)

阶段目标:安装“全自动保安”,监控日志并封禁多次尝试登录失败的 IP。

4.1 安装与配置

1
2
3
4
5
6
7
8
# 1. 安装
sudo apt update && sudo apt install fail2ban -y

# 2. 复制配置文件 (永远不要直接修改 jail.conf)
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# 3. 编辑配置
sudo nano /etc/fail2ban/jail.local

4.2 关键参数修改指南

jail.local 文件中找到对应位置进行修改:

1
2
3
4
5
6
7
8
9
10
[DEFAULT]
# 封禁时间:1天 (86400秒)
bantime = 86400
# 允许失败次数
maxretry = 5
# 内存优化:确保 action 不发送邮件 (默认 action_ 即可)

[sshd]
enabled = true # <--- 必须显式开启
port = ssh

4.3 启动与状态检查

1
2
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd

四、性能优化实战 (0.5GB 极限压榨)

对于小内存服务器,优化的核心是 “用计算换带宽”“用缓存换计算”

4.1 Nginx Gzip 压缩 (服务端)

开启 Gzip 可将 HTML/CSS/JS 体积减少 60%-80%。

1
2
3
4
5
6
# 编辑 /etc/nginx/nginx.conf,在 http 块中加入:
gzip on;
gzip_min_length 1k; # 小于1k不压缩
gzip_comp_level 6; # 压缩等级 (1-9),6 是性价比之选
gzip_types text/plain text/css application/json application/javascript text/xml;
gzip_proxied any;

4.2 静态资源缓存 (浏览器端)

告诉浏览器缓存图片和样式表,减少服务器请求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 编辑站点配置 (如 /etc/nginx/sites-available/default)
# 在 server 块内添加:

# 图片缓存 30 天
location ~* \.(jpg|jpeg|gif|png|ico|svg|webp)$ {
expires 30d;
access_log off;
}

# CSS/JS 缓存 7 天
location ~* \.(css|js)$ {
expires 7d;
access_log off;
}

操作后必做sudo nginx -t (检查语法) -> sudo systemctl reload nginx

4.3 本地构建优化 (Hexo Neat)

背景:hexo-all-minifier 依赖 C++ 编译,在 Windows 上极易报错。推荐使用纯 JS 实现的 hexo-neat

  1. 安装插件 (在本地博客根目录): npm install hexo-neat --save

  2. 配置 _config.yml (添加至文件末尾):

1
2
3
4
5
6
7
8
9
10
11
12
13
neat_enable: true
neat_html:
enable: true
exclude:
neat_css:
enable: true
exclude:
- '**/*.min.css'
neat_js:
enable: true
mangle: true
exclude:
- '**/*.min.js'

五、容灾与自动化运维

5.1 异地双重备份 (Git Private Repo)

避免因电脑损坏或服务器宕机导致源码丢失。

  1. GitHub 操作:创建一个新的 Private (私有) 仓库。

  2. 本地关联git remote add origin_backup git@github.com:<用户名>/<仓库名>.git

  3. 日常备份:每次发布后执行 git push origin_backup main

5.2 一键发布脚本 (npm run ship)

将清理、生成、部署、备份合并为一个命令。编辑本地 package.json 的 scripts 字段:

1
2
3
4
5
6
7
"scripts": {
"build": "hexo generate",
"clean": "hexo clean",
"deploy": "hexo deploy",
"push": "git add . && git commit -m \"Auto backup\" && git push origin_backup main",
"ship": "hexo clean && hexo generate && hexo deploy && npm run push"
}
  • 使用方法:终端输入 npm run ship,即可全自动完成博客发布与源码备份。

5.3 外部监控 (UptimeRobot)

由于服务器内存紧张,不建议安装复杂的监控软件。推荐使用 UptimeRobot 免费版:

  • 配置方式:添加 HTTPS Monitor,指向你的域名。
  • 作用:每 5 分钟检查一次,网站宕机时发送邮件报警。

六、命令速查表

功能命令说明
系统监控htop显存/CPU 可视化监控 (推荐)
防火墙sudo ufw status查看防火墙规则
封禁状态sudo fail2ban-client status sshd查看被 ban 的 IP 数量
Nginx 测试sudo nginx -t修改配置后必须执行
Nginx 重载sudo systemctl reload nginx平滑重启,不中断连接
证书测试sudo certbot renew --dry-run模拟证书续期

八、配置示例库

1. 推荐的 Fail2Ban 配置 (/etc/fail2ban/jail.local)

1
2
3
4
5
6
7
8
9
10
[DEFAULT]
bantime = 86400 # 封禁 1 天
findtime = 600 # 10分钟内
maxretry = 5 # 错 5 次

[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s

2. 包含 Gzip 的 Nginx 主配置片段 (/etc/nginx/nginx.conf)

1
2
3
4
5
6
7
8
9
10
http {
# 开启 Gzip
gzip on;
gzip_min_length 1k;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml;

# 隐藏版本号
server_tokens off;
}