云VPS部署moodle-docker时8000端口访问被拒绝问题排查
Moodle-docker VPS部署8000端口连接拒绝排查方案
问题现状
- 基于moodle-docker在云VPS部署Moodle服务,已完成域名解析到VPS公网IP,本地已拉取Moodle官方代码
- 配置的启动环境变量如下:
export MOODLE_DOCKER_WWWROOT=~/Sources/moodle && export MOODLE_DOCKER_DB=mysql && export MOODLE_DOCKER_WEB_HOST=my-domain.my.id && export MOODLE_DOCKER_WEB_PORT=8000
- 服务启动后访问
my-domain.my.id:8000返回Connection refused,VPS内部curl访问同地址同端口报错一致,报错信息如下:
* Trying 103.170.85.180:8000... * TCP_NODELAY set * connect to 103.170.85.180 port 8000 failed: Connection refused * Failed to connect to my-domain.my.id port 8000: Connection refused * Closing connection 0 curl: (7) Failed to connect to my-domain.my.id port 8000: Connection refused
- 同VPS上部署在8085端口的自定义Web服务可正常访问,公网连通性、基础防火墙规则无全局性故障,8085端口curl测试可正常返回200响应。
排查步骤与修复方案
连接拒绝的核心原因是目标端口无进程正常监听,或服务仅绑定本地回环地址,按以下顺序排查即可定位问题:
- 检查容器端口绑定规则
执行docker ps查看moodle-docker web服务容器的端口映射:- 如果PORTS列显示为
127.0.0.1:8000->80/tcp,说明服务仅绑定本地回环地址,所有走公网IP的请求(包括本机访问公网域名的请求)都会被拒绝。添加环境变量export MOODLE_DOCKER_BIND_ADDRESS=0.0.0.0后重启容器即可修复。 - 如果PORTS列没有8000端口的映射记录,说明容器端口配置未生效,重新加载环境变量后重启moodle-docker服务。
- 如果PORTS列显示为
- 确认容器运行状态
执行docker compose ps(旧版本Docker使用docker-compose ps)查看所有关联容器的状态:- 如果web容器、数据库容器状态为
Exited或Restarting,说明服务未正常启动,自然不会监听端口。执行docker compose logs webserver查看web容器启动日志,常见故障点包括:- 配置的
MOODLE_DOCKER_WWWROOT路径不存在:~/Sources/moodle是相对当前用户的路径,如果用sudo执行启动命令,~会指向root用户家目录,和普通用户家目录路径不一致,建议替换为绝对路径,例如/home/你的用户名/Sources/moodle - 代码目录权限不足,容器内Web服务无法读取Moodle文件
- 数据库容器启动失败,触发web容器循环重启
- 配置的
- 如果web容器、数据库容器状态为
- 验证端口实际监听状态
执行ss -tulpn | grep 8000查看8000端口的监听情况:- 无任何输出:确认无进程监听该端口,回到上一步排查容器启动故障
- 监听地址为
127.0.0.1:8000:回到第一步修改绑定地址为0.0.0.0 - 监听地址为
0.0.0.0:8000且进程为docker-proxy:依次执行curl http://127.0.0.1:8000、curl http://VPS内网IP:8000、curl http://VPS公网IP:8000,逐跳定位拦截点。
- 补充规则检查
本地127.0.0.1访问8000端口正常后,再检查两项配置:- 云服务商安全组入站规则是否放行8000端口的TCP请求
- 系统防火墙(ufw/iptables)是否放行8000端口入站流量
内容的提问来源于stack exchange,提问作者rixpl
相关产品推荐
相关产品推荐

