PHP 快速 cgi (与 NGINX 结合使用) 暂停时冻结

PHP 快速 cgi (与 NGINX 结合使用) 暂停时冻结

我为 Web 开发设置了一个非常小的本地网络。Web 服务器是一堆

  • MySql 5.1.37
  • NGINX 0.8.19
  • PHP 5.2.10 带有 Suhosin-Patch 0.9.7 和 Xdebug v2.0.4

服务器本身运行 ubuntu karmic 9.10。

为了向 NGINX 提供 PHP,我使用以下命令:

sudo /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid 

我的问题是,每天早上,当机器从挂起状态恢复时,PHP 已停止工作(在浏览器中,NGINX 在尝试加载请求的页面几秒钟后显示“网关错误”消息)。如果我尝试重新启动命令以重生 PHP,它会给我一个错误,说该地址已被使用。

编辑:更多信息

生成后,如果我运行,ps ax | grep php就会得到一个php-cgi正在运行的进程,而如果我从挂起状态恢复后重新发出命令,则不会得到任何结果,尽管如果我尝试重新生成,地址仍然会显示“正在使用”。我脑海中闪过的想法是,php-cgi 会向其他进程注册其存在,而这些进程不会检测到因挂起而突然死亡的 php-cgi,从而使地址保持繁忙状态。可能吗?!

有办法解决这个问题吗?我们欢迎使用优雅的解决方案,但即使是一个肮脏的解决方法,也可以让服务器在没有人为干预的情况下自行恢复。这只是几个人使用的内部生产服务器。

提前感谢您的时间!

答案1

也许你可以切换到php-fpm来自 spawn-fcgi?

答案2

Karmic 仍然使用 pm-utils,对吗?您需要一个脚本,在/etc/pm/sleep.d服务器暂停时停止服务器,并在恢复时重新启动服务器。

示例脚本可能如下所示(根据需要调整暂停/恢复选项,但这应该会为您提供正确的脚本结构)。如果您已经编写了/etc/init.d/foo在启动时启动服务器的脚本,则您可能希望使用该脚本来停止/启动下面的服务器。

#!/bin/sh
#
# /etc/pm/sleep.d/10spawnfcgi

case "$1" in

   hibernate|suspend)
      # example -- replace this with what works on your system
      killall spawn-fcgi
      # or better yet:
      # /etc/init.d/myFcgiServer stop
      ;;
   thaw|resume)
      # restart -- tweak to your liking, rerun your startup script, etc
      /usr/bin/spawn-fcgi -a 127.0.0.1 other-options-here
      # or better yet:
      # /etc/init.d/myFcgiServer start
      ;;

   *) exit $NA
      ;;
esac

答案3

好的,经过几天的测试,我可以确认该问题可以通过定期升级自行解决。

如果您遇到同样的问题,如果您能够找出需要终止哪些进程才能“重置” fcgi 服务器,那么 ~quack 提供的解决方案似乎是合理的。

问题出现的软件版本不是不再显示:

  • 核心:2.6.31-15-通用
  • PHP的:5.2.10-2ubuntu6.3 带有 Suhosin-Patch 0.9.7 (cli)
  • Nginx的:0.8.19

相关内容