nginx-phpm-fpm-xdebug-netbeans只能启动一个调试会话


nginx php-fpm xdebug netbeans can start only one debug session

过去,我曾使用apache+mod_php+xdebug+netbeans开发我的网站(服务器是我的本地机器,运行Debian Squeeze),很高兴xdebug工作如常,调试会话可以在我需要的时候随时启动和停止。但是,当我转到nginx+php_fpm+xdebug+netbeans时,我遇到了一些调试问题。

  1. 我的调试会话可能会非常长(远远超过30秒),而且nginx似乎不能等待这么长时间,它显示"504网关超时错误"。我已经尝试了很多解决这个问题的建议,但没有成功。不过,这对我来说并不是很重要,因为调试会话本身仍在继续运行,这只是一件有点不舒服的事情
  2. 我的调试会话只能运行一次,所以,如果我停止它,并尝试再次启动调试,netbeans就无法接受来自xdebug的连接(它写着"等待xdebug连接",而且是永远的)。重新启动netbeans后,调试会话可以再次正常启动
  3. 在我无法理解的情况下,调试是"为所有php脚本打开",并阻止任何其他脚本运行。例如,我在我的网站上启动调试会话http://mysite.local/index.php一段时间后,我注意到我的管理员(位于intranet.local/adminer.php上)没有运行,浏览器试图加载页面一段时间,然后显示"504网关超时错误"。如果我看到这种行为,我可以停止netbeans中的xdebug调试会话,并且所有其他脚本开始正常运行

现在,当我写这个问题的时候,我做了一些调查,发现如果我开始调试会话几秒钟,之后停止它,然后重新开始——它会正常启动。问题似乎是在经过一段时间的主动调试后出现的。

我的系统和应用程序:Debian挤压:2.6.32-5-686Nginx:1.4.1(来自dotdeb存储库)php5-fpm:5.3.26-1~d(来自dotdeb存储库)php5-xdebug:5.3.26-1~d(来自dotdeb存储库)netbeans:7.3

我的配置:

  1. nginx基本配置:https://gist.github.com/MihanEntalpo/6229801
  2. nginx网站配置文件:https://gist.github.com/MihanEntalpo/6229781
  3. fastcgi_params文件:https://gist.github.com/MihanEntalpo/d93fd4105573e1eda56f
  4. php-fpm池配置文件:https://gist.github.com/MihanEntalpo/6229820
  5. php fpm xdebug配置文件:https://gist.github.com/MihanEntalpo/6229836
  6. netbeans:选项,这与apache服务器相同:
    • 第一行中断=OFF
    • 弹出窗口中的评估=打开
    • 显示请求URL=ON
    • 端口=9000

在nginx的错误日志文件中记录,当它无法等待脚本被调试时,或者其他脚本被问题#3锁定时,前面提到:

2013/08/14 14:40:16[error]4822#0:*111上游超时(110:连接超时),从上游读取响应标头,客户端:192.168.100.1,服务器:intranet.local,请求:"GET/adminer.php?username=root&db=devel&table=user HTTP/1.1",上游:"fastcgi://127.0.0.1:9999,主机:"intranet.local",引用者:https://intranet.local/adminer.php?username=root&db=devel"

php-fpm的日志不包含任何错误消息。。。

我不喜欢用我的问题打扰任何人,总是试图自己解决。但在这种情况下,我和这些人斗争了几个月,运气不好。。。如果有人遇到这个问题,或者有与nginx+php-fpm+xdebug+netbeans一起使用的工作配置,请帮助我:)

感谢所有试图朝着我的问题的方向思考的人。我已经成功地解决了它。

  1. 第一个问题(504错误)可以通过nginx选项fastcgi_read_timeout来解决,例如,它可以是fastcgi_read_timeout 600;来告诉nginx它应该等待600秒。它应该放在主机的配置文件中,或者放在/etc/nginx/fastcgi_params(Debian中)中
  2. 第二个问题是由我的xdebug.conf中的选项xdebug.remote_autostart=1;引起的,它应该是xdebug.remote_autostart=0;。我不理解这个选项的真正含义,但它可以做到以下几点:任何php脚本都会自动尝试连接到调试器(在我的例子中是netbeans)。因此,在某些情况下,netbeans丢失了一个连接,当我按下"开始调试"时,它不知道是否应该打开新的连接,并永远等待xdebug客户端。现在,有了上面提到的选项,我可以在需要的时候随时启动和停止调试
  3. 第三个问题与第二个问题的来源相同。在我的服务器上运行的所有其他脚本都试图连接到netbeans,但由于连接丢失,这是毫无意义的

不管怎样,我希望这能帮助到那些想解决类似问题的人。StackOverflow通过强迫我明确描述我的问题来帮助我,在这个过程中,我对尝试什么有了新的想法。

当更新fastcgi_read_timeout时,您可以增加服务器上所有站点的时间限制(在我的情况下是流浪家园VM),一旦您将SSH连接到VM中,您可以执行以下操作:

sudo pico /etc/nginx/nginx.conf

并添加

fastcgi_read_timeout 300;

到http部分。

对于每个有相同问题的人来说,接受的答案不起作用,在我的情况下,是最近安装的一个应用程序阻塞了xdebug。

我的公司可以远程访问在我的笔记本电脑上安装安全软件,所以他们安装了ESET Endpoint Security.appESET Remote Administrator Agent.app,这显然也过滤了本地主机连接。我花了两天时间才终于注意到有一个ESET守护进程在127.0.0.1:9000上运行并阻止连接。

解决方案是删除这两个应用程序,因为我没有必要的管理权限在应用程序设置中禁用过滤。