用 cloud-init 在华为云 ECS 上部署单文件 2048:从实例初始化到 HTTP 200 验证

举报
yd_299903619 发表于 2026/10/22 12:41:47 2026/10/22
【摘要】 记录一次在华为云华北-北京四使用按需 ECS、EulerOS 3.0、Nginx 和 cloud-init 部署单文件 2048 的完整过程,包括规格选择、最小权限安全组、ASCII Base64 用户数据、公网 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

验收标准不只检查“创建成功”:

  1. ECS 状态为运行中;
  2. Nginx 服务处于 active 状态;
  3. 连续多次访问返回 HTTP 200;
  4. Content-Type 为 text/html;
  5. 响应长度与源文件一致;
  6. 页面标题为 2048;
  7. 响应内容哈希与源文件哈希一致。

一、为什么先检查规格和网络

部署前先查目标区域的实例规格与售卖状态。本次查询发现原先计划的小规格在当前可用区不可售,最终选择了实际可用的 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 和哈希校验负责证明公网服务确实交付了正确内容。对个人开发者和团队来说,这套方法同样适用于部署文档站、演示页和轻量前端应用。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。