华为云 ECS 实践:用 Docker 部署 Nginx,让一个静态网站跑起来
华为云 ECS 实践:用 Docker 部署 Nginx,让一个静态网站跑起来
把一个网页放到云服务器上,需要经过哪些步骤?
本文以华为云弹性云服务器 ECS 为运行环境,通过 Docker 部署 Nginx,完成静态页面发布、健康接口验证和日志查看。整个示例围绕一条简单的访问链路展开:
浏览器 → ECS 弹性公网 IP → 主机 80 端口 → Nginx 容器 → 静态页面
先把这条链路跑通,再逐步加入域名、HTTPS 和自动化发布,会更容易理解每一层的作用。
一、准备云服务器和访问规则
本文使用一台运行 Ubuntu 24.04 LTS 的 ECS,并假设已经安装 Docker,且当前用户具有 sudo 权限。未安装 Docker 的读者,需要先完成 Docker 安装,再继续本文操作。
为了通过公网访问,需要为 ECS 绑定弹性公网 IP,并在实例关联的安全组中添加相应的入方向规则。本示例使用以下规则:
| 用途 | 协议和端口 | 来源地址 |
|---|---|---|
| SSH 管理 | TCP 22 | 自己当前的公网 IP,使用 /32 掩码 |
| 网站访问 | TCP 80 | 0.0.0.0/0 |
网站端口可以按公开访问的需要放通,SSH 则应限制来源。配置完成后,再继续后面的部署步骤。
后续命令均在登录 ECS 后的 Linux 终端执行。
二、把页面和配置放在主机上
先创建项目目录:
mkdir -p ~/cloud-web/html ~/cloud-web/conf.d
cd ~/cloud-web
创建一个简单的首页:
cat > html/index.html <<'EOF'
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>华为云 ECS 部署实践</title>
</head>
<body>
<h1>Hello, Huawei Cloud!</h1>
<p>这是一个通过 Docker 和 Nginx 发布的静态页面。</p>
</body>
</html>
EOF
接着创建 conf.d/default.conf:
cat > conf.d/default.conf <<'EOF'
server {
listen 80;
server_name _;
charset utf-8;
root /usr/share/nginx/html;
index index.html;
access_log /dev/stdout;
error_log /dev/stderr warn;
location / {
try_files $uri $uri/ =404;
}
location = /healthz {
default_type text/plain;
return 200 "ok\n";
}
}
EOF
这里有两个值得理解的配置点。
root 指定页面目录,try_files 则根据请求路径查找文件或目录,找不到时返回 404。这样可以明确处理不存在的资源。
/healthz 是本文专门设计的验证接口,固定返回 ok。它用于确认 Nginx 可以接收请求并执行对应配置;以后接入后端服务时,还需要单独验证后端的可用性。
三、启动 Nginx 容器
在 ~/cloud-web 目录下执行:
sudo docker run -d \
--name cloud-web \
--restart unless-stopped \
-p 80:80 \
--mount "type=bind,src=$PWD/html,dst=/usr/share/nginx/html,readonly" \
--mount "type=bind,src=$PWD/conf.d,dst=/etc/nginx/conf.d,readonly" \
nginx:stable
本文选用 Nginx 官方镜像的 stable 标签,通过挂载目录提供静态内容和自定义配置。
这条命令中的关键参数如下:
| 参数 | 作用 |
|---|---|
-d |
让容器在后台运行 |
--name cloud-web |
指定容器名称,方便后续管理 |
--restart unless-stopped |
设置自动重启策略,手动停止的容器不属于自动恢复的情况 |
-p 80:80 |
将主机的 80 端口映射到容器的 80 端口 |
--mount |
把主机目录绑定挂载到容器中 |
readonly |
限制容器对挂载目录的写入 |
两个绑定挂载分别提供页面和配置。文件保存在 ECS 上,后续可以直接在项目目录中维护。
四、分别验证主机访问和公网访问
先在 ECS 上执行:
# 查看容器状态
sudo docker ps --filter name=cloud-web
# 检查 Nginx 配置
sudo docker exec cloud-web nginx -t
# 验证健康接口和首页
curl -i http://127.0.0.1/healthz
curl -i http://127.0.0.1/
配置正确时,健康接口应返回 HTTP 200,响应内容为 ok;首页请求应返回刚才创建的 HTML。
随后,在自己电脑的浏览器中访问:
http://你的ECS弹性公网IP/
这两次验证应当分开做。主机上的请求用于检查本机服务链路,公网请求还需要经过弹性公网 IP 和安全组等网络配置。建议先确认本机访问正常,再检查公网访问。
五、访问失败时,沿着请求链路排查
遇到问题,可以按“容器状态 → Nginx 配置 → 本机请求 → 公网请求”的顺序检查:
# 包括已经退出的容器
sudo docker ps -a --filter name=cloud-web
# 查看最近 50 行日志
sudo docker logs --tail 50 cloud-web
# 持续跟踪日志,按 Ctrl+C 结束跟踪
sudo docker logs -f cloud-web
结合本文的配置,可以这样缩小检查范围:
| 现象 | 优先检查 |
|---|---|
| 容器启动后退出 | 容器日志、Nginx 配置语法 |
| 首页返回 404 | html/index.html 是否存在、挂载路径是否正确 |
| 健康接口正常,首页异常 | 页面文件及文件访问权限 |
| 本机访问正常,公网访问超时 | 弹性公网 IP、安全组、主机网络规则 |
这些是针对本示例的排查顺序。尤其是公网访问失败时,应核对实例关联的安全组和实例内部网络规则。
另一个容易忽略的细节是,Docker 发布端口与 UFW 等防火墙工具存在交互限制,不能仅凭 UFW 的显示结果判断容器端口是否暴露。
六、配置修改后,先检查再加载
后续修改 Nginx 配置,可以执行:
sudo docker exec cloud-web nginx -t &&
sudo docker exec cloud-web nginx -s reload
这里使用 &&,让配置检查通过后才执行重新加载。Nginx 支持通过 reload 加载新配置,并让旧工作进程逐步完成正在处理的请求。
七、后续可以做什么
本文示例可以作为后续练习的起点:为站点配置域名和 HTTPS,把页面文件纳入版本管理,再尝试自动化发布。
每增加一个环节,都保留本机请求、公网请求和日志这三个验证入口,部署过程就会更容易检查和维护。
- 点赞
- 收藏
- 关注作者
评论(0)