October DealsAmazon USOctober deal check: compare before you payAmazon US: current deals, useful picks and tech finds.Check DealsPC HealthRecommendedCrashes, freezes, slowdowns? Check your PC nowSpot repairable issues before they interrupt work.Check PCOctober DealsAmazon USDeal season is back - check today's better picksAmazon US: current deals, useful picks and tech finds.See Picks×
Skip to content
VGSources
Blog

How to Fix Nginx PHP-FPM “Upstream Timed Out” Errors

Learn why Nginx reports “upstream timed out while reading response header from upstream,” how to distinguish connection and read failures, and how to fix PHP-FPM capacity, slow dependencies, timeout layers, and unsafe retries.
Length11 min Posted Quest giverVGSources Team
Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Do not start by increasing fastcgi_read_timeout. First identify whether Nginx timed out while connecting to PHP-FPM, sending the request, or reading the response. The message “upstream timed out while reading response header from upstream” means Nginx connected to PHP-FPM but received no response data during the configured read interval. The usual causes are a slow PHP request or dependency, an exhausted PHP-FPM worker pool, or a listener/socket problem. Fix the underlying bottleneck, then set compatible timeout limits and reload both services safely.

What the Nginx timeout message actually means

Nginx’s FastCGI module has separate timers for three phases of a request:

As an Amazon Associate I earn from qualifying purchases.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
  • fastcgi_connect_timeout covers establishing a connection to the PHP-FPM TCP listener or Unix socket.
  • fastcgi_send_timeout covers transmitting the request to PHP-FPM.
  • fastcgi_read_timeout covers waiting between successive reads of the response.

The documented default for fastcgi_read_timeout is 60 seconds. It is an interval between reads, not necessarily a maximum wall-clock duration for the entire response. A response that keeps sending data can therefore continue beyond 60 seconds, while a request that sends nothing for 60 seconds can time out.

The wording in the error log identifies the phase:

Log wording or symptom What happened First things to check
while connecting to upstream Nginx could not establish the FastCGI connection. Wrong fastcgi_pass address, stopped PHP-FPM, unavailable socket, firewall, or socket ownership and permissions.
while sending request to upstream Nginx connected but could not finish sending the request within the send interval. Network or socket health, an overloaded listener, request size, and send-timeout settings.
while reading response header from upstream Nginx connected and sent the request, but PHP-FPM did not return response data before the read interval elapsed. Slow PHP code or dependency, blocked workers, a stuck process, or a PHP-FPM limit that kills the request.

A 504 Gateway Timeout is the HTTP result commonly shown to the client, but it describes the symptom rather than the cause. Record the exact phase before editing any directive.

Capture evidence before changing a timeout

Start with one failed request and one comparable request that succeeds quickly. Record the timestamp, URL path, HTTP method, status code, client-facing request ID if available, upstream address or socket, and the complete Nginx error line. Correlate that time with the PHP-FPM error and slow logs.

Useful information includes whether the request is a read or a write, whether it fails consistently or only under load, and whether every PHP endpoint is affected or only one route. A single report-generation endpoint points toward application work; failures across all PHP routes point more strongly toward the listener, pool, or host.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Do not test by repeatedly refreshing a production form that creates orders, messages, or other side effects. Use a safe read-only URL or a controlled staging request while diagnosing.

Verify that Nginx is using the PHP-FPM endpoint you think it is

Check the fastcgi_pass target

Open the active Nginx server and location configuration and find the fastcgi_pass directive. It must match the PHP-FPM endpoint that is actually listening. Common forms are a Unix socket, such as unix:/run/php/php-fpm.sock, or a TCP address such as 127.0.0.1:9000. Distribution-specific socket names vary, so copy the path from the running PHP-FPM pool configuration rather than guessing it.

For a TCP target, verify the listener with the operating system’s socket tools, for example:

ss -ltnp | grep -E 'php-fpm|:9000'

For a Unix socket, inspect the path and its owner, group, and mode:

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
ls -l /run/php/

