远程服务器Docker容器中PhpStorm搭配Xdebug 2.9.8无法调试的问题求助
从你的配置和Xdebug日志来看,核心问题是容器内的Xdebug始终无法成功连接到本地的调试客户端,下面是几个关键的排查和修复步骤:
1. 修正SSH反向隧道的绑定范围
你当前用的SSH命令存在一个关键问题:
ssh -i "rst-staging.pem" -R 9000:localhost:9000 ubuntu@ec2-35-153-28-164.compute-1.amazonaws.com
这个命令只会让EC2实例的localhost接口监听9000端口,但你的Docker容器是从EC2实例的Docker网桥地址(172.17.0.1)发起连接的,这个请求无法被localhost的监听端口接收。
你需要修改SSH命令,让EC2实例的所有接口都监听9000端口:
ssh -i "rst-staging.pem" -R 0.0.0.0:9000:localhost:9000 ubuntu@ec2-35-153-28-164.compute-1.amazonaws.com
另外要确保EC2实例的sshd_config中开启了GatewayPorts yes(默认是no),否则远程端口只能绑定到localhost:
sudo nano /etc/ssh/sshd_config # 找到GatewayPorts项,修改为GatewayPorts yes sudo systemctl restart sshd
2. 检查网络防火墙规则
- EC2安全组:添加一条入站规则,允许Docker子网(通常是
172.17.0.0/16)访问EC2实例的9000端口,协议选TCP。 - 本地防火墙:确认你的本地机器防火墙允许IDE(比如PHPStorm、VS Code)接收9000端口的外部连接,避免SSH隧道过来的请求被拦截。
3. 验证Xdebug的remote_host配置
虽然你用了172.17.0.1,但如果Docker使用了自定义网络而非默认网桥,这个地址可能不是EC2实例的正确网关。你可以在EC2实例上执行以下命令确认网桥网关:
docker network inspect bridge | grep Gateway
如果输出的网关不是172.17.0.1,需要同步修改Xdebug的xdebug.remote_host。另外,Bitnami的php-fpm镜像支持host.docker.internal作为宿主机地址,用这个值替代硬编码IP会更可靠。
4. 测试端口连通性
在Docker容器内部执行telnet命令,验证到EC2实例9000端口的网络是否通畅:
docker exec -it <你的容器ID> telnet 172.17.0.1 9000
如果连接失败,回到前面的安全组和SSH隧道配置排查;如果连接成功,再检查IDE的调试监听是否开启,idekey是否和xdebug.idekey=docker完全一致。
5. 查看Xdebug详细日志
如果还是无法解决,可以开启Xdebug的详细日志:
xdebug.remote_log_level=7
通过日志里的细节(比如超时原因、连接拒绝的具体提示)进一步定位问题。
内容的提问来源于stack exchange,提问作者richie

