How Do I Prevent a Gateway Timeout With Fastcgi on Nginx

Better Stack Team
Updated on October 7, 2024

A gateway timeout error in Nginx, often represented as a 504 Gateway Timeout, occurs when Nginx is unable to get a response from an upstream server (like PHP-FPM) within a specified time limit. To prevent and resolve gateway timeout errors with FastCGI (e.g., PHP-FPM), you need to adjust both Nginx and PHP-FPM configurations to handle longer response times and ensure robust communication between the servers. Here’s how you can address and prevent these timeout issues:

1. Increase Timeout Settings in Nginx

Nginx provides several directives that control the timeout behavior for FastCGI requests. Adjust these settings to ensure Nginx waits long enough for responses from PHP-FPM.

Nginx Configuration:

Edit your Nginx configuration file, typically located at /etc/nginx/nginx.conf or within the site-specific configuration files in /etc/nginx/sites-available/.

Example Nginx Configuration:

 
server {
    listen 80;
    server_name example.com;
    root /var/www/html;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \\.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.x-fpm.sock;  # Adjust path to your PHP-FPM socket or IP:port
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;

        # Increase timeouts
        fastcgi_read_timeout 300s;   # Default is 60s
        fastcgi_send_timeout 300s;   # Default is 60s
        fastcgi_connect_timeout 300s; # Default is 60s
    }
}

Directives:

  • fastcgi_read_timeout: Sets the maximum time Nginx will wait for a response from the upstream server.
  • fastcgi_send_timeout: Sets the maximum time Nginx will wait to send a request to the upstream server.
  • fastcgi_connect_timeout: Sets the maximum time Nginx will wait to establish a connection to the upstream server.

2. Increase Timeout Settings in PHP-FPM

Ensure that PHP-FPM is configured to handle long-running scripts without timing out.

PHP-FPM Configuration:

Edit your PHP-FPM configuration file, typically found in /etc/php/7.x/fpm/pool.d/www.conf (adjust the path and version as necessary).

Example PHP-FPM Configuration:

 
; Set the maximum number of seconds a request can be active before it is terminated.
request_terminate_timeout = 300s

; The maximum time to wait for a FastCGI request to be processed.
max_execution_time = 300

Directives:

  • request_terminate_timeout: Maximum time a request can run before PHP-FPM terminates it.
  • max_execution_time: Maximum time a script is allowed to run.

3. Check System Resources

Ensure that your server has enough resources (CPU, memory) to handle requests effectively. High server load or insufficient resources can lead to timeouts.

Monitor Resources:

Use monitoring tools like top, htop, or vmstat to check resource usage and identify potential bottlenecks.

4. Optimize PHP Scripts

Long-running scripts can contribute to timeout issues. Optimize PHP code and database queries to improve performance and reduce execution time.

Suggestions:

  • Profile and optimize slow queries.
  • Use caching mechanisms (e.g., OPcache, Redis).
  • Break down long tasks into smaller chunks or use asynchronous processing.

5. Review Nginx and PHP-FPM Logs

Check the logs for both Nginx and PHP-FPM to understand why timeouts are occurring.

View Logs:

  • Nginx Logs: /var/log/nginx/error.log and /var/log/nginx/access.log
  • PHP-FPM Logs: /var/log/php7.x-fpm.log or similar

6. Test and Restart Services

After making configuration changes, test your Nginx configuration and restart both Nginx and PHP-FPM services to apply the changes.

Commands:

 
# Test Nginx configuration
sudo nginx -t

# Restart Nginx and PHP-FPM
sudo systemctl restart nginx
sudo systemctl restart php7.x-fpm

7. Use Asynchronous Processing (Optional)

For tasks that are inherently time-consuming, consider offloading them to background processes or using task queues (e.g., RabbitMQ, Redis Queue) to avoid blocking HTTP requests.

Summary

To prevent a gateway timeout with FastCGI on Nginx:

  1. Increase Timeout Settings in Nginx: Adjust fastcgi_read_timeout, fastcgi_send_timeout, and fastcgi_connect_timeout.
  2. Increase Timeout Settings in PHP-FPM: Adjust request_terminate_timeout and max_execution_time.
  3. Check System Resources: Ensure the server has adequate CPU and memory.
  4. Optimize PHP Scripts: Improve performance and reduce execution time of scripts.
  5. Review Logs: Examine Nginx and PHP-FPM logs for errors and performance issues.
  6. Test and Restart Services: Apply changes and restart services to ensure they take effect.
  7. Consider Asynchronous Processing: For long-running tasks, use background processing to avoid blocking.

By following these steps, you can effectively prevent and address gateway timeout issues in your Nginx and PHP-FPM setup.

Got an article suggestion? Let us know
Licensed under CC-BY-NC-SA

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Make your mark

Join the writer's program

Are you a developer and love writing and sharing your knowledge with the world? Join our guest writing program and get paid for writing amazing technical guides. We'll get them to the right readers that will appreciate them.

Write for us
Writer of the month
Marin Bezhanov
Marin is a software engineer and architect with a broad range of experience working...
Build on top of Better Stack

Write a script, app or project on top of Better Stack and share it with the world. Make a public repository and share it with us at our email.

community@betterstack.com

or submit a pull request and help us build better products for everyone.

See the full list of amazing projects on github