跳到主要内容

部署教程

VPS 端口访问不了怎么排查:监听、Docker 与云安全组

发布于 更新于

从本机请求开始,逐层检查服务监听、容器端口、系统防火墙与云安全组。

先在 VPS 上访问服务

浏览器连不上应用,先确认程序自己能回应。下面用 3000 端口举例,换成实际端口。

bash;使用前请核对本文前提。 如内容超出,可左右滑动,键盘使用方向键或 Home/End 查看。
仅复制文本,不会执行。
curl -I http://127.0.0.1:3000
sudo ss -lntp

本机也无法访问时,优先查看应用状态和日志;本机正常而公网失败,再检查监听地址与访问规则。只监听 127.0.0.1 的服务,不能直接通过公网 IP 访问。

Docker 里正常,不代表端口已发布

bash;使用前请核对本文前提。 如内容超出,可左右滑动,键盘使用方向键或 Home/End 查看。
仅复制文本,不会执行。
sudo docker compose ps
sudo docker compose logs --tail=100

Compose 的 ports 左边是宿主机端口,右边是容器端口。127.0.0.1:3000:8080 表示外部不能直接访问宿主机 3000,需经过本机代理或 SSH 转发。

没有 ports 的容器仍可能在同一 Docker 网络中被其他容器访问;需要哪种访问方式,就配置对应入口,不必把每个内部服务都发布到公网。

云安全组与系统规则分别检查

云安全组控制平台入口,系统防火墙控制服务器规则,两处都可能影响连接。只开放实际需要的端口和来源,已有 SSH 会话不要为了排查而关闭所有规则。

Docker 发布端口可能绕过 UFW 的部分常规处理。检查 Docker 的端口发布和对应转发规则,不能根据 ufw status 一项就判断应用是否公开。

域名失败时看 DNS 和代理

IP 可访问而域名失败时,先检查 A、AAAA 和 CDN 设置。IPv4 与 IPv6 的分别测试见下方步骤;不要只修正 A 记录就忽略旧 AAAA。

代理返回 502 时,应在代理所在环境访问上游,再核对地址和端口。

最后从自己的电脑重新连接

修改后同时检查本机请求、域名访问和服务日志。HTTP 服务用浏览器或 curl;其他协议用对应客户端测试。TCP 能连接,只说明连接已建立,应用认证和业务响应还需要继续确认。

连接拒绝与连接超时分别查

Connection refused 通常表示目标到达后没有对应监听,或规则主动拒绝。先检查程序是否运行、监听端口是否正确,再看请求是否打到另一台机器。

Connection timed out 可能是过滤或网络路径问题。从服务器本地访问服务,再从外部访问公网地址,逐层比较云安全组、系统防火墙与容器映射。

IPv4 正常,但域名仍打不开

bash;使用前请核对本文前提。 如内容超出,可左右滑动,键盘使用方向键或 Home/End 查看。
仅复制文本,不会执行。
curl -4 -I https://app.example.com
curl -6 -I https://app.example.com

示例域名换成自己的服务。若只有 IPv6 失败,检查 AAAA 是否指向当前实例、服务器是否有可用 IPv6、应用是否监听以及规则是否放行。

未部署 IPv6 时删除不适用的 AAAA;只修 IPv4 安全组不会让旧 IPv6 地址正常。

按代理所在位置选择上游地址

反向代理在宿主机上时,连接应用发布到宿主机的端口;代理与应用位于同一 Docker 网络时,使用应用服务名和容器端口。容器里的 localhost 指向该容器,不能当作宿主机地址。

应用只映射到 127.0.0.1 时,外部访问应走已配置的域名代理入口。这种情况下不需要为了消除直连失败,把内部服务改成全网监听。