The Nginx worker user must be able to traverse the containing directories and open the socket. A permissions problem normally produces a connection error rather than a read-timeout message, but a stale or repeatedly recreated socket can produce confusing sequences of failures. Check the PHP-FPM service log for socket creation, crash, and restart events.

Verify the FastCGI script path

Most PHP locations pass a parameter similar to:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

Use the path convention documented for your Nginx package and application. A wrong SCRIPT_FILENAME generally causes a PHP “primary script unknown” or file-not-found response, not a prolonged upstream read timeout, but checking it prevents a separate configuration error from obscuring the investigation. Also confirm that the requested script exists and that the PHP-FPM pool user can read it.

Determine whether the PHP-FPM pool is exhausted

PHP-FPM serves requests with a finite pool of worker processes. If every worker is busy, new requests wait in the listen queue. If workers are blocked in database calls, remote HTTP calls, filesystem operations, locks, or expensive loops, the pool can appear dead even though the service is technically running.

What to look for

  • PHP-FPM logs reporting that the pool has reached its maximum children or that the listen queue is growing.
  • Workers with unusually long serving times, repeated crashes, or frequent restarts.
  • Host CPU, memory, disk-I/O, or network saturation at the same timestamps as the Nginx errors.
  • Many simultaneous requests to one slow endpoint causing unrelated PHP pages to wait.

Inspect the pool configuration for its process limits and status settings. Increasing the worker count is not automatically a fix: each worker consumes memory, and adding processes on a memory-constrained host can trigger swapping or out-of-memory kills. Measure resource usage and raise limits only when the host has capacity and the application can benefit from more concurrency.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Use PHP-FPM slow logs to find the blocked code

PHP-FPM can write a backtrace when a request exceeds a chosen threshold. Set request_slowlog_timeout in the relevant pool, ensure slowlog points to a writable file, reload PHP-FPM, and reproduce one controlled request. The slow log identifies the PHP stack that was executing when the threshold was reached; it is more actionable than simply raising Nginx’s timeout.

[www]
request_slowlog_timeout = 10s
slowlog = /var/log/php-fpm/www-slow.log

The exact pool name, file locations, and service unit differ by operating system. Confirm the effective configuration with your package’s PHP-FPM tooling and check that the service account can create or append to the slow-log file. Remove or raise the diagnostic threshold after collecting enough evidence if the resulting volume is excessive.

Trace the application dependency that leaves the worker silent

A PHP worker can spend most of its time waiting outside PHP itself. Common causes include:

  • A database query missing an index, blocked by a transaction, or scanning far more rows than expected.
  • A remote API call with no short client-side timeout or a failing DNS, TLS, or network path.
  • Network-mounted or slow local storage, including a lock on a session or cache file.
  • An unbounded loop, recursive operation, large export, image transformation, or other CPU- or memory-heavy task.
  • Application-level locks that serialize requests behind one slow operation.

Instrument the endpoint and inspect database, HTTP-client, and application logs at the same timestamp as the Nginx error. Add bounded connection and operation timeouts to outbound calls. Optimize the slow query or code path, cache repeatable work, and paginate large results. If the action is legitimately long-running, return a job identifier quickly and process the work in a queue instead of holding a PHP-FPM worker and an HTTP connection open.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Align Nginx and PHP-FPM timeout layers

Increasing one timer cannot override a shorter timer elsewhere. The effective maximum is constrained by every layer that can terminate or abandon the request.

Layer Directive or control Purpose Diagnostic implication
Nginx connection fastcgi_connect_timeout Time allowed to establish the FastCGI connection. A failure here points to the endpoint, listener, socket, or worker availability.
Nginx request send fastcgi_send_timeout Time allowed while sending the request to PHP-FPM. Investigate transport health and request size before changing read settings.
Nginx response read fastcgi_read_timeout Maximum gap between reads from PHP-FPM; documented default is 60 seconds. A gap with no response data commonly indicates slow code or a blocked worker.
PHP-FPM request lifetime request_terminate_timeout Maximum serving time for one request; 0 means it is off. PHP-FPM can kill the worker before Nginx’s read timer expires.
PHP-FPM diagnostics request_slowlog_timeout Threshold at which PHP-FPM writes a backtrace to its slow log. Provides evidence about the code path without terminating the request.

