华为云 ECS 手工部署静态站点:安全组、系统防火墙、Nginx 的三层排查
华为云 ECS 手工部署静态站点:安全组、系统防火墙、Nginx 的三层排查
前阵子把一个单页 HTML 作品从开发者空间的临时隧道搬到一台正经的 ECS 上,踩了几个「看起来是哪一层的问题、其实是另一层」的坑。这篇把整条链路按实际操作顺序记一遍,重点放在「访问不通时先查哪、再查哪」。
一、开通时的三个选择
按需计费、规格 1 核 1G(t6.small.1 这类突发性能实例)跑一个静态页完全够,系统盘 40G 也用不满;公网用「按流量」的弹性公网 IP,5Mbit 峰值就够看页面了。真正需要注意的有三点:
- 安全组:Web 站点必须放通入方向 80(HTTPS 再加 443),管理端口 22 只对自己的出口 IP 放开更安全。默认安全组常常只放通了 22。
- 快速购买默认不设置登录凭证。创建完必须先「重置密码」,否则 SSH 一直 Permission denied,很容易误以为是密钥配置问题。
- 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 列表确认没有残留的按流量计费地址,最后看费用中心的账单,确认没有还在计费的资源。云上最容易「忘了还在花钱」的,往往就是这些不显眼的附属资源。
- 点赞
- 收藏
- 关注作者
评论(0)