How to Troubleshoot Nginx Upstream Timeout and PHP-FPM Slowness

If your Nginx server is experiencing upstream timeouts and slow response times, it’s likely that the issue lies in the configuration of your Nginx and PHP-FPM setup. This comprehensive troubleshooting guide will help you identify the root causes of these problems and provide step-by-step solutions to resolve them. Let’s dive into how you can get your website back up to speed.

1. Understanding Nginx Upstream Timeout Errors

When you see an error like this in your Nginx logs:

upstream timed out (110: Connection timed out) while reading response header from upstream

This indicates that Nginx is unable to get a response from the upstream server (PHP-FPM in this case) within the configured time. The common causes of this error are:

– High server load or resource constraints.
– Misconfigured PHP-FPM settings.
– Long-running PHP scripts or slow database queries.
– Insufficient Nginx timeout values.

2. Increase Nginx Timeout Settings

Nginx timeout settings might be too low for your current server load. Increasing these values can help:

proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_send_timeout 300;

fastcgi_read_timeout 300;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;

Add these lines to your Nginx configuration (`/etc/nginx/nginx.conf` or your site’s config file) and restart Nginx:

sudo nginx -t
sudo systemctl restart nginx

3. Optimize PHP-FPM Configuration

Your PHP-FPM settings play a crucial role in handling concurrent requests. Here’s a sample PHP-FPM configuration and recommended changes:

pm = dynamic
pm.max_children = 40
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 15
pm.process_idle_timeout = 10s;
pm.max_requests = 500

Explanation:

pm.max_children: The maximum number of child processes. Lowering this value can prevent memory exhaustion.
pm.max_requests: Setting this to `500` ensures processes are respawned periodically, reducing the impact of memory leaks.

Restart PHP-FPM after making changes:

sudo systemctl restart php-fpm

4. Check for Slow PHP Scripts

Long-running PHP scripts can cause timeouts. Enable PHP-FPM’s slow log to identify these scripts:

request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/slow.log

Check the slow log for entries:

tail -f /var/log/php-fpm/slow.log

Optimize or refactor any slow-running scripts identified.

5. Analyze Database Performance

If your PHP scripts are performing complex database queries, they might be causing delays. Enable MySQL’s slow query log:

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;

Check the slow query log (`/var/log/mysql/slow-query.log`) for queries taking longer than 2 seconds. Consider adding indexes or optimizing these queries.

6. Monitor Server Resource Usage

High CPU or memory usage can affect PHP-FPM’s performance. Use `top` or `htop` to monitor real-time usage:

top

If memory usage is high, consider reducing `pm.max_children` or increasing server RAM.

7. Enable Caching in Nginx

For frequently accessed pages, enable caching to reduce the load on PHP-FPM:

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;

This reduces the number of requests hitting the backend.

8. Test Your Configuration

After applying the changes, test your website’s performance using a free online load testing tool like **Loader.io** or **k6**.

Example with Loader.io:

1. Sign up at [Loader.io](https://loader.io).
2. Verify your website and run a load test with up to 10,000 clients.
3. Analyze the response times and adjust the configuration if needed.

9. Monitor Logs for Ongoing Issues

Keep an eye on the Nginx error log and PHP-FPM slow log:

tail -f /var/log/nginx/error.log /var/log/php-fpm/slow.log

This helps you catch any new issues as they arise.

Conclusion

By following these steps, you can effectively troubleshoot and resolve Nginx upstream timeout errors and PHP-FPM slowness. Optimizing your server configuration and identifying performance bottlenecks will significantly improve your website’s response time and reliability.

If you still encounter issues, consider scaling up your server resources or using a content delivery network (CDN) for further optimization.

This article is inspired by real-world challenges we tackle in our projects. If you're looking for expert solutions or need a team to bring your idea to life,

Let's talk!

    Please fill your details, and we will contact you back

      Please fill your details, and we will contact you back