华为云 ECS 手工部署静态站点:安全组、系统防火墙、Nginx 的三层排查

举报
yd_224417480 发表于 2026/10/24 12:42:11 2026/10/24
【摘要】 华为云 ECS 手工部署静态站点:安全组、系统防火墙、Nginx 的三层排查前阵子把一个单页 HTML 作品从开发者空间的临时隧道搬到一台正经的 ECS 上,踩了几个「看起来是哪一层的问题、其实是另一层」的坑。这篇把整条链路按实际操作顺序记一遍,重点放在「访问不通时先查哪、再查哪」。 一、开通时的三个选择按需计费、规格 1 核 1G(t6.small.1 这类突发性能实例)跑一个静态页完全...

华为云 ECS 手工部署静态站点:安全组、系统防火墙、Nginx 的三层排查

前阵子把一个单页 HTML 作品从开发者空间的临时隧道搬到一台正经的 ECS 上,踩了几个「看起来是哪一层的问题、其实是另一层」的坑。这篇把整条链路按实际操作顺序记一遍,重点放在「访问不通时先查哪、再查哪」。

一、开通时的三个选择

按需计费、规格 1 核 1G(t6.small.1 这类突发性能实例)跑一个静态页完全够,系统盘 40G 也用不满;公网用「按流量」的弹性公网 IP,5Mbit 峰值就够看页面了。真正需要注意的有三点:

  1. 安全组:Web 站点必须放通入方向 80(HTTPS 再加 443),管理端口 22 只对自己的出口 IP 放开更安全。默认安全组常常只放通了 22。
  2. 快速购买默认不设置登录凭证。创建完必须先「重置密码」,否则 SSH 一直 Permission denied,很容易误以为是密钥配置问题。
  3. EIP 随实例释放这个勾选项在购买页和删除页各出现一次,购买时忘了勾会造成删除实例后还留着一个闲置 EIP 在计费。

二、部署本身只有四步

# 1. 登录
ssh root@<EIP>

# 2. 装 Nginx(Ubuntu)
apt-get update && apt-get install -y nginx

# 3. 放页面:给站点单独开一个目录,别直接覆盖默认首页
mkdir -p /var/www/html/my-site
# 上传 index.html 到该目录
chmod -R 755 /var/www/html/my-site

# 4. 开机自启并立即启动
systemctl enable --now nginx

访问 http://<EIP>/my-site/index.html,能出页面就算通了。如果用的是自己写的 server 块,记得 nginx -t 先验配置再 systemctl reload nginx;直接 restart 会把配置错误变成「服务起不来」,反而多一层排查。

三、访问不通时的排查顺序

很多教程一上来就让人查 Nginx 日志,但实际最常见的问题在最外面一层。我按「离用户最近 → 离进程最近」的顺序排:

第一层:安全组

先看实例详情里绑定的安全组,入方向是否真的有 80。判断方法很简单:在实例内部 curl -I http://127.0.0.1 通、从本地 curl -I http://<EIP> 不通,且没有任何响应(不是 404,也不是超时很久),基本就是安全组没放通。

一个容易忽略的点:安全组是有状态的,但只对已建立的连接。别人主动发起的入方向请求,必须在入方向规则里显式允许,出方向规则不会「反向」放通。

第二层:系统防火墙

云上的 Ubuntu 镜像通常 ufw 是关闭的,但如果你装过 Docker、跑过一些加固脚本,iptables 规则可能已经变了:

ufw status                     # 或 systemctl status ufw
iptables -L INPUT -n --line-numbers | head
ss -lntp | grep :80

第三行是关键:ss 看到的监听地址如果是 127.0.0.1:80,那外部再怎么放通也进不来,说明 Nginx 只监听了回环地址,需要改 listen 配置。

第三层:Nginx 与路径

前两层都通、访问返回 403/404 时,问题在 Nginx:

  • 403 大多是目录权限或 root 指向的目录不存在(Nginx 用 www-data 跑,路径上每一级都要有 x 权限);
  • 404 先确认 root 与 location 拼出来的真实路径,nginx -T 打印合并后的完整配置最靠谱,比一层层翻 include 快;
  • 想快速验证是不是站点配置的问题,可以临时把测试文件放到 /usr/share/nginx/html/,访问默认站点能否打开,能打开就说明配置层有问题,不能打开就说明前面两层还有问题。

四、一个真实踩过的坑:地址必须带文件名

这次的需求是「把这个 HTML 提交到一个会校验地址的活动后台」,后台对提交的链接做了正则校验,要求长这样:

http://<EIP>/my-site/index.html

也就是说只填 http://<EIP>/my-site/ 虽然浏览器能正常打开(Nginx 会自动补 index),但后台校验不通过。凡是「提交链接给别人/给系统校验」的场景,地址里带上具体文件路径,比依赖服务器的目录索引行为稳妥得多。

顺带一提,如果静态站点要靠 JS 发请求,注意混合内容问题:页面用 https 打开、接口是 http 时,浏览器会直接拦掉请求,控制台只报一行 Mix Content,很容易被误认为跨域。

五、验收到清理

验收别只看浏览器里能不能打开:

curl -I http://<EIP>/my-site/index.html     # 期望 HTTP/1.1 200
curl -s http://<EIP>/my-site/index.html | head -5

-I 拿到 200 说明链路通;返回 301 说明配置里做了跳转,要顺着看跳转到哪。

用完清理时按「实例 → 磁盘 → 弹性公网 IP」的顺序核对:删除实例时勾选系统盘一起释放,再到 EIP 列表确认没有残留的按流量计费地址,最后看费用中心的账单,确认没有还在计费的资源。云上最容易「忘了还在花钱」的,往往就是这些不显眼的附属资源。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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