Set a read timeout longer than the normal maximum period in which the endpoint produces no bytes, with a margin for ordinary load. Then make sure PHP-FPM’s request_terminate_timeout, application client timeouts, load-balancer limits, and any front-end proxy limits are compatible. If PHP-FPM’s termination timer is shorter, raising Nginx’s value only makes the client wait longer for a process that will still be killed.

When and how to change fastcgi_read_timeout

Change this directive when the endpoint is known to be healthy, its expected quiet period is legitimate, and the other layers permit that duration. Put it in the appropriate location, server, or http context according to your configuration design. For example:

location ~ .php$ {
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass unix:/run/php/php-fpm.sock;
    fastcgi_read_timeout 120s;
}

The socket path and include file in this example are illustrative; use the values installed on your system. A longer timeout increases the number of connections and workers that can remain occupied when the application is slow. If traffic can contain many long requests, calculate the resulting concurrency and memory demand before applying the change. Prefer a route-specific value for a known long operation rather than raising the timeout globally for every PHP page.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Remember that the timer measures the interval between reads. It does not guarantee that Nginx will wait forever, and it does not make a slow database query, dead API, or exhausted pool healthy.

Set PHP-FPM’s termination and slow-log policy deliberately

request_terminate_timeout is PHP-FPM’s maximum serving time for a single request. The PHP manual describes it as the timeout after which the worker process is killed; 0 disables that limit. Choose a value that protects the pool from runaway requests while allowing documented long operations to complete. A value shorter than the Nginx read timeout will produce a PHP-FPM-side termination first.

PHP introduced request_terminate_timeout_track_finished in PHP 7.3.0. By default, the termination timer is not engaged after the script calls fastcgi_finish_request; enabling this option makes the timer continue to track work after the response has been finished. This matters when application code performs cleanup or other post-response work that could occupy a worker.

Use the slow-log threshold to obtain a backtrace before choosing a termination value. Do not set both values so high that a runaway request can consume a worker indefinitely, and do not set them so low that normal exports are killed on every busy day.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Understand upstream retries before enabling them

Nginx can treat FastCGI errors and timeouts as unsuccessful attempts and try another upstream. The relevant controls are:

  • fastcgi_next_upstream selects which failures qualify for another attempt.
  • fastcgi_next_upstream_timeout limits the total time spent retrying.
  • fastcgi_next_upstream_tries limits the number of attempts.

Retries can improve availability for a safe, idempotent read when one PHP-FPM instance or upstream path fails. They can also repeat side effects. A timed-out POST may have committed an order, payment, message, or database update even though Nginx did not receive the response. Retrying that request can create a duplicate. Nginx warns that retrying non-idempotent requests requires explicit configuration. Restrict retries to operations designed for them, use idempotency keys where appropriate, and keep the retry window bounded.

Apply configuration changes and observe one controlled test

  1. Save a copy of the current Nginx and PHP-FPM pool configuration.
  2. Test Nginx syntax with the platform’s installed command, commonly nginx -t. Fix every reported error before reloading.
  3. Reload Nginx through the service manager so existing connections can drain. A common systemd command is systemctl reload nginx.
  4. Validate the PHP-FPM pool configuration using the package’s supported test or service command, then reload PHP-FPM, commonly with systemctl reload php-fpm or a versioned unit name.
  5. Tail the Nginx error log, PHP-FPM error log, and PHP-FPM slow log while issuing one safe request.
  6. Confirm the result in access logs and application logs. Check latency, status, worker utilization, and whether the same phase appears again.

Service names and log paths differ among distributions and PHP versions. If a reload is unsupported or fails, use the service manager’s status and journal output to identify the exact unit rather than repeatedly restarting production services.

