AWS Lightsail 入门指南:开箱即用的云服务器实战
1. 为什么我坚持用 Lightsail 做第一个云项目?——给真正想上手的新人一句实在话
刚接触云计算时,我花三天时间在 EC2 控制台里反复创建、终止、重置安全组,最后连 SSH 都连不上,只看到一串红色错误:“Connection refused”。不是配置错了,是根本没搞懂“安全组”和“网络 ACL”的区别,更别说子网路由表怎么配。后来我换了个思路:先不碰 AWS 最底层的积木,而是找一块已经拼好的、能直接站上去的板子。AWS Lightsail 就是这块板子。它不是“简化版 EC2”,而是另一条路——一条专为“今天就想让网站跑起来”的人设计的路。它把虚拟机、防火墙、静态 IP、DNS、快照备份、甚至 WordPress 和数据库都打包成一个按钮,你点下去,三分钟之后就能在浏览器里输入 IP 地址看到首页。关键词就三个:开箱即用、价格透明、零网络配置负担。这不是给架构师用的,是给写完代码急着上线、做个人博客怕被黑、帮客户搭个展示页又不想被服务器运维拖垮的开发者准备的。它不教你怎么造轮子,但能让你立刻用上一辆能跑的车。如果你现在打开 AWS 控制台还觉得像在翻一本没目录的英文技术手册,那 Lightsail 就是你该停下来的第一个路口。它不替代 EC2,但它能让你在学开车之前,先坐进驾驶座,摸到方向盘,踩下油门——这种确定性带来的信心,比任何理论都重要。
2. Lightsail 的底层逻辑:它到底在帮你省掉什么?
2.1 它省掉的不是“步骤”,而是“决策疲劳”
很多人以为 Lightsail 就是“EC2 + 美化界面”,这是最大的误解。EC2 的核心价值在于“完全控制”,而 Lightsail 的核心价值在于“默认合理”。我们来拆解一下当你在 EC2 上部署一个 WordPress 站点时,实际要做的决策链:
- 选 AMI(Ubuntu 22.04?20.04?哪个版本的 WordPress 镜像最干净?)
- 选实例类型(t3.micro 足够?还是 t3.small?内存会不会爆?)
- 配置存储(根卷 30GB?要不要加 EBS 卷?GP2 还是 GP3?IOPS 怎么算?)
- 配置网络(VPC 选哪个?子网放公有还是私有?安全组规则写几条?SSH 开 22 端口,HTTP 开 80,HTTPS 开 443,MySQL 开 3306?要不要限制源 IP?)
- 配置 IAM 角色(这个实例要不要访问 S3?要不要调用 Lambda?权限最小化怎么写?)
- 登录后手动执行:
apt update && apt install apache2 mysql-server php libapache2-mod-php -y,再配 MySQL root 密码、创建数据库、下载 WordPress、解压、改权限、配 Apache vhost、重启服务…… - 最后还要手动申请 SSL 证书,用 Certbot 配置自动续期。
这是一条至少 15 个关键决策点的链条,其中任意一步选错或漏掉,整个流程就卡死。而 Lightsail 把这条链压缩成了三个选择:
- 选蓝图(Blueprint):点一下 “WordPress” —— 底层自动选 Ubuntu 22.04 + Apache + MySQL 8.0 + PHP 8.1 + WordPress 6.4,所有服务已预装、已启动、已配置好开机自启。
- 选套餐(Plan):$5/月(512MB RAM / 1vCPU / 20GB SSD)够个人博客;$10/月(1GB RAM / 1vCPU / 40GB SSD)够小企业官网;$20/月(2GB RAM / 2vCPU / 80GB SSD)够轻量电商后台。没有“按秒计费”的焦虑,没有“突发性能积分”的概念,账单永远是你在控制台里看到的那个数字。
- 选区域(Region):东京?新加坡?弗吉尼亚?选离你用户最近的那个。Lightsail 不需要你去建 VPC、子网、路由表——它背后已经为你建好了隔离的、开箱即用的网络环境,你只需要关心“我的用户在哪”。
提示:Lightsail 的“网络”不是抽象概念,而是具象功能。比如“静态 IP”不是你去 EC2 里申请再绑定,而是创建实例时勾选“Attach static IP”,系统当场分配一个永久地址;“DNS 管理”不是跳去 Route 53,而是在 Lightsail 控制台里点几下,填个域名,选个记录类型,保存就行;“防火墙”不是写几十行安全组规则,而是勾选“SSH”、“HTTP”、“HTTPS”三个开关,背后自动映射到对应端口和协议。它把“网络工程”降维成了“功能开关”。
2.2 它的“托管”到底管到哪一层?
很多新手会问:“Lightsail 是不是完全不用管服务器?”答案是:它托管了基础设施层(IaaS)的绝大部分,但操作系统层(OS)和应用层(App)仍需你介入,只是大幅降低了门槛。
具体来说:
- 它绝对托管的:物理服务器、虚拟化层(Hypervisor)、网络硬件、骨干带宽、DDoS 基础防护、主机监控(CPU/内存/磁盘/网络基础指标)、快照备份机制、静态 IP 地址池管理、DNS 解析服务(Lightsail 自带的 DNS 区域)。
- 它部分托管的:操作系统内核更新(可选自动)、应用软件包更新(需你手动
apt upgrade或通过面板一键更新)、Web 服务器配置(Apache/Nginx 配置文件你仍可编辑)、数据库参数调优(MySQL 配置你仍可改/etc/mysql/mysql.conf.d/mysqld.cnf)。 - 它完全不托管的:你的应用代码逻辑、业务数据内容、SSL 证书续期(虽然支持一键申请 Let’s Encrypt,但续期需手动或脚本)、自定义防火墙规则(如 fail2ban)、日志分析(CloudWatch Logs 需额外配置)。
这个边界非常关键。它意味着:你不会因为底层硬盘故障而丢数据(Lightsail 自动 RAID+快照),但如果你在 WordPress 后台误删了整站,快照就是你唯一的救命稻草——所以“启用自动快照”不是可选项,是必选项。我见过太多人以为“托管=万无一失”,结果半年没手动打快照,一次rm -rf /var/www/html/*就彻底凉了。
2.3 与 EC2 的本质差异:不是“高级”和“初级”的关系,而是“乐高套装”和“散装零件”的关系
把 Lightsail 比作 EC2 的“简化版”,就像把宜家衣柜说成是木工坊的“简化版”——它省掉的不是“高级功能”,而是“从零开始组装”的全部过程。EC2 是给你一整套木料、螺丝、电钻、锯子,让你自己画图、裁板、打孔、组装;Lightsail 是给你一个已经喷好漆、装好铰链、附带说明书的成品衣柜,你只需要拧紧四个脚垫,就能用。
- EC2 的自由度代价:你可以把一台 c5.4xlarge 实例装成数据库服务器,再挂载 10TB 的 io2 卷做 OLAP 分析,还能用 Placement Groups 让多台机器毫秒级通信。但这份自由,要求你必须懂存储 I/O 特性、网络延迟模型、实例生命周期管理。一个没经验的人,很容易花 $300/月租了一台“看起来很猛”的机器,却只跑了一个日活 100 的博客,CPU 利用率常年 2%。
- Lightsail 的效率红利:它强制你在一个“合理区间”内做选择。$5/$10/$20/$40 四档套餐,覆盖了 95% 的中小项目需求。它不让你纠结“要不要用 EBS 优化实例”,因为所有 Lightsail 实例默认就是 EBS 优化;它不让你选“使用哪种 AMI”,因为蓝图已经为你做了最优组合;它甚至不让你选“是否启用 CloudWatch Agent”,因为基础监控已内置。
这不是限制,而是聚焦。就像专业厨师用定制刀具,新手用一套全能厨刀——后者不能切出米其林摆盘,但能让你第一周就做出能吃的菜。Lightsail 的存在意义,就是帮你绕过“成为系统工程师”的漫长爬坡,直接进入“成为应用开发者”的核心战场。
3. 从零到上线:一次真实的 Lightsail 实战全流程(含所有坑点)
3.1 账户准备与控制台初探:别跳过这三步
第一步不是点“Create Instance”,而是确认三件事:
AWS 账户必须完成实名认证并绑定有效信用卡。Lightsail 虽然便宜,但 AWS 会对你账户做风控验证。我曾遇到一位用户,用公司邮箱注册后一直收不到验证邮件,折腾两天才发现邮箱被 AWS 误判为“高风险域名”,换个人 Gmail 五分钟搞定。实操心得:首次注册,务必用个人常用邮箱,且确保能接收国际邮件(检查垃圾邮件箱)。
登录后,必须进入 “Billing Dashboard” 查看 “AWS Free Tier” 状态。Lightsail 的 $0 免费额度是:每月 750 小时的 $5 套餐实例(即相当于一台 $5 实例运行整月)+ 3 个静态 IP + 100GB SSD 存储 + 1TB 出向流量。这个额度是自动叠加的,但前提是你的账户在创建 Lightsail 资源前,已成功激活免费套餐。我见过太多人直接开实例,第二天收到 $0.03 账单,才慌忙去查,结果发现免费额度因未完成身份验证而未生效。
首次进入 Lightsail 控制台,不要急着创建实例,先花 2 分钟熟悉四个核心 Tab:
- Instances:你的所有虚拟机,状态(Running/Stopped)、IP、套餐、创建时间一目了然;
- Networking:这里管三件事——静态 IP 列表(可绑定/解绑)、DNS 区域(可添加 A 记录、CNAME)、负载均衡器(创建/配置);
- Storage:块存储卷列表(可创建/附加/分离),注意:Lightsail 的块存储是独立计费的($0.10/GB/月),且必须手动挂载到实例才能用,不像 EC2 的根卷自动可用;
- Snapshots:所有快照列表,按实例分组,可设自动快照策略(强烈建议开启:每天 1 次,保留 7 天)。
注意:Lightsail 控制台右上角有个 “Region” 下拉框,它和 EC2 的 Region 是同一套。但 Lightsail 目前只支持 12 个区域(如 us-east-1, ap-northeast-1),比 EC2 少。如果你在东京区域创建了实例,后续想加一个新加坡的负载均衡器,这是做不到的——Lightsail 的所有资源必须在同一区域。这点和 EC2 完全不同,EC2 可以跨区域调用 API。所以选区不是“就近就行”,而是“未来半年我所有资源都得在这儿”。
3.2 创建实例:蓝图、区域、套餐的黄金三角选择法
假设你要部署一个个人技术博客(类似 Hexo 或 Hugo 静态站),目标用户 90% 在中国。我们一步步操作:
Step 1:选蓝图(Blueprint)
- 左侧菜单点 “Create instance” → 进入创建页。
- 在 “Choose your blueprint” 区域,不要选 “Apps + OS” 里的 “Node.js”!这是个经典误区。Node.js 蓝图预装的是 Express + NPM,但静态站不需要 Node 服务端。选 “OS only” → “Ubuntu 22.04 LTS”。理由:静态站只需 Nginx 或 Apache 托管 HTML 文件,Ubuntu 22.04 是当前最稳定、软件包最新、社区支持最好的 LTS 版本。CentOS 已停止维护,Debian 更新慢,Windows 对静态站纯属浪费。
Step 2:选区域(Region)
- 下拉框选 “Asia Pacific (Tokyo) ap-northeast-1”。为什么不是新加坡(ap-southeast-1)?实测数据:对中国华东用户,东京节点平均延迟 65ms,新加坡 82ms;对华北用户,东京 78ms,新加坡 95ms。差距虽小,但东京的网络出口带宽和稳定性历史更优。避坑技巧:打开 AWS Global Infrastructure 页面,查 “Regional Services” 表格,确认你选的区域是否支持 Lightsail 的全部功能(如负载均衡器、数据库)。有些新区域可能暂不支持。
Step 3:选套餐(Plan)
- 滑动到 “Choose your instance plan”,你会看到四档:$5, $10, $20, $40。
- 计算依据:静态站几乎不耗 CPU,主要吃内存(Nginx 缓存)和磁盘(存放 HTML/CSS/JS/图片)。一个 50 篇文章的博客,源文件 + 图片约 1.2GB。$5 套餐只有 20GB SSD,够用;$10 套餐 40GB,留足余量。但关键在内存:$5 是 512MB,$10 是 1GB。Nginx + 系统进程常驻约 300MB,剩下 200MB 给缓存刚好。如果未来加 CDN 或监控,$10 更稳妥。我最终选 $10—— 多花 $5/月,换来 2 年不用升级的安心。
Step 4:配置细节(这才是真功夫)
- Instance name:填
blog-prod-2024,别用默认的WordPress-1。命名规范:环境(prod/staging)+ 用途(blog/api/db)+ 年份,方便后期批量管理。 - SSH key pair:点 “Create new key pair”,命名为
blog-key-2024,下载.pem文件。警告:这个文件是唯一登录凭证!必须存到安全位置(如密码管理器的 Secure Notes),并立即设置权限chmod 400 blog-key-2024.pem。Windows 用户用 PuTTYgen 转成.ppk格式。 - Firewall:默认只开 “SSH”。但静态站需要 HTTP/HTTPS,所以勾选 “HTTP” 和 “HTTPS”。注意:Lightsail 的防火墙是“白名单”,只允许勾选的端口入站,其他全部拒绝。这比 EC2 安全组更严格,也更省心。
- Add launch script(高级技巧):在下方文本框粘贴:
这段脚本会在实例启动时自动安装 Nginx 并启动,省去你登录后手动执行的步骤。这就是 Lightsail 的“启动脚本”能力——它比 EC2 的 User Data 更易用,且支持 Bash/Python。#!/bin/bash apt update && apt install nginx -y systemctl enable nginx systemctl start nginx echo "<h1>Welcome to My Blog!</h1>" > /var/www/html/index.html
点击 “Create instance”,等待 90 秒。状态从 “Pending” 变成 “Running”,右侧显示 Public IP(如13.112.189.45),你就成功了。
3.3 连接与初始化:三种登录方式的实测对比
实例创建后,有三种连接方式,我全部试过,结论如下:
方式一:Lightsail 内置 Web 终端(最简单,适合 5 分钟快速验证)
- 在 Instances 列表,找到你的实例,点 “Connect” → “Connect using browser-based SSH client”。
- 优点:无需本地配置,打开即用,适合临时查日志、改配置。
- 缺点:终端体验差(复制粘贴卡顿、不支持 tmux/screen、字体小)、无法上传文件、超时断连频繁。仅推荐用于首次登录验证 SSH 是否通,或紧急救火。
方式二:本地 Terminal + SSH Key(主力推荐,Mac/Linux)
- 终端执行:
ssh -i "/path/to/blog-key-2024.pem" ubuntu@13.112.189.45 - 成功后,你会看到 Ubuntu 的欢迎信息。此时执行
df -h,确认根卷是/dev/xvda1,大小为 40GB(对应 $10 套餐)。 - 关键检查项:
sudo systemctl status nginx→ 确认 Nginx 正在运行(因启动脚本已执行);curl http://localhost→ 返回<h1>Welcome...</h1>,证明服务正常;sudo ufw status→ 显示 “Status: inactive”,Lightsail 默认禁用 UFW,靠自身防火墙管控,这是正确行为。
方式三:PuTTY + .ppk(Windows 用户首选)
- PuTTY 配置:Host Name 填 IP,Connection → SSH → Auth → Browse 选择
.ppk文件。 - 避坑点:PuTTY 默认连接用户名是
root,但 Lightsail Ubuntu 镜像禁用 root,必须填ubuntu。否则报错 “Server refused our key”。在 Connection → Data → Auto-login username 填ubuntu即可。
实操心得:无论哪种方式,首次登录后,立刻执行
sudo apt update && sudo apt upgrade -y。Lightsail 的 Ubuntu 镜像发布后,内核和关键安全补丁不会自动推送,必须手动升级。我曾因跳过此步,在一周后遭遇一个已知的 OpenSSL 漏洞被扫描利用,幸好只是测试环境。
3.4 部署静态博客:从本地到云端的三步闭环
以 Hugo 博客为例(Hexo 同理),完整流程:
Step 1:本地构建生成静态文件
- 在 Hugo 项目根目录,执行
hugo -d /tmp/myblog。这会在/tmp/myblog生成全部index.html、posts/、css/等文件。 - 为什么不用
hugo server?因为那是本地开发服务器,不能对外提供服务。必须用hugo命令生成纯静态文件。
Step 2:上传文件到 Lightsail
- 方法 A(SCP,推荐):终端执行
scp -i "/path/to/blog-key-2024.pem" -r /tmp/myblog/* ubuntu@13.112.189.45:/var/www/html/-r表示递归上传整个目录。注意路径末尾的/,它表示“上传到 html 目录下”,而不是“上传为 html 子目录”。 - 方法 B(SFTP,图形化):用 FileZilla,主机填 IP,用户名
ubuntu,密钥选.pem文件。拖拽/tmp/myblog/内容到远程/var/www/html/即可。 - 关键权限修复:上传后,执行
sudo chown -R www-data:www-data /var/www/html/。否则 Nginx 进程(以www-data用户运行)无权读取文件,会返回 403 Forbidden。
Step 3:验证与调试
- 浏览器访问
http://13.112.189.45,应看到你的博客首页。 - 如果是空白页,执行
sudo tail -f /var/log/nginx/error.log,实时查看错误。常见问题:open() "/var/www/html/posts/xxx/index.html" failed (2: No such file or directory)→ Hugo 的baseURL配置错误,导致生成的链接是/posts/xxx/,但 Nginx 默认不处理结尾斜杠。解决方案:在/etc/nginx/sites-available/default中,location /块内添加try_files $uri $uri/ =404;,然后sudo systemctl reload nginx。- 图片加载失败 → 检查 Hugo 的
static/目录是否正确复制,或config.toml中publishDir = "public"是否与上传路径一致。
至此,你的博客已上线。整个过程,从本地hugo命令到浏览器看到页面,不超过 5 分钟。
4. 生产就绪:安全、备份、域名、SSL 的硬核配置
4.1 安全加固:五道防线,每一道都不可省
Lightsail 默认安全水位不低,但生产环境必须主动加固。我按优先级排序:
防线一:禁用密码登录,只留密钥
- 编辑
/etc/ssh/sshd_config:PasswordAuthentication no PermitRootLogin no - 执行
sudo systemctl restart sshd。 - 验证:新开一个终端,用
ssh ubuntu@ip测试是否仍能登录(应该可以,因密钥还在);再用ssh -o PubkeyAuthentication=no ubuntu@ip测试,应报错 “Permission denied (publickey)”。这证明密码登录已关闭。
防线二:收紧防火墙(Lightsail 自带)
- 回到 Lightsail 控制台 → Networking → Firewall → Edit。
- 当前已开 SSH/HTTP/HTTPS。但 SSH 端口(22)对全世界开放是巨大风险。最佳实践:点击 “+ Add another” → Protocol: TCP, Port: 22, Source: 勾选 “My IP”,这样只有你当前公网 IP 能连 SSH。
- 注意:如果你的宽带是动态 IP(绝大多数家用宽带),每次重启光猫 IP 会变,这时你需要重新编辑防火墙,或干脆用 AWS Systems Manager Session Manager(需额外配置 IAM 角色),但对新手太重。折中方案:保留 SSH 对所有 IP 开放,但配合防线三。
防线三:安装 fail2ban(防暴力破解)
sudo apt install fail2ban -ysudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local- 编辑
/etc/fail2ban/jail.local,在[sshd]段下添加:enabled = true maxretry = 3 bantime = 3600 sudo systemctl enable fail2ban && sudo systemctl start fail2ban- 效果:连续 3 次输错 SSH 密码,该 IP 会被封 1 小时。我部署后第三天,
sudo fail2ban-client status sshd显示已有 17 个 IP 被封,全是来自俄罗斯、乌克兰的扫描器。
防线四:自动安全更新
sudo apt install unattended-upgrades -ysudo dpkg-reconfigure -plow unattended-upgrades→ 选 “Yes”- 编辑
/etc/apt/apt.conf.d/50unattended-upgrades,确保Unattended-Upgrade::Allowed-Origins包含"${distro_id}:${distro_codename}-security"; - 这样,所有安全补丁(如内核、OpenSSL)会在凌晨 2-3 点自动安装,无需人工干预。
防线五:应用层防护(针对 WordPress 等)
- 如果你用 WordPress 蓝图,务必:
- 删除默认管理员账号
admin,新建强密码账号; - 安装插件 “Wordfence Security”,开启登录保护、恶意文件扫描;
- 在
/var/www/html/wp-config.php末尾添加:define('DISALLOW_FILE_EDIT', true); // 禁用后台编辑主题/插件 define('WP_MEMORY_LIMIT', '256M'); // 防止内存溢出
- 删除默认管理员账号
4.2 备份策略:自动快照 + 手动导出的双保险
Lightsail 的快照是基石,但必须科学配置:
自动快照(必须开):
- 控制台 → Snapshots → Create auto snapshot → 选你的实例 → Frequency: Daily → Time: 02:00 AM → Retention: 7 days。
- 为什么是 7 天?因为 Lightsail 快照按 GB/月计费($0.05/GB/月),7 天足够覆盖“上周改坏的配置”和“昨天误删的文件”。保留 30 天,成本会翻 4 倍,且多数问题在 7 天内暴露。
手动快照(每周一执行):
- 每周一上午,登录控制台 → 选实例 → Actions → Create snapshot → 命名
blog-weekly-20240520。 - 目的:自动快照是“滚动备份”,手动快照是“里程碑备份”。当某次自动快照恰好在你改坏配置后生成,它也是坏的。手动快照由你掌控时机,确保每次重大更新(如 WordPress 升级、主题更换)后都有一个干净的还原点。
导出到 S3(终极保险):
- Lightsail 控制台 → Snapshots → 选一个快照 → Actions → Export to Amazon EC2 → 选区域 → Export。
- 这会将快照导出为 EC2 的 AMI,然后你可以在 EC2 控制台 → AMIs → 选中该 AMI → Actions → Copy AMI → 目标区域选
us-east-1(S3 全局桶所在),并勾选 “Encrypted”。 - 最后,用 AWS CLI 将 AMI 的 EBS 快照复制到 S3:
aws ec2 copy-snapshot --source-snapshot-id snap-xxxx --source-region ap-northeast-1 --description "Blog backup" --encrypted - 价值:当 Lightsail 区域发生极端故障(概率极低),你仍有完整的、加密的、可跨区域恢复的备份。这不是日常操作,但值得知道路径。
4.3 域名与 HTTPS:三步走通,零成本
把13.112.189.45换成myblog.com,并启用 HTTPS,只需三步:
Step 1:在 Lightsail 配 DNS(最简方案)
- 控制台 → Networking → Create DNS zone → 域名填
myblog.com→ Create。 - 进入该 DNS 区域 → Add record → Type: A, Name: @, Value:
13.112.189.45, TTL: 300 → Save。 - 等待:DNS 全球生效需 1-48 小时,但 Lightsail 的 DNS 通常 10 分钟内生效。用
dig myblog.com +short验证。
Step 2:申请免费 SSL 证书(Let’s Encrypt)
- Lightsail 控制台 → Networking → Create load balancer → 命名
blog-lb→ 选区域 → Next。 - 在 “Configure your load balancer” 页面,不添加任何实例,直接点 “Create load balancer”。
- 创建后,点该 LB → TLS Settings → Request new certificate → Domain:
myblog.com→ Validate domain via DNS → Lightsail 会自动生成两条 CNAME 记录(如_acme-challenge.myblog.com)。 - 回到 DNS 区域,Add record → Type: CNAME,Name 填
_acme-challenge,Value 填 Lightsail 给的值 → Save。 - 等待 5 分钟,回到 LB 的 TLS Settings,点 “Validate and issue”。证书签发成功后,状态变绿。
Step 3:绑定 LB 与实例,并强制 HTTPS
- LB 页面 → Attach instances → 选你的
blog-prod-2024实例 → Attach。 - LB 的 “TLS Settings” → Edit → HTTPS listener → Redirect HTTP to HTTPS → Enable。
- 此时,访问
http://myblog.com会自动跳转https://myblog.com,且浏览器显示绿色锁图标。 - 原理:LB 充当反向代理,它用证书解密 HTTPS 请求,再以 HTTP 协议转发给后端实例。所以你的 Nginx 无需配置 SSL,专注处理业务即可。
提示:这个方案用了 Load Balancer,会额外产生费用($16.40/月 + 流量费)。如果预算紧张,可跳过 LB,直接在实例上用 Certbot:
sudo apt install certbot python3-certbot-nginx -ysudo certbot --nginx -d myblog.com
但 Certbot 续期需定时任务,且证书只在本实例有效,不如 LB 方案优雅。
5. 进阶实战:当流量增长,如何不重装系统?
5.1 垂直扩展:升级套餐的完整迁移指南
当你的博客日 PV 从 1000 涨到 10000,CPU 常年 80%,$10 套餐不够了。Lightsail 不支持“原地升级”,必须迁移。以下是零停机迁移法:
Step 1:创建新实例(无缝衔接)
- 控制台 → Create instance → 选相同蓝图(Ubuntu 22.04)、相同区域、新套餐($20)、相同 SSH Key、相同防火墙(HTTP/HTTPS)。
- 命名
blog-prod-2024-upgraded。 - 关键:在 “Add launch script” 中,粘贴:
#!/bin/bash apt update && apt install nginx rsync -y systemctl enable nginx systemctl start nginx
Step 2:同步数据(rsync 增量同步)
- 在旧实例(
blog-prod-2024)上,执行:# 创建临时快照,确保数据一致性 sudo systemctl stop nginx sudo dd if=/dev/zero of=/tmp/zero bs=1M count=100 && sync sudo systemctl start nginx # 现在同步 rsync -avz --delete -e "ssh -i /home/ubuntu/blog-key-2024.pem" /var/www/html/ ubuntu@NEW_IP:/var/www/html/ --delete确保新实例目录与旧实例完全一致;-avz保证权限、时间戳、压缩传输。首次同步可能 10 分钟,后续增量同步只需几秒。
Step 3:切换流量(DNS 切换,5 分钟完成)
- 控制台 → Networking → DNS zone → myblog.com → 编辑 A 记录 → Value 改为新实例 IP → Save。
- 等待:TTL 设为 300 秒(5 分钟),所以最多 5 分钟后全球用户都会访问新实例。
- 验证:用
dig myblog.com +short查看是否已变;用curl -I http://myblog.com查看Server头是否显示新实例的 Nginx 版本。
Step 4:清理与验证
- 旧实例保持运行 48 小时,监控新实例日志
sudo tail -f /var/log/nginx/access.log,确认无 5xx 错误。 - 48 小时后,旧实例 → Actions → Stop(非 Terminate,以防万一)。
- 新实例上,执行
sudo apt upgrade -y,并检查df -h确认磁盘空间($20 套餐是 80GB,应充足)。
5.2 水平扩展:用负载均衡器扛住百万并发
当单实例瓶颈不仅是 CPU,还有网络带宽或连接数(如 WebSocket 应用),就需要水平扩展:
Step 1:创建第二个实例(完全克隆)
- 用旧实例的快照创建新实例:Snapshots → 选
blog-weekly-20240520→ Create instance → 选 $10 套餐 → 命名blog-prod-2024-node2。 - 这样,两台实例的系统、网站文件、配置完全一致,避免“配置漂移”。
Step 2:创建负载均衡器(LB)
- Networking → Create load balancer → 命名
blog-lb-ha→ 选区域 → Next。 - Configure → Health check path:
/healthz(需在 Nginx 配置中添加该路径返回 200)→ Next。 - Attach instances → 选
blog-prod-2024和blog-prod-2024-node2→ Attach。 - TLS Settings → 用已有的证书(或新申请)→ Enable HTTPS redirect。
Step 3:配置健康检查(让 LB 自动剔除故障节点)
- 在两台实例上,编辑
/etc/nginx/sites-available/default,添加:location /healthz { return 200 'OK'; add_header Content-Type text/plain; } sudo systemctl reload nginx。- LB 每 30 秒请求
/healthz,如果连续 3 次失败,自动将该实例从流量池移除,直到恢复。
Step 4:DNS 切换到 LB
- DNS zone → A 记录 → Value 改为 LB 的 DNS 名(如
blog-lb-ha-123456789.us-east-1.elb.amazonaws.com)→ Save。 - 现在,
