由于某种原因,当从远程主机访问 Web 服务器时,PHPStorm 不会收到调试连接。PHPStorm 的行为就像它根本没有在监听一样。如果我从同一主机访问 Web 服务器,则调试连接会被接受,并且它会在第一行中断,这是预期的行为。
我当前的设置:
主机:Windows 10 PRO,Chrome 浏览器,防火墙已禁用(为了测试)
客机:Ubuntu 18.04 安装在主机上的 Hyper-v VM 上
我在客户机中安装了 Docker,它正在运行以下容器:
- php-fpm 7.2.16
- apache-httpd 2.4
PHP-FPM 配置为使用端口 9000,而 XDEBUG 配置为使用端口 9009。
PHP配置:
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_connect_back = 1
xdebug.remote_port = 9009
Apache fcgi 配置:
<IfModule proxy_fcgi_module>
<Proxy "fcgi://${PHP_SERVER_NAME}:${PHP_SERVER_FCGI_PORT}" enablereuse=on max=10>
</Proxy>
<FilesMatch "\.php$">
SetHandler "proxy:fcgi://${PHP_SERVER_NAME}:${PHP_SERVER_FCGI_PORT}"
</FilesMatch>
PHPStorm 安装在 Ubuntu 客户机上。
总结一下:
当在客户机上从 Chrome/Firefox 访问网站时,PHPStorm 接收连接并按预期中断。
当从主机执行完全相同的操作时,网站无需 PHPStorm 接受连接即可呈现。
所以我的问题是,什么原因导致从主机访问时无法创建调试连接?
答案1
替换xdebug.remote_connect_back
似乎xdebug.remote_host
可以解决问题。
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_host = IP_OF_HOST_RUNNING_PHPSTORM
xdebug.remote_port = 9009
据我了解,remote_connect_back 不起作用的原因如下:
如果启用,则 xdebug.remote_host 设置将被忽略,Xdebug 将尝试连接到发出 HTTP 请求的客户端。它会检查 $_SERVER['HTTP_X_FORWARDED_FOR'] 和 $_SERVER['REMOTE_ADDR'] 变量以找出要使用的 IP 地址。
如果配置了 xdebug.remote_addr_header,那么将在 $_SERVER['HTTP_X_FORWARDED_FOR'] 和 $_SERVER['REMOTE_ADDR'] 变量之前检查具有配置名称的 $SERVER 变量。
因此,xdebug.remote_connect_back
调试器会将调试连接发送到请求者的 IP,在本例中是主机 (HOST) 而不是客户机 (GUEST)。