Что означает ошибка 524
Ошибка 524 Cloudflare (Cloudflare Timeout) возникает, когда CDN-сервис Cloudflare установил TCP-соединение с вашим исходным сервером (origin), но не получил от него полный HTTP-ответ в течение 100 секунд.
Браузер пользователя отображает:
Error 524: A timeout occurred
А в заголовках ответа видно:
HTTP/1.1 524
Server: cloudflare
Ключевой момент: Cloudflare генерирует эту ошибку до того, как запрос достигает вашего веб-сервера (Nginx, Apache). Проблема не в инфраструктуре Cloudflare, а в том, что ваш сервер либо не начал отвечать вообще, либо ответил слишком медленно.

Схема архитектуры Cloudflare как обратного прокси с таймаутом 100 секунд
Причины возникновения
- Долгий выполнение запроса на бэкенде. Скрипт (PHP, Python, Node.js) или запрос к базе данных выполняется более 100 секунд.
- Нехватка ресурсов сервера. Высокая загрузка CPU, нехватка RAM, приводящая к активному своппингу и замедлению всех процессов.
- Блокировка со стороны файрвола/WAF. Серверный файрвол (iptables, CSF) или веб-аппликационный файрвол (ModSecurity) отбрасывает или задерживает пакеты от IP-адресов Cloudflare.
- Сетевые проблемы. Высокие задержки (latency) или потери пакетов (packet loss) между дата-центром Cloudflare и вашим сервером.
- Слишком низкие таймауты в конфигурации. Значения
proxy_read_timeout,fastcgi_read_timeout(nginx) илиProxyTimeout(Apache) установлены менее 100 секунд, и сервер сам разрывает соединение. - "Заморозка" процесса приложения. Процесс PHP-FPM, Gunicorn или Puma завис в ожидании внешнего ресурса (API, БД) и не может завершить запрос.
Способы решения
Шаг 1: Диагностика с помощью curl и Cloudflare
Сначала подтвердите, что проблема именно в таймауте Cloudflare.
- Временно отключите Cloudflare. В панели Cloudflare для домена переведите иконку облачка в положение DNS Only (серое). Если сайт заработает — проблема точно в слое Cloudflare/сети.
- Измерьте время ответа напрямую к серверу. Обращайтесь к серверу по его IP-адресу или домену, который указывает прямо на сервер (не через Cloudflare).
Еслиcurl -o /dev/null -s -w "time_total: %{time_total}\n" http://IP_СЕРВЕРА/проблемный-путьtime_totalприближается к 100 секундам или превышает её — проблема в производительности бэкенда.
Шаг 2: Анализ логов и мониторинг ресурсов
Найдите конкретный запрос или процесс, вызывающий таймаут.
- Логи веб-сервера. Для Nginx ищите
upstream timed outилиgateway timeout:
Для Apache проверяйтеtail -f /var/log/nginx/error.log | grep -E "(upstream timed out|gateway timeout)"error_log. - Логи приложения. Для PHP-FPM:
Для Python (Gunicorn) или Node.js смотрите логи systemd или консоли.tail -f /var/log/php-fpm/error.log - Мониторинг в реальном времени. Установите
htopилиglancesи наблюдайте за загрузкой CPU, RAM и количеством процессов в момент ошибки:htop
Шаг 3: Оптимизация медленного кода и запросов
Если проблема в конкретном скрипте (например, report.php или /api/analytics):
- Профилируйте запрос. Используйте Xdebug/Blackfire для PHP,
cProfileдля Python, clinic.js для Node.js. - Оптимизируйте запросы к БД. Для медленных SQL-запросов выполните
EXPLAIN ANALYZE, добавьте недостающие индексы, перепишите сложные JOIN. - Внедрите кэширование. Результаты тяжёлых вычислений или запросов кешируйте в Redis или Memcached.
Пример для PHP (Predis):
<?php $redis = new Predis\Client(); $cacheKey = 'heavy_report_data'; $data = $redis->get($cacheKey); if (!$data) { $data = generateHeavyReport(); // Функция, выполняющаяся >100s $redis->setex($cacheKey, 3600, serialize($data)); } echo $data; - Выносите долгие операции в очередь. Отправку email, генерацию отчётов, обработку изображений перенесите в асинхронные задачи (RabbitMQ, Beanstalkd, Celery, Sidekiq). Веб-запрос должен возвращать ответ быстро, а тяжёлая работа выполняется фоном.
Шаг 4: Настройка таймаутов веб-сервера и приложения
Убедитесь, что все таймауты в цепочке превышают 100 секунд, иначе сервер прервёт запрос раньше Cloudflare.
Для Nginx (в nginx.conf или конфиге сайта):
location ~ \.php$ {
fastcgi_pass php-fpm:9000;
fastcgi_read_timeout 120; # Основной таймаут чтения ответа от FastCGI
fastcgi_connect_timeout 120; # Таймаут установки соединения
}
Также проверьте proxy_read_timeout, если используется прокси.
Для PHP (php.ini или .user.ini):
max_execution_time = 120 ; Макс. время выполнения скрипта
max_input_time = 120 ; Макс. время на parsing входных данных
Для Apache (в конфиге виртуального хоста или .htaccess):
# Если используется mod_proxy
ProxyTimeout 120
# Если используется mod_php
php_value max_execution_time 120
Для Node.js (Express):
const timeout = require('connect-timeout');
app.use(timeout('120s')); // Middleware, прерывающий запросы дольше 120s
После изменений перезапустите сервисы:
sudo systemctl restart nginx php-fpm
# или для Apache
sudo systemctl restart apache2

Примеры настроек таймаутов в nginx, apache и php для исправления ошибки 524
Шаг 5: Проверка сетевой доступности и файрвола
Cloudflare использует фиксированные диапазоны IP-адресов. Если ваш файрвол их блокирует, соединение оборвётся.
- Разрешите IP-адреса Cloudflare. Скачайте актуальные списки с cloudflare.com/ips и добавьте в правила файрвола.
Пример для
iptablesс использованиемipset(рекомендуется):
Для# Создаём set для IPv4 ipset create cloudflare hash:ip # Загружаем и добавляем IPv4-адреса curl -s https://www.cloudflare.com/ips-v4 | while read ip; do ipset add cloudflare $ip; done # Разрешаем трафик от Cloudflare на порты 80/443 iptables -A INPUT -p tcp --dport 80 -m set --match-set cloudflare src -j ACCEPT iptables -A INPUT -p tcp --dport 443 -m set --match-set cloudflare src -j ACCEPTfirewalldилиCSFиспользуйте соответствующие команды добавления сети/IP. - Проверьте логи файрвола на предмет отбрасывания пакетов от Cloudflare:
sudo grep -i "cloudflare" /var/log/iptables.log sudo tail -f /var/log/fail2ban.log - Проверьте сетевое качество. С вашего сервера выполните ping и traceroute до любого IP Cloudflare (например,
172.67.134.212):
Стабильные значения ping (< 100 мс) и отсутствие потерь пакетов (ping -c 4 172.67.134.212 traceroute 172.67.134.2120% packet loss) — хороший знак.
Профилактика
- Регулярный аудит производительности. Включите
slow_query_logв MySQL/PostgreSQL. Используйте APM-инструменты (New Relic, Datadog, Scout) для выявления медленных эндпоинтов. - Настройте мониторинг времени ответа. В Zabbix, Prometheus или UptimeRobot задайте алерт при времени отклика (response time) > 30 секунд.
- Кэшируйте на всех уровнях. Используйте
Cache-Controlзаголовки, кэшируйте целые страницы (Varnish) или фрагменты (Redis, Memcached) на уровне приложения. - Устанавливайте лимиты на пользовательские запросы. Для API используйте rate limiting (например, через nginx
limit_req_zone) и таймауты на уровне кода, чтобы один "тяжёлый" запрос не мог заблокировать воркер. - Содержите ПО в актуальном состоянии. Устаревшие версии PHP, Node.js или библиотек могут иметь утечки памяти или известные проблемы с производительностью.
- Проводите нагрузочное тестирование. Перед развертыванием новых функций тестируйте их под пиковую нагрузку с помощью JMeter, k6 или Locust, чтобы оценить время ответа.