Nginx Reverse Proxy Causing 504 Gateway Timeout

Better Stack Team
Updated on October 7, 2024

A 504 Gateway Timeout error in Nginx when used as a reverse proxy indicates that Nginx was unable to receive a timely response from the upstream server it is proxying to. This can occur for several reasons, and resolving it typically involves checking both Nginx and the upstream server configurations.

Steps to Troubleshoot and Fix 504 Gateway Timeout

  1. Increase Timeout Settings in Nginx:

    Nginx has several timeout settings that can be adjusted to allow more time for upstream servers to respond. The relevant directives are:

 
- **`proxy_connect_timeout`**: Time to establish a connection to the upstream server.
- **`proxy_send_timeout`**: Time to send a request to the upstream server.
- **`proxy_read_timeout`**: Time to wait for a response from the upstream server.
- **`send_timeout`**: Time to wait for the client to receive the response.

**Example Configuration:**

Edit your Nginx configuration file, typically located at `/etc/nginx/nginx.conf` or within a specific server block file.

```
http {
    # Other configurations...

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://upstream_server;
            proxy_connect_timeout 60s;
            proxy_send_timeout 60s;
            proxy_read_timeout 60s;
            send_timeout 60s;
        }
    }
}

```

**Steps:**

- **Open Nginx Configuration:**

    ```bash
    sudo nano /etc/nginx/nginx.conf
    ```

- **Update Timeout Settings:**

    Add or adjust the timeout settings as shown above.

- **Test Configuration:**

    ```bash
    sudo nginx -t
    ```

- **Reload Nginx:**

    ```bash
    sudo systemctl reload nginx
    ```
  1. Check Upstream Server Performance:

    The upstream server might be slow or experiencing issues. Investigate and address any performance problems.

 
- **Resource Utilization:** Check the CPU, memory, and disk usage on the upstream server.
- **Application Performance:** Optimize slow database queries or inefficient code.
- **Server Logs:** Review logs of the upstream server for errors or performance bottlenecks.
  1. Ensure Upstream Server Availability:

    Make sure the upstream server is reachable and running properly.

 
- **Ping/Connectivity:** Verify network connectivity to the upstream server.

    ```bash
    ping upstream_server
    ```

- **Check Application Health:** Ensure that the application or service on the upstream server is healthy and not crashing or failing to respond.
  1. Review Network Configuration:

    Network issues can also cause timeouts. Check for issues such as:

 
- **Firewall Rules:** Ensure that firewall settings are not blocking or slowing down connections.
- **Load Balancer:** If using a load balancer, verify that it is not causing delays or issues.
  1. Monitor and Analyze Traffic:

    High traffic or load can contribute to timeout errors.

 
- **Monitor Traffic:** Use monitoring tools to check traffic levels and server load.
- **Scale Resources:** If high traffic is a cause, consider scaling resources or using load balancing to distribute traffic.
  1. Check Upstream Timeout Settings:

    Ensure that timeout settings on the upstream server are appropriate and align with Nginx’s settings. Some applications or servers might have their own timeout configurations that could impact performance.

  2. Inspect Logs for Details:

    Nginx’s error logs provide detailed information on what went wrong.

     
    sudo tail -f /var/log/nginx/error.log
    

    Look for specific errors or patterns that could indicate why the upstream server is not responding in time.

  3. Consider Using keepalive Connections:

    Enable keepalive connections to maintain persistent connections to the upstream server, which can help reduce connection establishment time and improve performance.

    Example Configuration:

     
    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
        keepalive 16;  # Adjust based on your needs
    }
    
    server {
        location / {
            proxy_pass <http://backend>;
            # other proxy settings
        }
    }
    
    

Summary

To resolve 504 Gateway Timeout errors in Nginx when acting as a reverse proxy:

  1. Increase Timeout Settings: Adjust proxy_connect_timeout, proxy_send_timeout, proxy_read_timeout, and send_timeout in your Nginx configuration.
  2. Check Upstream Performance: Address performance issues on the upstream server.
  3. Ensure Availability: Verify the upstream server is reachable and healthy.
  4. Review Network Configuration: Ensure no network issues or firewall rules are causing delays.
  5. Monitor Traffic: Scale resources and manage high traffic loads.
  6. Inspect Logs: Look at both Nginx and upstream server logs for clues.
  7. Consider keepalive Connections: Use persistent connections to reduce connection overhead.

By following these steps, you should be able to diagnose and fix 504 Gateway Timeout issues in Nginx effectively.

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