---
url: /courses/cloud-platform-build-management/lab-05/index.md
---
# 实训 05：部署并排查隔离 LNMP

标准路径在个人 ECS 上完成；资源暂不可用时，只完成保底材料分析，不把给定输出冒充个人运行结果。

## 一、完成目标

* 启动 Nginx、WordPress PHP-FPM、MariaDB 三项服务；
* Web 入口只绑定远端回环地址，数据库不映射宿主机端口；
* 通过 SSH 隧道打开 WordPress 页面；
* 停止并恢复 PHP，保留 502/504、日志和回归证据；
* 完成 Word 报告并上传智慧职教。

## 二、安全边界

* 只在 `~/cloud-course/lab-05` 操作。
* 项目名保持 `cloud-course-lab-05`，不要停止其他 Compose 项目。
* 不开放公网 3306，不提交 `.env`。
* 不使用现有业务端口；18005 被占用时先取证，再改成教师指定的课程端口。
* 默认使用 `docker compose down` 停止服务，不使用 `--volumes` 删除数据。

## 三、准备 starter

把 `starter/` 中的 `compose.yaml`、`nginx-wordpress.conf` 和 `.env.example` 传到 ECS：

```bash
[ECS] mkdir -p ~/cloud-course/lab-05
[ECS] cd ~/cloud-course/lab-05
[ECS] cp .env.example .env
[ECS] chmod 600 .env
```

编辑 `.env`，为两个数据库密码填写不同的随机值。截图不得包含密码行。

## 四、任务 1：环境预检

运行：

```bash
[ECS] free -h
[ECS] df -hT /
[ECS] docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'
[ECS] ss -lnt 'sport = :18005'
```

检查点：

* 可用内存建议不少于 700 MiB；
* 根文件系统不能处于容量告警状态；
* 能指出哪些容器不属于本课；
* 18005 当前没有监听。

截图 1：资源、已有容器和端口预检，并写明“未停止其他项目”。

## 五、任务 2：检查并启动

```bash
[ECS] docker compose config --quiet
[ECS] docker compose up -d
[ECS] docker compose ps
```

如果数据库仍显示 `health: starting`，等待十秒后只重跑 `docker compose ps`，不要反复执行 `up`。

检查点：

* `db` 最终为 healthy；
* `php` 保持运行；
* `web` 的端口是 `127.0.0.1:18005->80/tcp`。

截图 2：三项服务和端口状态。

## 六、任务 3：验证服务链

```bash
[ECS] docker compose exec web getent hosts php db
[ECS] ss -lnt 'sport = :18005'
[ECS] curl -I http://127.0.0.1:18005/
```

记录：

* `php` 和 `db` 是否可以通过服务名解析；
* HTTP 状态是 200 还是跳转；
* 三条证据分别证明什么。

截图 3：服务名、端口和 HTTP 结果。

## 七、任务 4：从浏览器访问

在 WSL 保持以下命令运行：

```bash
[WSL] ssh -N -L 18005:127.0.0.1:18005 你的ECS登录目标
```

Windows 浏览器打开 `http://127.0.0.1:18005/`。不要在 Word 中填写管理员密码。

截图 4：WordPress 安装页或首页。地址栏不得出现公网地址。

## 八、任务 5：PHP 故障闭环

保存正常状态：

```bash
[ECS] curl -sS -o /dev/null -w 'before=%{http_code}\n' http://127.0.0.1:18005/
```

只停止本项目的 PHP：

```bash
[ECS] docker compose stop php
```

请求并取日志：

```bash
[ECS] curl -sS -o /dev/null -w 'during=%{http_code}\n' http://127.0.0.1:18005/
[ECS] docker compose logs --tail 12 web
```

恢复并验证：

```bash
[ECS] docker compose start php
[ECS] docker compose ps
[ECS] curl -sS -o /dev/null -w 'after=%{http_code}\n' http://127.0.0.1:18005/
```

截图 5：停止 PHP 后的 502/504 与 Nginx 日志。\
截图 6：PHP 恢复后的状态和 HTTP 结果。

故障记录必须包含：

```txt
现象：
请求到达了哪一层：
关键日志：
原因：
恢复操作：
回归验证：
```

## 九、任务 6：识别持久化对象

```bash
[ECS] docker volume ls --filter label=com.docker.compose.project=cloud-course-lab-05
```

写出：

* 哪个卷保存 WordPress 文件；
* 哪个卷保存数据库；
* 为什么“卷存在”还不能等同于“已经备份”。

## 十、验收与清理

在实训目录运行：

```bash
[ECS] bash verify.sh
```

教师验收后停止服务：

```bash
[ECS] docker compose down
```

再次确认没有课程端口：

```bash
[ECS] ss -lnt 'sport = :18005'
```

最终上传：

```txt
班级_学号_姓名_第05次课_LNMP与WordPress部署报告.docx
```

只提交 Word，不提交 `.env`、密码、数据卷导出或服务器地址。
