Nginx 504 Gateway Timeout
Nginx didn't receive a response from the upstream server within the timeout period.
Explanation
Nginx 504 Gateway Timeout means the upstream server (PHP-FPM, Node.js, etc.) took too long to respond to Nginx. Unlike 502 where the response was invalid, 504 means the backend is processing but exceeding the allowed time. This commonly happens with long-running database queries, external API calls, file processing, or a backend that's hanging. The default Nginx timeout is typically 60 seconds. High server load or resource exhaustion can also cause timeouts.
Common Causes
- Backend processing too slow
- Slow database queries
- External API timeouts
- Server resource exhaustion
- Timeout settings too low
Solution
Increase Nginx timeout settings: proxy_read_timeout, fastcgi_read_timeout. Optimize the backend code to respond faster (add indexes, cache results, reduce external calls). Check for slow database queries with slow query log. Increase PHP max_execution_time if PHP is the bottleneck. Monitor server resources (CPU, memory, disk I/O). Add caching layers (Redis, Varnish, Nginx cache). Consider queuing long-running tasks instead of processing in the request cycle. Use load balancing to distribute traffic across multiple backends.
Code Example
# Increase Nginx timeouts
# /etc/nginx/sites-available/myapp
location ~ \.php\$ {
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_read_timeout 300; # 5 minutes
fastcgi_send_timeout 300;
proxy_read_timeout 300;
}
location /api/ {
proxy_pass http://127.0.0.1:3000;
proxy_read_timeout 300;
proxy_connect_timeout 60;
}
# Increase PHP timeout
# /etc/php/8.2/fpm/php.ini
max_execution_time = 300
# Or in .htaccess (Apache)
# max_execution_time = 300
# Check for slow queries
# MySQL: SET GLOBAL slow_query_log = 1;
# tail -f /var/log/mysql/slow-query.log
# Monitor server resources
top
htop
iostat -x 1
# Nginx cache for static responses
location /static/ {
proxy_cache_valid 200 1d;
expires 1d;
}
Error Information
Language
bash
Framework
nginx
Difficulty
Intermediate
Views
233
Related Errors
502
DevOps
Nginx 502 Bad Gateway
Nginx received an invalid response from the upstream server (PHP-FPM, Node.js, etc.).
DevOps
Laravel Schedule Task Failure
A scheduled task failed to execute or completed with errors.
DevOps
Container Name Already in Use
A Docker container with the specified name already exists.
CrashLoopBackOff
DevOps
Kubernetes CrashLoopBackOff
A container is repeatedly crashing and restarting in Kubernetes.