[Windows] http://127.0.0.1:18005/ 通过 WSL SSH 隧道到达 ECS
外观
外观
约 3209 字大约 11 分钟
LNMPWordPressNginxPHP-FPM
2026-07-30
[Windows PowerShell] wsl ~:打开本机默认的 WSL2 Ubuntu;出现 用户名@主机名:~$ 后再执行标为 [WSL] 的命令。[WSL] ssh root@你的ECS公网IP:从 WSL 连接自己的 ECS;如果登录用户不是 root,请换成控制台显示的实际用户,看到远端提示符后再执行标为 [ECS] 的命令。第四次课备份的是一组静态文件。静态页面只要 Nginx 找到文件就能返回;WordPress 还要执行 PHP、读取数据库,任何一环断开都可能让浏览器只看到空白页或 502。
本课把“云端课程学习站”升级为 WordPress 版,并留下三类证据:
安全边界
数据库只在 Compose 内部网络中提供服务,不映射宿主机 3306 端口。实验 Web 端口默认绑定 ECS 的 127.0.0.1,并通过 SSH 隧道访问;不要为了方便把数据库或管理页面直接暴露到公网。
LNMP(Linux、Nginx、MariaDB/MySQL 与 PHP 的组合,用于运行动态 Web 应用) 中各组件承担不同职责:
.php 请求交给 PHP-FPM。一次首页请求大致经过:
浏览器
-> SSH 隧道或安全组允许的 HTTP 路径
-> Nginx :80
-> PHP-FPM :9000
-> MariaDB :3306
-> PHP 生成 HTML
-> Nginx 返回响应这里的 9000 和 3306 是容器网络内部端口。学生从浏览器访问的只有 Web 入口,不需要、也不应该直接连接它们。
关键提醒
502 通常表示 Nginx 已经收到请求,却没能从上游得到有效响应。排查应转向 PHP-FPM 地址、端口、状态和日志,而不是先重装全部组件。
观看时留意:一次动态页面请求经过 Nginx、PHP 和 MySQL 时,每个组件做了什么?
与本课的关系:视频帮助建立组件分工。课程实训使用隔离容器,不照搬传统主机安装步骤。
LNMP 既可以直接装在 Ubuntu 系统里,也能用容器拆开。本课选择 Docker Compose,倒不是因为“容器更高级”,而是出于实训环境考虑:
在学生个人的 ECS 上,这也是推荐做法。即使运行在容器里,Nginx、PHP-FPM 和 MariaDB 的实际服务、端口占用、日志排查与数据持久化逻辑依然完全一致。
动手前,先在 ECS 跑一轮只读检查:
free -h:看 available 剩余内存,确认够不够跑数据库和 PHP;df -hT /:确认磁盘空间,防止拉取镜像或写入日志时爆满;docker ps:核对已有容器,别误停了其他服务;ss -lnt 'sport = :18005':确认课程 Web 入口端口没被占用。[ECS] free -h
[ECS] df -hT /
[ECS] docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}'
[ECS] ss -lnt 'sport = :18005'如果最后一条命令没有任何输出,说明 18005 端口此时是干净的。
实训包准备好了 compose.yaml 和 nginx-wordpress.conf。先在 ECS 创建工作目录:
[ECS] mkdir -p ~/cloud-course/lab-05
[ECS] cd ~/cloud-course/lab-05上传 starter 文件后,复制一份配置文件:
[ECS] cp .env.example .env
[ECS] chmod 600 .env
[ECS] nano .env.env 负责保存本次实验的随机密码,属于敏感凭据。不要上传到平台,也不要提交到 Git 仓库。.env.example 只留变量名和占位符,用来说明需要准备哪些配置项。
接着让 Compose 展开变量并检查结构:
[ECS] docker compose config --quiet命令静默退出且返回码为 0,说明 Compose 格式合法。至于镜像能否下载、数据库能否正常初始化,还需要下一步启动验证。
三个服务之间的关系如下:
web(Nginx)
-> 读取 wordpress-data 中的静态文件
-> 把 PHP 请求发给 php:9000
php(WordPress PHP-FPM)
-> 读取和执行 wordpress-data 中的 PHP 文件
-> 使用服务名 db 访问数据库
db(MariaDB)
-> 把数据写入 db-data
-> 不映射宿主机端口wordpress-data 让 Nginx 与 PHP 看到同一套应用文件;db-data 让数据库容器被重新创建后仍能读取实验数据。数据卷不是备份,误删和卷损坏仍然需要独立恢复材料。
观看时留意:Nginx 收到 PHP 请求后,为什么还要把请求交给 PHP 运行环境?
与本课的关系:视频采用主机安装方式。本课只借用请求转交关系,配置和端口以 Compose 项目为准。
在 ECS 启动服务:
[ECS] docker compose up -d-d 让容器在后台运行。第一次启动会拉取镜像并初始化数据,耗时取决于网络和磁盘。
随后查看服务状态:
[ECS] docker compose ps重点核对:
db 是否变为 healthy(健康状态);php 是否保持运行;web 是否绑定 127.0.0.1:18005->80/tcp;再用容器网络和宿主机端口两种视角检查:
[ECS] docker compose exec web getent hosts php db
[ECS] ss -lnt 'sport = :18005'
[ECS] curl -I http://127.0.0.1:18005/getent 能证明 php、db 两个服务名可以在 Compose 网络中解析;ss 证明宿主机回环地址正在监听;curl 出现 200 或跳转到安装页面,才说明 HTTP 请求走通。
云主机 B 隔离 Compose 项目 · 2026-07-28 真实运行
root@SYG680400:/opt/xpk-course-demos/lesson-05$ docker compose psSERVICE IMAGE STATUS PORTSdb mariadb:11.4 Up (healthy) 3306/tcpphp wordpress:php8.3-fpm-alpine Up 9000/tcpweb nginx:1.27-alpine Up (healthy) 127.0.0.1:18005->80/tcp这条命令读取运行状态。应关注服务名称、健康状态、就绪数量和端口映射,不要只凭命令返回了表格就判断业务正常。
这一步是“MariaDB、WordPress PHP-FPM、Nginx 的运行状态、内部端口、回环入口和 HTTP 302”证据链中的一环。
只证明捕获时刻的隔离演示项目,不证明学生环境相同,也不展示容器内部地址

