Вопрос или проблема
PHP иногда зависает[1], непредсказуемо, apache2 может и будет по-прежнему загружать фоны с интервалом в минуту, даже для страниц, которые вызывают na.site.loadContent()[1] и которые никогда не завершают AJAX-вызов, обеспечивающий HTML (и другой код) для любого данного URL.
ОС KUbuntu 22.04 ведет себя некорректно.
Я надеюсь, что смогу найти здесь помощь.
Я даже не уверен, как диагностировать эту проблему сам.
root@parakeet:/etc/apache2/mods-enabled# ls
access_compat.load alias.load authn_core.load authz_core.load authz_user.load autoindex.load deflate.load dir.load filter.load mime.conf mpm_event.conf.bak mpm_prefork.conf negotiation.conf php8.1.conf reqtimeout.conf rewrite.load setenvif.load ssl.conf status.conf
alias.conf auth_basic.load authn_file.load authz_host.load autoindex.conf deflate.conf dir.conf env.load headers.load mime.load mpm_event.load.bak mpm_prefork.load negotiation.load php8.1.load reqtimeout.load setenvif.conf socache_shmcb.load ssl.load status.load
Я посмотрел в соответствующий файл /var/log/apache2/error.log, и там ничего не найдено.
Как будто строка ‘TimeOut 10’, которую я добавил в /etc/apache2/apache2.conf, игнорируется, и, кроме того, моя страница должна вести себя так, как она вела себя до неудачного обновления[1] до kubuntu 24.04; загружать всё меньше чем за секунду.
[1] после того, как ‘variety’ начала показывать ошибки где-то в марте, я обновил свою ОС до kubuntu 24.04, не осознавая, что ребята из couchdb еще не выпустили *.deb файл для 24.04.
Так как ребята из couchdb не спешат, мягко говоря, я откатился на 22.04, переустановил компоненты бэкенда, и теперь я столкнулся с этой проблемой зависания страницы. 🙁
*/1 * * * * service apache2 restart && service nginx restart
Добавлено в ‘crontab -e’ в командной строке, похоже, решает проблему для меня 🙂
Я также увеличил опцию одновременных подключений apache2 и nginx (целое число).
Ответ или решение
Когда вы сталкиваетесь с проблемой застревания PHP на системе KUbuntu 22.04 в то время как Apache2 продолжает работать без заморозки, это может быть результатом нескольких факторов. В этой статье мы рассмотрим возможные причины данной проблемы и предложим способы её диагностики и решения.
Проблема с зависанием PHP
Согласно вашему описанию, проблема заключается в том, что PHP-коды иногда застревают, не отправляя завершенные AJAX-запросы, хотя с сервером Apache2 за это время ничего не происходит. Это может указывать на несколько потенциальных проблем.
1. Настройки конфигурации Apache2 и PHP
Вы упомянули, что добавили строку TimeOut 10
в конфигурацию Apache2, но она, похоже, игнорируется. Убедитесь, что данное значение корректно разграничено, и установите другие параметры, такие как ProxyTimeout
и KeepAliveTimeout
, если вы используете прокси и поддержание соединения, соответственно. Кроме этого, рассмотрите возможность увеличить значения для MaxRequestWorkers
(ранее известным как MaxClients
) в конфигурационных файлах Apache, чтобы избежать отказы в обработке запросов при высоких нагрузках.
2. Проблемы с PHP и его модулями
Проблемы в PHP могут быть вызваны неправильной работой модулей, например, расширений для работы с базами данных или других зависимостей. Проверьте, какие модули загружены в вашем PHP, и убедитесь, что они совместимы с версией PHP 8.1, которую вы используете.
Для этого выполните команду:
php -m
Это покажет список загруженных модулей. Обратите внимание на категории, которые могут быть связаны с зависанием.
3. Ошибки на уровне кода
Неправильные запросы к базе данных или приложения могут также вызывать проблемы с зависанием. Проверьте ваши скрипты на предмет бесконечных циклов или неправильных запросов. Включите обширное ведение журнала ошибок PHP, чтобы вами могли быть обнаружены возможные причины зависания:
log_errors = On
error_log = /var/log/php_errors.log
И проверьте этот файл на наличие ошибок или предупреждений.
Подход к диагностированию
- Проверка логов: Осмотрите как
/var/log/apache2/error.log
, так иphp_errors.log
, чтобы попытаться найти корень проблемы. - Мониторинг ресурсов: Используйте утилиты, такие как
htop
илиtop
, чтобы следить за использованием CPU и памяти во время зависания. Это может помочь понять, исчерпываются ли ресурсы. - AJAX запросы: Проверьте, действительно ли AJAX-запросы дойдут до сервера, используя инструменты разработчика в браузере для слежения за сетевой активностью.
Подходящие меры
Учитывая, что ваша проблема иногда разрешается перезапуском Apache и Nginx из crontab, это может быть временным решением. Однако важно рассмотреть более системные подходы к решению проблемы, такие как:
- Пересмотр кода на наличие потенциальных мелких недоработок и возможностей оптимизации.
- Проверка зависимостей и модуля CouchDB, чтобы убедиться, что все необходимые установлены корректно, особенно после отката версии ОС.
- Рассмотрите возможность оптимизации SQL запросов, если вы работаете с БД.
Заключение
Решение проблемы застревания PHP требует многоуровневого подхода. Необходимо внимательнее посмотреть на конфигурации серверного ПО, производительность кода и возможные проблемы с совместимостью. Проведение тщательной диагностики и корректировка конфигурации позволит вам значительно улучшить общую производительность вашей среды. Если проблемы сохраняются, может быть полезно рассмотреть возможность обращения за помощью к специалистам по настройке веб-серверов.