用 KooCLI 一条命令把静态页送上华为云:ECS + 安全组 + nginx 的 8 个实测坑
【摘要】 从建机到公网可访问的纯命令行路径,含 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)