Context
我正在研究一个PhP服务器发送事件应用程序运行于Ubuntu 20.10 上的 PhP 7.4 和 Apache 2.4。该应用程序执行了它应该执行的操作,但是,据推测,用户数量的增加(连接?SSE 连接?)会导致服务器挂起。我期望/希望能够处理相对大量的用户(~1000),但我的 SSE 事件很少触发(15 分钟内~3 次),并且仅查找并发送在文本文件中找到的一些字符串值在服务器上。
Problem
我的问题是,在某些情况下,包括客户数量增加(~70 到 100)阿帕奇开始挂起。新的 HTTP 请求不会在访问日志中报告,错误日志中不会报告任何错误,并且从浏览器发送的任何请求似乎都会永远加载而没有服务器响应。那一刻的服务器负载(处理器、RAM)最小我可以通过SSH或FTP正常访问服务器。
我尝试过的
默认 Apache 配置会发生这种情况,因此如下在线咨询我试过关闭 mpm_prefork 模块 and 激活 mpm_event 和 php7.4-fpm。除了客户端数量增加了几十之外,没有太大变化,但这也可能不是真的,因为我无法手动测试,只要有机会就对应用程序进行实时测试。
我尝试关闭应用程序中的 SSE 元素,在这种情况下,我没有 Apache 挂起问题(但我无法更新需要 SSE 的客户端信息)。这意味着SSE 可能导致过载/Apache 挂起关于某事,但我不知道是什么。
我认为 Apache 挂起与打开的连接或进程的数量有关。据我所知,我只能控制它/etc/apache2/apache2.conf(我尝试设置最大保持活动请求数 0)并在/etc/php/7.4/fpm/pool.d/www.conf(我尝试设置pm.max_children = 250,pm.start_servers = 10,pm.min_spare_servers = 5,pm.max_spare_servers = 15,pm.max_requests = 1000)但无济于事。
我的问题
- 我能做什么增加 Apache 支持的连接/SSE 进程数量跑步?
- 我该怎么做才能找到答案是什么导致 Apache 挂起或者通常是什么原因导致的?
-
任何其他想法/建议关于如何解决Apache挂掉的问题?
我的服务器端代码是
<?php
header('Content-Type: text/event-stream; charset=utf-8');
header("Cache-Control: no-store");
header('Connection: keep-alive');
header('Content-Encoding: none;');
set_time_limit(0);
while (true) {
if (configurationChanged()) {
echo "data: " . newConfiguration() . "\n\n";
ob_end_flush();
flush();
} else {
sleep(3);
}
if (connection_aborted()) break;
}
?>
我的客户端代码是
var source = new EventSource('myScript.php', {withCredentials: false});
source.onopen = function (event) {
console.log("Connection opened.");
};
source.onmessage = function(event) {
console.log(event.data);
// Do stuff with the obtained data here
}
感谢您阅读本文。