Nginx FastCGI Cache for WordPress: Speed Without Breaking Logins or Carts
When a WordPress site runs on Nginx, every uncached visit usually means the same work again: PHP runs, WordPress loads, and the database answers queries before a page can be…
Umair Khan •

When a WordPress site runs on Nginx, every uncached visit usually means the same work again: PHP runs, WordPress loads, and the database answers queries before a page can be sent. Nginx FastCGI cache changes that for the right kind of traffic. It stores the finished HTML output from PHP-FPM and serves repeat requests for the same anonymous page directly from Nginx, without running PHP or touching the database again.
Used carefully, nginx fastcgi cache wordpress setups can make a busy site feel calmer under load and leave PHP capacity for the work that really needs it, such as checkout, account pages, and admin work. Used carelessly, the same cache can show one visitor another visitor’s account, cart, or private content. That is why the rules for what to bypass matter more than the cache itself.
What is FastCGI cache and how does it work?
FastCGI cache is a page cache built into Nginx. In a typical WordPress stack, Nginx passes PHP requests to PHP-FPM. PHP-FPM runs WordPress, WordPress builds the page, and Nginx returns it. With FastCGI cache enabled, Nginx can keep a copy of that finished response and reuse it for later requests that match the same cache key.
The cache key is what makes one cached page different from another. It usually includes the request method, host, and request URI, and it can include other request details when needed. If the key matches and the cached copy is still valid, Nginx serves it immediately. If there is no match, or the copy has expired, the request goes to PHP-FPM as normal and the fresh response can be stored for the next visitor.
This is different from an object cache. Redis, for example, helps WordPress reuse database results and computed objects, while FastCGI cache avoids the whole page build for anonymous visitors. The two can work together, but they solve different parts of the problem. For the object-cache side, see Redis Object Cache. For a broader server view, see WordPress Server Optimization.
What must FastCGI cache never cache?
The golden rule is simple: cache only pages that look the same for every anonymous visitor. Anything personal, private, or tied to a session must bypass the cache completely. A cached copy of a logged-in page is not a performance win; it is a privacy and correctness problem.
- Logged-in users and the WordPress admin area, including wp-admin and preview pages
- Cart, checkout, and account pages on a WooCommerce store
- Pages that show a mini-cart, order details, downloads, or other account-specific content
- Form submissions, search results, and any page that changes with POST data or a query that is meant to be personal
- Pages set to no-cache by WordPress, WooCommerce, or a plugin, and any response that sets a private or no-store cache header
Nginx decides this with bypass rules, usually based on request URI, request method, and cookies. Common examples are WordPress login and comment cookies, and WooCommerce cart and session cookies. If a request carries one of those cookies, Nginx should skip both reading from the cache and writing to it. That second part matters: a logged-in visit must not overwrite an anonymous cached page with personal content.
WooCommerce needs extra care because a visitor can have items in a cart without being logged in. Cookie-based bypass rules are therefore essential, and the store’s exclusion list should be reviewed whenever a plugin adds a new account, checkout, or personalized page. The detailed exclusion approach is covered in WooCommerce Cache Exclusions.
How to set up and test FastCGI cache safely on a VPS?
Start on staging, not on a live store. Copy the working Nginx configuration first, so you can roll back by restoring that file and reloading Nginx. Only move to production after the tests below pass on staging, including a logged-in test and a cart test.

In general terms, a safe setup covers these pieces, adapted to your own server and control panel rather than copied as a finished configuration:
- Cache path and zone: define where cached files live, how large the zone can grow, and how long inactive entries are kept. Keep the path outside the web root.
- Cache key: use a key that separates anonymous pages correctly and does not collapse different pages into one entry. Check that mobile, query-string, and language variations behave as intended for your site.
- Bypass and no-cache conditions: set a bypass variable that is triggered by login and WooCommerce cookies, POST requests, admin and account URIs, and query strings that must stay dynamic. Apply it to both cache bypass and cache storage.
- Cache validity and headers: decide how long successful responses may be reused, and make sure error pages, redirects, and private responses are not stored as if they were normal pages.
- Purge method: choose how a page is cleared when content changes. This may be a cache-purge module, a plugin that talks to Nginx, or a controlled manual purge. Test that editing a post actually clears its cached copy.
Warning: treat any example configuration you find online as a starting sketch, not as copy-paste ready. Cache keys, cookie names, paths, and purge support vary by server, and a small mistake can cache private pages or break checkout. Test every change on staging first.
After each change, test the configuration before reloading Nginx. If the test reports an error, fix it before reloading; do not reload a broken configuration on a live site. Then test as two different visitors:
- In a private browser window, visit a normal post or page twice and confirm it loads as an anonymous visitor, with no account or cart content leaking in.
- Log in, visit the same page, and confirm you see your own account state and not the anonymous cached version.
- On a store, add an item to the cart, visit cart and checkout, and confirm the cart contents are correct and update when items change.
- Edit a post, purge it if your setup needs a manual purge, and confirm the updated content appears for anonymous visitors.
- Check the admin area, previews, and any form or search page, and confirm they are never served from the page cache.
If any test fails, the bypass rules are wrong or incomplete. Stop, restore the backed-up configuration, and fix the rule on staging before trying again. FastCGI cache is also only one layer: a slow server response can still come from PHP, the database, or a plugin. If response time stays high after caching is correct, investigate the underlying bottleneck, as discussed in High TTFB, and check that you are on a supported, current PHP release with Best PHP Version. For edge caching through a CDN instead of, or in addition to, server caching, compare the approach in Cloudflare APO.
What to do next
If you are unsure whether FastCGI cache is safe for your store or your membership pages, do not guess with a live configuration. Get a free speed audit from ProSpeedGuy first, so the caching rules, exclusions, and tests can be checked against your actual setup before anything is changed.
Common Questions
Frequently Asked Questions
Clear, honest answers about FastCGI cache, bypass rules, and safe testing.



Leave a Reply