用 cloud-init 在华为云 ECS 上部署单文件 2048:从实例初始化到 HTTP 200 验证
背景
把一个纯静态网页从“能在本地打开”推进到“能通过公网稳定访问”,中间通常还差三件事:云服务器初始化、Web 服务安装、网络访问验证。本文以单文件 2048 页面为例子,记录一次在华为云 ECS 上使用 Nginx 和 cloud-init 完成部署的实践,重点不是展示控制台截图,而是给出可复核的交付链。
目标与验收标准
本次部署使用华北-北京四区域的一台按需 ECS,系统镜像为 Huawei Cloud EulerOS 3.0,系统盘 40 GiB,规格为 2 vCPU / 2 GiB。公网侧绑定按流量计费的 EIP,站点路径固定为:
http://<ECS_EIP>/hc-activity/index.html
验收标准不只检查“创建成功”:
- ECS 状态为运行中;
- Nginx 服务处于 active 状态;
- 连续多次访问返回 HTTP 200;
- Content-Type 为 text/html;
- 响应长度与源文件一致;
- 页面标题为
2048; - 响应内容哈希与源文件哈希一致。
一、为什么先检查规格和网络
部署前先查目标区域的实例规格与售卖状态。本次查询发现原先计划的小规格在当前可用区不可售,最终选择了实际可用的 2 vCPU / 2 GiB 规格;如果直接照搬旧参数,创建请求可能在库存校验阶段失败。
网络侧使用最小权限思路:新建专用安全组,只放行 HTTP 80 给公网访问,SSH 22 仅放行操作者的当前出口 IP,不复用已有宽权限安全组。EIP 设置为按流量计费,并勾选“随实例释放”,避免实例删除后继续保留公网地址。
二、把 cloud-init 做成可重复的初始化脚本
最初直接把含中文的完整 HTML 写入实例自定义数据,页面提示内容必须为 ASCII。更稳妥的方法是把 HTML 先做 Base64,再用一段纯 ASCII 的 shell 脚本安装 Nginx、还原页面并启动服务:
#!/bin/bash
set -euxo pipefail
if command -v dnf >/dev/null 2>&1; then
dnf install -y nginx
else
yum install -y nginx
fi
mkdir -p /usr/share/nginx/html/hc-activity
printf '%s' '<HTML_BASE64>' | base64 -d \
> /usr/share/nginx/html/hc-activity/index.html
chown -R nginx:nginx /usr/share/nginx/html/hc-activity
chmod 755 /usr/share/nginx/html/hc-activity \
/usr/share/nginx/html/hc-activity/index.html
systemctl enable --now nginx
systemctl is-active nginx
这段脚本有两个关键点:
set -euxo pipefail能让初始化失败尽早暴露,不需要登录实例逐条排查;- 用 Base64 传递 HTML,可以避免中文、引号和换行在 user_data 传输过程中被错误解释。
三、创建后不要只看“运行中”
实例进入“运行中”不代表页面已经可用。cloud-init 仍在安装软件时,80 端口可能暂时没有监听,或者 Nginx 尚未启动。因此需要轮询访问,而不是只抓一次请求。
本次采用的验证命令如下:
curl -sS -D - \
-o /tmp/hc-activity.html \
--max-time 10 \
http://<ECS_EIP>/hc-activity/index.html
实测连续 5 次均返回:
HTTP/1.1 200 OK
Server: nginx/1.24.0
Content-Type: text/html
Content-Length: 9929
随后继续核对页面内容:
grep -o '<title>[^<]*</title>' /tmp/hc-activity.html
sha256sum /tmp/hc-activity.html index.html
页面标题为 2048,公网响应哈希与源文件一致,说明不只是“端口通了”,而是目标文件确实被正确写入并由 Nginx 提供。
四、容易忽略的三个问题
1. 开发环境能访问,不等于公网可访问
安全组、EIP 绑定、Nginx 监听地址和实例初始化状态是四个不同环节。建议从公网侧使用独立终端执行 curl,并记录响应头和响应哈希。
2. 不要为了省事开放全部端口
静态站点只需要 HTTP 80。SSH 22 应限制在调试来源 IP;任务结束后应随之删除专用安全组。
3. 临时资源必须清理
按需 ECS 和 EIP 会持续计费。确认部署与活动提交成功后,应及时释放临时资源;如果后续还需要公开链接,应先明确资源保留周期和成本。
总结
一次可靠的静态站点部署,应当形成“产物校验、最小权限、自动初始化、公网验证、资源清理”的闭环。cloud-init 负责把可重复的初始化步骤固化下来,curl 和哈希校验负责证明公网服务确实交付了正确内容。对个人开发者和团队来说,这套方法同样适用于部署文档站、演示页和轻量前端应用。
- 点赞
- 收藏
- 关注作者
评论(0)