Linux 服务已启动却访问失败:用 ss 和 curl 分层定位
Linux 服务已启动却访问失败:用 ss 和 curl 分层定位
进程存在,只能说明程序还在运行。浏览器能否访问服务,还取决于监听地址、端口、HTTP 响应和网络路径。排查时按“本机应用 → 监听接口 → 外部链路”的顺序收集证据,可以减少反复重启和盲目修改配置。
先建立一个可控的本机样例
下面的示例只监听回环地址,适合在自己电脑或服务器上练习。Python 3 已安装时,在终端执行:
mkdir -p /tmp/http-check-demo
printf 'service-ok\n' > /tmp/http-check-demo/index.html
python3 -m http.server 8000 --bind 127.0.0.1 --directory /tmp/http-check-demo
保持终端运行,另开一个终端检查。示例目录只放演示文件,避免将工作目录中的其他内容一起作为静态文件提供。
第一步:确认端口由谁监听
ss -lntp 'sport = :8000'
-l 查看监听套接字,-n 使用数字地址和端口,-t 只看 TCP,-p 显示进程信息。查看其他用户的进程详情可能需要额外权限,但监听地址仍然是首要证据。
示例应出现 127.0.0.1:8000。这意味着只有本机可以连接;外部访问失败符合当前配置。若显示 0.0.0.0:8000,表示监听全部 IPv4 接口;[::]:8000 涉及 IPv6,是否同时接收 IPv4 还要结合系统和应用设置判断。没有记录时,应先核对实际端口、启动参数与应用日志。
第二步:验证应用是否返回 HTTP 响应
curl --noproxy '*' --connect-timeout 3 --max-time 5 -i http://127.0.0.1:8000/
这里使用 GET 请求,同时展示响应头和正文。预期结果是状态码 200,正文含 service-ok。--noproxy '*' 避免环境中的代理配置干扰本机验证;两个超时参数让连接失败或响应挂起尽快显现。
如果返回 404,至少说明已连接到某个 HTTP 服务,应继续检查路径和服务目录。Connection refused 通常表示连接遭拒,应检查监听进程、地址和端口;超时则需要继续区分路由、过滤规则以及应用是否迟迟未响应。
第三步:本机通过后再检查外部链路
实际部署时,先确认服务确实计划对外提供访问,再核对监听接口、主机防火墙、云安全组、负载均衡和域名解析。优先从另一台机器访问明确的地址和端口,减少域名、HTTPS 和反向代理同时介入带来的变量。只调整与目标服务相关的访问规则。
若直连正常而域名访问异常,再核对解析结果、代理转发目标和证书配置。HTTP 状态码反映应用层结果,TCP 能连通并不保证业务请求成功。
留下一条可复核的排查记录
记录检查时间、目标地址、监听结果、请求命令和响应状态,比“重启后好了”更便于复盘。测试结束后,在运行 Python 服务的终端按 Ctrl+C 停止它。上述输出均为样例的预期结果;在真实环境中,应以实际命令输出为依据。
- 点赞
- 收藏
- 关注作者
评论(0)