Introduction
Cloudflare 524 errors occur when the origin web server establishes a TCP connection but doesn't return an HTTP response within 100 seconds. This indicates the application is processing slowly, not that the server is down.
Symptoms
Browser error:
``` 524 A Timeout Occurred
A timeout occurred while waiting for the server to respond. ```
Cloudflare dashboard:
{
"error": "524",
"description": "A timeout occurred",
"client_ip": "1.2.3.4",
"ray_id": "abc123def456"
}curl test:
```bash $ curl -I https://example.com/slow-endpoint
# Request times out after ~100 seconds ```
Common Causes
- 1.Slow application processing - Request takes >100 seconds
- 2.Database query timeout - Long-running queries
- 3.External API calls - Waiting for slow third-party services
- 4.Large file processing - Uploading or processing big files
- 5.Background jobs - Synchronous long-running tasks
- 6.Server overload - High CPU/memory causing slowness
- 7.Network latency - Slow network between Cloudflare and origin
Step-by-Step Fix
Step 1: Identify Slow Endpoints
```bash # Test endpoint directly time curl -I http://YOUR_ORIGIN_IP/slow-endpoint
# Check which endpoints timeout grep "524" /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c
# Check Cloudflare analytics # Dashboard > Analytics > Traffic > Filter by 524 status ```
Step 2: Check Origin Response Time
```bash # Test origin server directly time curl http://YOUR_ORIGIN_IP/api/endpoint
# Check response time distribution for i in {1..10}; do echo "Request $i:" time curl -s -o /dev/null http://YOUR_ORIGIN_IP/api/endpoint done
# If direct access also slow, issue is origin server ```
Step 3: Check Server Resources
```bash # Check CPU usage top -bn1 | head -20
# Check memory free -m
# Check disk I/O iostat -x 1 5
# Check load average uptime
# If resources maxed out, scale server or optimize ```
Step 4: Analyze Application Performance
```bash # Check PHP-FPM slow log tail -f /var/log/php-fpm/slow.log
# Check Node.js profiling node --prof app.js node --prof-process isolate-*.log
# Check Python slow requests # Enable slow request logging in gunicorn gunicorn --timeout 120 --access-logfile - app:app
# Check database slow queries # MySQL: SELECT * FROM mysql.slow_log ORDER BY query_time DESC LIMIT 10;
# PostgreSQL: SELECT * FROM pg_stat_statements ORDER BY total_time DESC LIMIT 10; ```
Step 5: Optimize Database Queries
```sql -- Find slow queries SELECT query, avg_time_ms, calls FROM pg_stat_statements ORDER BY avg_time_ms DESC LIMIT 20;
-- Add missing indexes EXPLAIN ANALYZE SELECT * FROM orders WHERE user_id = 123; CREATE INDEX idx_orders_user_id ON orders(user_id);
-- Optimize query -- Instead of: SELECT * FROM large_table; -- Use: SELECT id, name FROM large_table WHERE status = 'active' LIMIT 100; ```
Step 6: Implement Caching
```nginx # Nginx caching for slow responses proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m;
server { location /api/slow-endpoint { proxy_cache my_cache; proxy_cache_valid 200 10m; proxy_pass http://backend; } } ```
// PHP application caching
$cacheKey = 'slow_data_' . $id;
$cached = $redis->get($cacheKey);
if ($cached) {
return json_decode($cached, true);
}
$data = expensiveOperation();
$redis->setex($cacheKey, 3600, json_encode($data));
return $data;Step 7: Move Long Operations to Background
```bash # Instead of synchronous processing # Use job queue
# Laravel php artisan queue:work
# Sidekiq (Ruby) bundle exec sidekiq
# Celery (Python) celery -A tasks worker
# Return immediate response, process in background # Client polls for completion or uses webhook ```
Step 8: Increase Origin Server Timeout
# Nginx upstream timeout
location / {
proxy_pass http://backend;
proxy_read_timeout 300s;
proxy_connect_timeout 60s;
proxy_send_timeout 300s;
}# Apache proxy timeout
ProxyTimeout 300// PHP-FPM timeout
; /etc/php/8.1/fpm/pool.d/www.conf
request_terminate_timeout = 300Step 9: Use Cloudflare Workers for Long Requests
```javascript // Cloudflare Worker for long-running requests export default { async fetch(request) { const controller = new AbortController(); const timeout = setTimeout(() => controller.abort(), 300000); // 5 min
try { const response = await fetch('http://origin/api/long-request', { signal: controller.signal }); clearTimeout(timeout); return response; } catch (err) { clearTimeout(timeout); return new Response('Request processing', { status: 202 }); } } } ```
Step 10: Implement Request Timeout Handling
// Node.js request timeout
app.get('/api/slow', async (req, res) => {
try {
const result = await Promise.race([
longOperation(),
new Promise((_, reject) =>
setTimeout(() => reject(new Error('Timeout')), 90000)
)
]);
res.json(result);
} catch (err) {
res.status(504).json({ error: 'Processing timeout' });
}
});Cloudflare Timeout Limits
| Plan | Origin Timeout | Can Increase |
|---|---|---|
| Free | 100 seconds | No |
| Pro | 100 seconds | No |
| Business | 100 seconds | Yes (support ticket) |
| Enterprise | 600 seconds | Yes (configurable) |
Verification
```bash # After optimizing # Test slow endpoint time curl https://example.com/api/slow-endpoint
# Should complete in < 100 seconds
# Monitor for 524 errors # Cloudflare Dashboard > Analytics > Filter 524
# Check origin server logs tail -f /var/log/nginx/access.log | grep "200"
# Should show successful requests ```
Prevention
To prevent Cloudflare 524 timeout issues from recurring, implement these proactive measures:
1. Monitor Origin Response Time
groups:
- name: cloudflare-origin
rules:
- alert: CloudflareOriginSlow
expr: |
cloudflare_origin_response_time_seconds > 80
for: 2m
labels:
severity: warning
annotations:
summary: "Cloudflare origin response time exceeds 80 seconds"2. Optimize Long-Running Requests
```javascript // Use background processing for slow operations app.post('/api/process', async (req, res) => { // Return immediately with job ID const jobId = await queue.add(req.body); res.json({ jobId, status: 'processing' }); });
// Client polls for status app.get('/api/process/:jobId', async (req, res) => { const status = await queue.getStatus(req.params.jobId); res.json(status); }); ```
3. Configure Cloudflare Workers for Long Requests
```javascript // Use Cloudflare Worker to extend timeout addEventListener('fetch', event => { event.respondWith(handleRequest(event.request)); });
async function handleRequest(request) { const response = await fetch(request, { timeout: 60000 }); return response; } ```
Best Practices Checklist
- [ ] Monitor origin response time
- [ ] Use async processing for slow operations
- [ ] Configure appropriate timeouts
- [ ] Optimize database queries
- [ ] Use caching for slow responses
- [ ] Consider Cloudflare Enterprise for longer timeouts
Related Issues
- [Fix Cloudflare 520 Web Server Returned Unknown Error](/articles/fix-cloudflare-520-web-server-returned-unknown-error)
- [Fix Cloudflare 522 Connection Timed Out](/articles/fix-cloudflare-522-connection-timed-out)
- [Fix Cloudflare Origin Timeout](/articles/fix-cloudflare-524-a-timeout-occurred)
Related Articles
- [Cloudflare CDN troubleshooting: Fix Cloudflare Always Online Stale Html Broken Lin](cloudflare-always-online-stale-html-broken-links)
- [Cloudflare CDN troubleshooting: Cloudflare Cache Everything Rule Breaks WooCommerc](cloudflare-cache-everything-breaking-woocommerce-cart-cookies)
- [Cloudflare CDN troubleshooting: Fix Cloudflare Cache Purge Not Propagating All Edg](cloudflare-cache-purge-not-propagating-all-edge-locations)
- [Cloudflare CDN troubleshooting: Fix Cloudflare DNS Proxy Orange Cloud Blocking Ssh](cloudflare-dns-proxy-orange-cloud-blocking-ssh)
- [Cloudflare CDN troubleshooting: Fix Cloudflare Error 520 Web Server Returns Empty ](cloudflare-error-520-web-server-returns-empty-response)
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "TechArticle", "headline": "Fix Cloudflare 524 A Timeout Occurred", "description": "Troubleshoot Cloudflare 524 timeout errors. Optimize origin response time, increase timeouts, fix slow applications.", "url": "https://www.fixwikihub.com/fix-cloudflare-524-a-timeout-occurred", "publisher": { "@type": "Organization", "name": "FixWikiHub", "url": "https://www.fixwikihub.com" }, "author": { "@type": "Person", "name": "FixWikiHub Editorial Team" }, "datePublished": "2026-04-04T00:18:10.477Z", "dateModified": "2026-04-04T00:18:10.477Z" } </script>