Недавно я обнаружил, что веб-сайт (электронная коммерция Prestashop на машине Centos PHP-FPM/Apache/MySql) не работает и не отвечает на веб-запросы.
После расследования проблема возникла из-за вызова API, сделанного с помощью php-curl к конечной точке, которая временно была отключена, внутри PHP-файла приложения, который был отозван на всех страницах веб-сайта.
Вызов cURL был ошибочно выполнен без настроек CURLOPT_TIMEOUT_MS, поэтому пользователи, посещающие мой веб-сайт, быстро заполняли максимальное количество соединений php, блокируя процессы php-fpm и не позволяя моему серверу получать другие входящие соединения.
Интересно, можно ли быстро и эффективно предотвратить/выявить такую проблему «в производстве» с терминала, если она повторится (особенно быстро понять, какая конечная точка заблокирована, или определить файл, из которого сгенерирован скрипт, блокирующий сервер) , поскольку в моем случае мне пришлось проверять проблему на «уровне приложения», а не на сервере, поскольку:
- при запуске «сверху» сервер показывает список заблокированных процессов php-fpm без какой-либо дополнительной информации для понимания проблемы (также средняя загрузка сервера была около 0,00, так как активности почти не было из-за зависших соединений).
- Запуск «netstat -nputw» показывает мне много внутренних подключений в статусе TIME_WAIT, но снова нет информации о «виновнике» сбоя (могу ли я увидеть конечную точку, вызываемую php-curl с помощью netstat или аналогичной сетевой команды?)
- Запуская "strace" процессов php-fpm вижу много задействованных файлов, но это не очень помогает, так как сайт при средней посещаемости открывает десятки и десятки файлов.
- Журналы веб-сервера сообщили мне только о тайм-ауте подключения к веб-ресурсам, но не о сценарии, содержащем проблемный вызов cURL.
Спасибо за вашу помощь.