Есть
сайт А, работает себе спокнойно на apache + php 5.4 с допотопным sql 2005. На нем, переписываются .php файлы с адаптацией под php 8.2+, путем заворачивания в mssql_query($sql) { sqlsrv_query($sql) }. В тестовой среде,
сайт А хорошо работает. Немного увеличилось время загрузки страниц, по сравнению с 5.4, но все равно - все открывается и работает хорошо.
Запускаем (сервер физический, свой - не хост и не vps) боевой сервер на Debian 12.6. Устанавливаем Apache + php-fpm 8.2 . Запускается
сайт А в продакт.
На следующий день - сайт 2 раза падает в 504 ошибку. Растут кол-во процессов Apache на сервере. Устранялось принудительной перезагрузкой apache + php. Смотрели access.log - ничего криминального, стандартные и не слишком частые GET/POST запросы(1-2 в минуту запроса). Явного факта DDOS атаки - не было. Fail2ban - чистый. В логах работы сервера и апач - тоже ошибок нет.
Через день, сайт упал еще 3 раза. Начали искать в интернете, почему так. У сервера достаточно ресурсов(64гб памяти + 2cpu * 6 ядра - при этом растут процессы апач и используется рессурсов даже не 5-10% от общего количества). Закрыли все порты наружу кроме 80 и 443. Попробовали с помощью python.requests отправлять по 50-100 GET запросов на сайт ежеминутно - он падал в 502/504. Начали искать информацию в интернете об этом. Нашли информацию о том, что php-fpm требует более детальной настройки и отличается по логике работы от своих дедов. Повысили параметр в конфигурации php -
pm.max_childrens с 5 до 500 и подняли в php.ini max_memory_size . После сайт перестал падать.
Прошло 2 месяца. Сайт ни разу не упал.
Сайт Б делаем по той же схеме, что и с его предшественником (адаптируем .php файлы с 5.4 на 8.2), так же - увеличилось немного время загрузки страницы - но в целом в тестовом режиме все корретно работает. Запускаем
сайт Б в продакт, на тот же сервер, что и
сайт А. К
сайту Б - обращений меньше, так как он служит исключительно для персонала. Спустя сутки работы
сайта Б в продакте - сервер опять начал падать и оба сайты выдавали 504. В логах - опять все чисто. Нашли в php8.2-fpm.log следующие строчки:
[28-May-2025 10:15:35] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 0 idle, and 486 total children
[28-May-2025 10:15:36] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 16 children, there are 0 idle, and 487 total children
[28-May-2025 10:15:47] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 0 idle, and 495 total children
[28-May-2025 10:15:48] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 16 children, there are 0 idle, and 496 total children
[28-May-2025 10:15:53] WARNING: [pool www] server reached pm.max_children setting (500), consider raising it
Уже хоть какое то информирование о том, что превышен лимит max_childrens.
Попробовали включить slow.log для страниц, которые загружаются боле 5 секунд. Да, за 12 часов насобирался списко страниц, у которых время получения ответа от 5 до 8 секунд. В логах GET/POST по сайтам - ничего кримаинального, никаих признаков DDOS или кучи запросов в секунду. Пока пришли к теории, что 5-6 секунд это много для получения ответа от сервера и полной загрузки страницы - возможно придется переделывать сотни SQL запросов и убирать костыль с mssql_query. Верно ли это? На что стоит обратить внимание? Проблем в выходом наружу у сервера - тоже нет, все корректно работало.