【发布时间】: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_regqueue 和 connection_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 的浏览器...