【问题标题】:PHP freaking out (connection dropped, connection abandoned) in IIS 7.5IIS 7.5 中的 PHP 崩溃(连接断开,连接被放弃)
【发布时间】:2013-10-08 07:55:48
【问题描述】:

我在使用 IIS 和 PHP(加上一个 com dll)时遇到了一些问题。 COM dll 经常崩溃,但我认为问题不是因为这个(我禁用了快速故障保护),因为 dll 总是崩溃,而问题开始于大约三周前我们到达每天大约有 15.000 个用户。

突然所有.php文件停止响应,服务器只能提供静态.htm文件,这表明php(php-cgi.exe)有问题。

这几乎总是发生在高峰时段(下午 3 点到 4 点到 5 点),此时谷歌分析显示 180-220 个“在线用户”。当这种情况发生时(我的意思是 PHP 吓坏了)我可以在服务器的任务管理器中看到,而不是通常 10-12 个 php-cgi.exe 进程,它们飙升至 30 或 40 个 php-cgi.exe 进程(约 30 MB RAM each) ,我猜这是因为 php-cgi.exe 停止处理请求。服务器共有 8GB RAM。

错误日志包括 connection_abandoned_by_regqueueconnection_dropped,如果我不手动重新启动 IIS 或 defaultapppool,错误将大部分时间变成 defaultapppool 不可用 503

一个问题是,在事件查看器中,我从来没有收到来自 WAS 的消息,表明 defaultapppool 已禁用,因此我可以将任务(重新启动池)附加到它,并且在 IIS 管理控制台中,我从未看到 defaultapppool 为尽管它在日志中显示为已禁用,但已禁用。

我一直在玩超时,但似乎从来没有做对。

我目前的理论是:

1) PHP 被许多用户(Windows、IIS)吓坏了,无法处理

2) .dll 崩溃导致多人在线时出现问题

3) php+iis 兼容性在大批量时不是很好,尽管我不认为 15k/天的用户太多。不过我应该注意,大多数请求需要 50-300 毫秒才能完成。

php版本是通过WebPI安装的5.3.19,windows版本是windows 2008 R2 64bit。

由于某些奇怪的原因,notepad++ 显示放弃/禁用查询的查询字符串,在 httperr 日志中以不可复制的十六进制形式(查询字符串为 UTF8 - greek),而在普通日志中,查询字符串都是可见的并且可以复制。截图如下。

我还提供了第二张带有当前设置的屏幕截图

HTTPERR 日志文件...错误从连接断开开始,然后稍后连接被放弃 http://img32.imageshack.us/img32/3796/9nkv.jpg

在第二个屏幕截图中是我当前的设置:1)启用 php 扩展,2)defaultapppool(网站运行的池)设置 3)php fastcgi 设置和 4)php 运行时限制。 http://img34.imageshack.us/img34/2531/o6d1.jpg

我今天的最后一个设置调整是每 3 分钟自动回收一次 defaultapppool 并禁用动态内容压缩。看看会怎样。

如果有人对解决方案有任何提示/想法,我将不胜感激!

提前谢谢你。

【问题讨论】:

  • 是否有可能由于错误而为应用程序池启动快速故障保护?
  • @uSlackr 我不知道,我对此表示怀疑,正如您在屏幕截图中看到的那样,我已明确禁用它。
  • 对不起 - 我错过了
  • DDOS/蛮力攻击也许?你确定这 180-220 的在线用户是合法用户而不是机器人吗?
  • @user2464424:嗯,他说他们出现在 ga,所以至少使用的代理是支持 js 的浏览器...

标签: php windows iis dll


【解决方案1】:

我可以建议转到 5.3.27(5.3 的最终版本)看看是否可以解决问题吗?在 20 到 27 之间修复的崩溃错误太多了,无法计算。可能是显而易见的解决方案,但值得一试。

【讨论】:

  • 也许我应该尝试将 php 作为 ISAPI 模块运行?或者这会导致整个 IIS 在 .dll 崩溃时崩溃,而不是让 php-cgi.exe 现在与 fastcgi 一起崩溃?
  • 也许吧。我对IIS还不够熟悉。我认为这将使 PHP 在 IIS 中运行,就像 mod_php 为 Linux 所做的那样。另一种选择是尝试 Apache for Windows。很想知道 5.3.27 是否首先工作。
【解决方案2】:
  1. 避免在 iis 中运行 php FastCGI。使用 php 缓存而不是 fcgi 可能会获得更好的性能。
  2. 这听起来非常类似于慢猴攻击。
  3. 您可能需要检查超时设置,并确保 fcgi 正确释放连接。 http://php.net/manual/en/mysqlnd-ms.pooling.php
  4. 也可能是由错误的 dll 引起的。
  5. 还值得运行一次完整的内存检查,因为我已经看到有故障的 ram 也会导致这种情况。

【讨论】:

  • 也许我应该尝试将 php 作为 ISAPI 模块运行?或者这会导致整个 IIS 在 .dll 崩溃时崩溃,而不是让 php-cgi.exe 现在与 fastcgi 一起崩溃?
【解决方案3】:

问题是由于iis管理器的FASTCGI功能中php-cgi.exe的32个进程限制造成的。将其增加到 64 暂时解决了这个问题。我处理了 32 个的原因是 Web 服务占用大量 CPU。最后,通过迁移到具有更多内核和更多内存的专用服务器是最终解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多