当连接数增加时,Apache 停止提供请求

当连接数增加时,Apache 停止提供请求

可能重复:
Apache 性能问题,在“总共 1000 个子项”之后,Apache 不再响应 HTTP 请求。不是 MaxClients 问题?

MaxClients等参数的值ServerLimit相当高(4000)。服务器上的可用 RAM 也很高(~8G)。在 24 核 CPU 上,平均负载保持在 1 以下。但是,当网站上的访问者数量增加时,apache 就会停止处理请求。apache 错误日志为空白,访问日志显示没有更多请求进入。

重新启动 apache 可以使其再次工作,直到请求数量再次增加。

有什么想法从哪里开始寻找吗?

更新 运行 apache 错误日志时出现以下错误LogLevel Debug [info] server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers), spawning 32 children, there are 479 idle, and 1027 total children

答案1

错误信息会告诉你答案 - 增加StartServersMin/MaxSpareServers。你可能还需要看看MaxClients

答案2

我会尝试将 PHP 脚本和静态文件的服务分开。

您可以使用 非常高效地提供静态文件,worker MPM甚至使用event MPMavailable for效果更好httpd 2.4+。但您不能使用此 MPM 来提供 PHP 脚本,因为 PHP 不是线程安全的。

对于 PHP,您可以运行单独的 httpd 实例(我在我的服务器上运行它Listen 127.0.0.2:488)并将主服务器配置为反向代理:

ProxyPreserveHost On
DocumentRoot /var/www/html
RewriteEngine On
RewriteCond /var/www/html%{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} \.php$
RewriteRule ^/(.*) http://127.0.0.2:488/$1 [P,L]

有了它mod_remoteip(再次 - 从 httpd 2.4 开始可用),它对于 PHP 脚本来说将真正透明。

或者使用例如php-fpm

这样,对静态文件、HTTP 持久连接等的请求将不会使用有限的服务器子池,并且只会使用一小部分 RAM。

答案3

你可能在其他地方遇到了瓶颈——例如数据库、共享磁盘或其他东西

相关内容