我有一个 apache http 服务器。最近,我的服务器超载了,导致服务不再响应任何 http 请求(最后一个响应是 503)。即使服务器不再超载,服务也没有恢复。大约 50 分钟后重新启动服务,服务才恢复(从那时起一切都很好)。我的网站由 php 脚本运行。这可能是因为一个非常长的循环已经使服务器的资源超载。我的问题是,我如何让 apache 能够容忍这种超载,而不是完全崩溃。谢谢。
答案1
你的问题太宽泛了。你需要改进你的 PHP 脚本,让它具有可扩展性……而这一切都取决于它正在做什么。
除此之外,如果您以预分叉方式使用 Apache,您可以限制同时操作的数量,例如使用设置MaxClients
。
答案2
您最好优化 PHP 的内存使用情况,并确保 Apache 不会“崩溃”。
确保您的 PHP memory_limit 合理,即尝试将其设置为 64MB 或 96MB。在所有代码中搜索 ini_set('memory_limit')
接下来确保 Apache 接受的请求不超过您的服务器内存可以处理的数量,例如 2048MB 服务器内存、96MB PHP:
例如 2048MB 服务器内存、96MB PHP:为可能正在运行的 MySQL 和其他程序保留合理数量的内存,例如 512MB。这样您就有 1500MB/96MB -> 15 个并行请求。
Apache 的限制设置不同,这取决于您运行 Apache mpm worker 还是 prefork,或者您是否运行 PHP-FPM。
由于这些更改,您的网站在超载时仍然会很慢,并且人们会遇到错误。但是,在激增平息后,Apache 将立即能够再次提供页面。
您的示例中可能发生的情况是,您已打开交换空间,因此 Apache 将开始使用磁盘作为内存,并主要忙于将内存交换到磁盘并交换回来
答案3
调整 Apache 很复杂,但是这应该能给你一些建议
最重要的是开始测量一些东西 - 内存使用情况、CPU、负载、并发连接数 - 这样你就知道哪个资源即将耗尽。
(恕我直言,jdog 对 php 内存使用设置任意限制的建议是没有建设性的)。
可能是因为一个很长的循环已经使服务器的资源超载
不要猜测,要测量。
单独进行大量迭代的循环不太可能导致服务器崩溃。另一方面,如果此脚本运行缓慢、占用大量内存且被频繁访问,则它可能是导致问题的主要原因,但从您提供的信息来看,无法判断