用 KooCLI 一条命令把静态页送上华为云:ECS + 安全组 + nginx 的 8 个实测坑

举报
yd_261373198 发表于 2026/10/22 19:27:26 2026/10/22
【摘要】 从建机到公网可访问的纯命令行路径,含 flavor/镜像架构匹配、multiport 安全组规则、EIP 绑定时序、根路径 404 等 8 个实测坑。

用 KooCLI 一条命令把静态页送上华为云:ECS + 安全组 + nginx 的 8 个实测坑

把一个纯静态页面从本机推到公网,最容易的做法是买台云主机手点控制台。但一旦要重复做(活动、演示、临时作品投放),手点的成本就显出来了:选规格要翻页、安全组默认只开 22、镜像和架构还得对得上。这篇文章记录的是一条纯命令行路径:KooCLI 建机 → 安全组放行 80 → SSH 装 nginx → 公网直连验证,以及过程中真实撞到的 8 个坑。

## 一、先决条件与鉴权

KooCLI(`hcloud`)的鉴权有两种模式:AK/SK 和临时 token。临时密钥下载下来的 `credentials.csv` 里字段是 `Access Key Id` / `Secret Access Key`,导入后落在 `~/.hcloud/config.json`,注意这个文件本身就是敏感文件,权限应该是 600。

第一次运行 `hcloud version` 会要求同意隐私协议,交互式输入 `y`。批处理里用 `printf 'y\n' | hcloud version` 喂进去,否则脚本会卡在等待输入。

坑 1:全局服务缺 `cli-domain-id`。 调 IAM 这类全局接口时直接报 `APIGW.0301 Incorrect IAM authentication information: get token error`。原因是账号级接口需要 domain id(账号 ID),而项目级接口需要 project id。一条命令补齐:

```bash
hcloud IAM KeystoneListProjects --cli-region=cn-north-4   # 拿 project id
hcloud configure set --cli-project-id=<project id> --cli-region=cn-north-4
```

## 二、选规格:别被 flavor 名字骗了

`ListFlavors` 一次能返回上千条,直接肉眼挑会挑错。

**坑 2:`kc1.*` 是鲲鹏(ARM),配 x86 镜像会直接失败**,报 `The flavor does not match the image`。想用最小的 x86 实例,选 `s6.small.1`(1 核 1G);通用型是 `c6.large.2`(2 核 4G)。

坑 3:镜像要用 gold 镜像 ID,不要用名字模糊匹配。 例如 `Ubuntu 22.04 server 64bit` 的 ID 形如 `89ac6e18-...`,用 `hcloud IMS ListImages --__imagetype=gold` 过滤 `__os_version` 更稳。

## 三、安全组:默认只开 22

新建 VPC 时默认安全组通常只有 ICMP 和 22。

坑 4:v3 接口放行端口用 `multiport` 而不是 `port_range_min/max`。 想同时开 22 和 80,写两条规则最省事:

```bash
hcloud VPC CreateSecurityGroupRule --cli-region=cn-north-4 \
  --security_group_id=<sg id> \
  --security_group_rule.direction=ingress \
  --security_group_rule.protocol=tcp \
  --security_group_rule.multiport=80 \
  --security_group_rule.remote_ip_prefix=0.0.0.0/0 \
  --security_group_rule.action=allow
```

坑 5:重复创建立即返回 `VPC.9902 Security Group is in use`。 这条错误看着像"安全组被占用不能改",实际是规则已存在的幂等提示,用 `ListSecurityGroupRules` 复核即可,不必删重建。

## 四、建机与拿 IP

`CreateServers` 是异步的,返回 `job_id` 和 `serverIds`,实例要轮询到 `ACTIVE`。EIP 用 `5_bgp`、计费 `traffic`(按流量),带宽 5Mbps 足够静态页。

坑 6:`ListServersDetails` 刚 ACTIVE 时 `addresses` 里的公网地址可能还是空。 轮询脚本里判定"ACTIVE 且有公网 IP"才继续,否则拿到空字符串去 SSH 会白等超时。另外 EIP 绑定完成和实例 ACTIVE 不是同一时刻,多等 20~30 秒。

## 五、部署与验证

SSH 上去装 nginx,把页面放到 `/opt/<project>/`,配置里写 `listen 80 default_server;` + `root /opt/<project>;`。`nginx -t` 通过再 `systemctl reload nginx`。

坑 7:只放 `/opt/<project>/sub/index.html` 时根路径是 404。 校验方(活动平台、外部检查)常常直接请求 `/`,所以要么根目录也放一份 `index.html`,要么写 `try_files`。这一点在"提交地址必须可访问"的场景里直接决定判定结果。

坑 8:从本机 curl 通,不代表对方能访问。 反过来也一样:某些云隧道的域名在外面可达,但本机代理环境变量会污染 `curl`。测试前 `env -u ALL_PROXY -u HTTPS_PROXY -u https_proxy`,或者直接用 `--noproxy '*'`。

## 六、成本与清理

按需实例 `s6.small.1` 大约 0.1~0.2 元/小时,验证完立刻删:

```bash
hcloud ECS DeleteServers --cli-region=cn-north-4 \
  --server_id=<id> --delete_publicip=true --delete_volume=true
```

`delete_publicip` 和 `delete_volume` 一定要显式给,否则 EIP 和云硬盘会留下来继续计费——这是"我明明删了机器怎么还有账单"的最常见原因。

## 小结

命令行建站的价值不在省几次点击,而在可重复:把规格、镜像、安全组、验证、清理写成脚本,下次换个账号或区域仍然一次跑通。真正花时间的从来不是 `CreateServers`,而是上面这 8 个"文档没写、报错没提示"的边缘条件。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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