整页截图与上方分步卡片来自同一条记录;敏感字段已经遮盖,较长命令可能经过换行排版。
从浏览器响应出发,把 Nginx、PHP-FPM 和 MariaDB 的证据放回同一条请求链。
[Windows] http://127.0.0.1:18005/ 通过 WSL SSH 隧道到达 ECS
因为远端 Web 端口只绑定 127.0.0.1,Windows 浏览器不能直接访问。需要在 WSL 建立本地端口转发:
[WSL] ssh -N -L 18005:127.0.0.1:18005 你的ECS登录目标这条命令保持运行时,浏览器访问:
http://127.0.0.1:18005/连接关系是:
Windows 浏览器 :18005
-> WSL SSH 客户端
-> ECS SSH 服务 :22
-> ECS 127.0.0.1:18005
-> Nginx 容器 :80隧道复用了已有 SSH 入口,没有新增公网端口。终止这条 SSH 命令只会关闭转发,不会停止远端 WordPress。

安装页面中的站点标题可填“云端课程学习站”。管理员密码使用密码管理器生成,不能使用数据库密码,也不能出现在报告截图中。若只做链路验收,可以停在安装页面,不必创建正式管理员账号。
下面三条命令分别回答不同问题:
docker compose logs web:Nginx 是否收到请求、是否连接上 PHP。docker compose logs php:PHP-FPM 是否启动,以及执行请求时是否报错。docker compose logs db:数据库初始化、登录和存储是否出现问题。[ECS] docker compose logs --tail 40 web
[ECS] docker compose logs --tail 40 php
[ECS] docker compose logs --tail 40 db日志只截取与本次请求时间相近的必要行。数据库日志中的账号、客户端地址和其他业务信息应脱敏。
常见现象可以这样判断:
浏览器显示 502 或 504
Nginx 已接收请求,但 fastcgi_pass php:9000 对应的 PHP-FPM 不可达或响应超时。先检查 php 容器状态、服务名解析和 Web 日志。连接被拒绝常见 502,等待上游超时则可能返回 504,具体原因以日志为准。
页面显示 Error establishing a database connection
PHP 已经执行到数据库连接阶段。先核对 db 是否健康、数据库名与用户名是否一致,以及两个服务是否在同一 Compose 网络。
页面空白或 500
请求可能已经进入 PHP。保留 HTTP 状态,查看 PHP 日志和 WordPress 配置,不要用反复刷新代替取证。
这次故障演练只在自己的课程项目中进行。先保存正常响应:
[ECS] curl -sS -o /dev/null -w 'before=%{http_code}\n' http://127.0.0.1:18005/这条命令组合了四个 curl 参数:-s 隐藏进度条,-S 在静默时仍显示错误,-o /dev/null 丢弃响应正文(只需要状态码),-w '…' 按自定义格式输出——%{http_code} 展开为 HTTP 状态码。后面故障演练中反复使用同一组参数来对比状态码变化。
停止 PHP 服务:
[ECS] docker compose stop php再次请求并查看 Nginx 日志:
[ECS] curl -sS -o /dev/null -w 'during=%{http_code}\n' http://127.0.0.1:18005/
[ECS] docker compose logs --tail 12 web预期出现 502 或 504,并在 Web 日志中看到连接上游失败或超时。恢复 PHP 后再验证:
[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/恢复后的状态码应回到安装页或首页对应的成功/跳转结果。
云主机 B 隔离 Compose 项目 · 2026-07-28 真实故障演练
...$ curl -sS -o /dev/null -w 'before=%{http_code}' http://127.0.0.1:18005/before=302这条命令沿实际访问路径发起请求。状态码、响应头或正文是本步的判断依据;只看到一次响应,还不能说明服务长期稳定。
这一步是“停止 PHP-FPM 后出现 504、Nginx 上游超时日志以及服务恢复后的 HTTP 302”证据链中的一环。
只说明本次 FastCGI 上游超时;其他 502 或 504 仍需结合日志判断

整页截图与上方分步卡片来自同一条记录;敏感字段已经遮盖,较长命令可能经过换行排版。
输入脱敏后的 Compose 状态、HTTP 状态或日志,让助教按 Nginx、PHP-FPM、数据库三层检查证据。
本实验的原始聊天仅保存在当前标签页,不会写入全局课程助教上下文。
WordPress 的恢复材料至少分三类:
compose.yaml、Nginx 配置和 .env.example:描述怎样重建服务,不含真实密码。wordpress-data。查看数据卷:
[ECS] docker volume ls --filter label=com.docker.compose.project=cloud-course-lab-05它能证明卷存在,不能证明其中数据完整。第七次课会使用导出、删除测试库、恢复和数据条数比较来验证数据库备份。
停止服务但保留数据:
[ECS] docker compose down普通 down 不删除命名卷。只有确认不再需要实验数据、完成备份并通过验收后,才考虑带 --volumes 的清理;本课默认不执行。
完整步骤见实训 05:隔离部署 LNMP 与 WordPress,其中可以下载 compose.yaml、nginx-wordpress.conf 和 .env.example。
保底任务
docker compose config --quiet;ps、curl 和日志材料判断请求停在哪一层;标准任务
挑战任务
提交文件名:
班级_学号_姓名_第05次课_LNMP与WordPress部署报告.docx报告每张截图都写清运行位置、关键输出和结论。只上传一个 .docx 到智慧职教“第05次课”作业收集,不上传 .env、数据库文件、服务器地址或管理账号。
检查请求链、端口边界、故障证据、数据保护和作业规范。
小测关注组件职责、端口边界、502 判断、日志和持久化:
完成后可立即查看反馈和解析。
docker compose ps、curl 和分服务日志共同构成证据链。下一次课会把三项服务的依赖关系写成更规范的 Compose 项目,并观察一个服务失败时其余服务如何表现。
以下资料在 2026-07-28 核对:
助教会读取当前课程页面和结构化学习记录,但不会读取正文实验框里的原始聊天。