5

我在使用 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 not available 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 - 希腊语),而在普通日志中,查询字符串既可见又可复制。下面提供的屏幕截图。

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

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 并禁用动态内容压缩。看看会怎样。

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

先感谢您。

4

3 回答 3

2

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

于 2013-10-15T00:17:21.157 回答
0
  1. 避免在 iis 中运行 php FastCGI。使用 php 缓存而不是 fcgi 可能会获得更好的性能。
  2. 这听起来与缓慢的 Loris 攻击非常相似。
  3. 您可能需要检查超时设置,并确保 fcgi 正确释放连接。http://php.net/manual/en/mysqlnd-ms.pooling.php
  4. 也可能是由错误的dll引起的。
  5. 还值得运行一个完整的内存检查,因为我也看到有故障的 ram 也导致了这种情况。
于 2013-10-19T07:57:36.280 回答
0

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

于 2013-11-21T20:54:53.810 回答