Match the symptom to the fix

Observed pattern Most likely direction Preferred action
Only one endpoint times out after a predictable amount of work. Application or dependency is slow. Capture a slow-log backtrace, profile the query or remote call, optimize it, or move the job to a queue. Raise a route-specific read timeout only if the work is valid and bounded.
Many PHP routes fail during traffic spikes; pool warnings appear. PHP-FPM workers are saturated. Find the requests holding workers, fix their dependencies, then tune pool capacity against available CPU and memory.
Errors say “while connecting to upstream.” Listener, socket, address, permissions, or service availability. Verify fastcgi_pass, socket ownership, listening state, firewall rules, and PHP-FPM restarts.
Nginx waits, then PHP-FPM logs a terminated request. request_terminate_timeout is shorter than the work requires. Determine why the request is slow; only then align the termination and read limits or redesign the operation.
A response streams data regularly but still takes a long time. Read-interval behavior is being mistaken for a total timeout. Measure the longest gap between bytes and check every proxy’s total-response limit separately.
GET requests recover after a retry, but POST results are duplicated. Unsafe upstream retry. Disable retries for non-idempotent operations or add application-level idempotency protection.

Common mistakes that prolong the outage

  • Raising the timeout globally first: This can turn a visible failure into a larger PHP-FPM queue and consume more workers without fixing the slow operation.
  • Changing only Nginx: PHP-FPM, the application HTTP client, a load balancer, or a CDN may still enforce a shorter limit.
  • Ignoring the exact phase: A read timeout setting cannot repair a wrong socket path or a stopped listener.
  • Increasing worker counts without memory measurements: More children can cause swapping or out-of-memory kills.
  • Retrying writes automatically: A timeout does not prove that the server rolled back the transaction.
  • Failing to inspect slow logs: Repeated configuration changes without a backtrace leave the dependency causing the delay unidentified.
  • Testing with destructive requests: Use a read-only or idempotent test while reproducing the problem.

When a managed server is a reasonable operational choice

If you cannot consistently inspect PHP-FPM pools, socket permissions, slow logs, and service reloads, a managed VPS with Nginx and PHP-FPM tuning can provide operational help. It does not remove the need to identify slow application dependencies, but an administrator can verify listeners, capacity, timeout alignment, and log evidence while preserving safe reload procedures. Ask what access you retain to Nginx and PHP-FPM configuration, slow logs, metrics, and rollback history before handing over control.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

A practical order of operations

  1. Read the complete Nginx error and classify connect, send, or read phase.
  2. Confirm the upstream address or socket, listener state, permissions, and script path.
  3. Check PHP-FPM pool saturation, crashes, restarts, and host resource pressure.
  4. Enable or inspect the PHP-FPM slow log and trace database, network, storage, lock, and code delays.
  5. Compare fastcgi_read_timeout with request_terminate_timeout and every proxy or application limit.
  6. Fix or redesign the slow operation; use a queue for work that should not occupy an HTTP worker.
  7. Use a narrowly scoped read-timeout increase only when the longer quiet period is expected and safe.
  8. Review upstream retries for idempotency, test syntax, reload safely, and observe one controlled reproduction.

This sequence distinguishes a dead or unreachable PHP-FPM endpoint from a healthy endpoint that is simply busy, and it produces evidence before a timeout change can hide the real fault.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Leave a Reply

Your email address will not be published. Required fields are marked *

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

More quests from Patch Notes

  1. How to Set Up a RedM (RDR2) Server in 2026: License Key, txAdmin and server.cfg, Step by StepBlog11min
  2. Best RedM (RDR2) Server Hosting in 2026: Comparing Four Hosts on Slots, Memory and PriceBlog10min
  3. How to Host a Mindustry Server in 2026: server-release.jar, Port 6567 and the Commands That MatterBlog7min
Recommended PC Tool
Recommended PC Tool
Outdated Drivers Are Slowing You DownFree scan - exact matches
PC Slower Than It Used to Be?Free scan - under a minute

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.