Goal: fast and stable WordPress on SpinupWP (Bricks + many plugins + large uploads) ✅
❓ I use SpinupWP, and it allows you to configure the following settings. Please explain these settings to me and recommend what I should set: I’ll be using BricksBuilder and a whole range of other plugins. I also want to upload large files and edit large pages (a lot of content on a single page). My goal is to achieve excellent performance and stability.
Nginx
- Client Max Body Size
- Client Body Timeout
- FastCGI Read Timeout
PHP
- Upload Max File Size
- Post Max Size
- Memory Limit
- Max Execution Time
- Max File Uploads
- Max Input Vars
- Max Input Time
- Worker Management
- Static
- Max Workers
- Max Requests
- Dynamic
- Max Workers
- Max Requests
- Start Workers
- Mind Idle Workers
- Max Idle Workers
- On-Demand
- Max Workers
- Max Requests
- Idel Worker Timeout
Goal: fast and stable WordPress on SpinupWP (Bricks + many plugins + large uploads) ✅
SpinupWP is essentially letting you tune two layers:
- Nginx (the web server): controls request size limits and how long it will wait for data.
- PHP-FPM (PHP workers): controls how much PHP can consume per request and how many requests can run concurrently.
Below is what each setting does and what I’d set as a strong default for a “performance + stability” Bricks/WordPress site that also needs large uploads and large admin edits. (You can tighten later once you know your real needs.)
Nginx settings
1) Client Max Body Size
- What it is: Maximum allowed size of an HTTP request body (uploads, big POST requests, some editor saves).
- If too low: Uploads fail with
413 Request Entity Too Large. - Trade-off: Higher values allow bigger uploads, but also increase abuse potential (someone can try to send huge bodies).
Recommendation
- Set to the largest file you realistically upload, with buffer.
- Typical “safe but flexible”: 256M
- If you truly upload big media/backups via WP: 512M (or 1G if you must)
- If you’re using direct-to-object-storage uploads (S3, etc.), you can keep it lower.
2) Client Body Timeout
- What it is: How long Nginx will wait to receive the request body from the client (e.g., slow upload connection).
- If too low: Large uploads over slow connections fail mid-way (timeout).
- Trade-off: Too high can keep connections open longer (slightly more exposure to slowloris-style behavior, though Nginx is good at handling this).
Recommendation
- 120s–300s
- Start at 300s if you regularly upload large files from typical home/office connections.
3) FastCGI Read Timeout
- What it is: How long Nginx will wait for a response from PHP (via PHP-FPM).
- If too low: Long operations (imports, image processing, complex saves) fail with
504 Gateway Timeout. - Trade-off: Too high can allow truly “stuck” PHP requests to tie up capacity longer.
Recommendation
- 120s–300s
- Start at 300s if you do imports, big edits, or heavy plugins.
- For normal sites with no long operations, you’d keep it closer to 60–120s.
PHP (runtime) settings
4) Upload Max File Size (upload_max_filesize)
- What it is: Max size for a single uploaded file handled by PHP.
- If too low: WP media uploads fail.
Recommendation
- Set based on your real uploads:
- Common: 256M
- Heavy media workflows: 512M
- Must be ≤ Post Max Size (below).
5) Post Max Size (post_max_size)
- What it is: Max size of the entire POST request (can include multiple files + form fields + editor payload).
- If too low: Uploads or large editor saves can fail even if
upload_max_filesizeis high enough.
Recommendation
- Set to a bit higher than
upload_max_filesize:- If upload is 256M → post max 300M–320M
- If upload is 512M → post max 600M–640M
6) Memory Limit (memory_limit)
- What it is: Max memory PHP can use per request (front-end requests, WP admin, WP-Cron, AJAX, builder operations).
- If too low: White screens, fatal errors, “Allowed memory size exhausted”, builder instability.
- Trade-off: Higher per-request memory means fewer concurrent requests fit in RAM (important when combined with PHP worker count).
Recommendation (Bricks + plugins + big pages)
- Start at 512M
- If you see memory-related fatals or heavy Woo/ACF/SEO stacks: 768M (or 1024M only if you truly need it and have RAM headroom)
Stability tip: it’s usually better to run fewer PHP workers with enough memory than many workers that cause swapping/oom.
7) Max Execution Time (max_execution_time)
- What it is: Max CPU time a PHP script is allowed to run.
- If too low: Imports, backups, resizing, and some builder operations can fail.
- Trade-off: Too high lets inefficient tasks run longer and hold workers.
Recommendation
- 120s–300s
- Start at 300s if you do imports/large operations.
- If you don’t, 120s is often plenty.
8) Max File Uploads (max_file_uploads)
- What it is: Max number of files that can be uploaded in one request.
- If too low: Multi-file upload UIs may fail or partially upload.
Recommendation
- 50 (safe default)
- If you never bulk upload huge batches: 20 is fine.
9) Max Input Vars (max_input_vars)
- What it is: Limits how many input fields PHP will accept (forms, page builder payloads, mega menus, complex admin screens).
- If too low: Settings don’t save completely; missing fields; builder content or meta boxes not persisting.
- Trade-off: Higher values slightly increase parsing overhead and can be abused (but typically fine behind WP auth).
Recommendation (large builder pages)
- Start at 10,000
- If you have extremely large pages / many dynamic fields: 20,000
- Avoid absurdly high numbers unless you need them.
10) Max Input Time (max_input_time)
- What it is: Time limit for PHP to parse input data (POST/GET/file uploads).
- If too low: Large POST payloads (big editor saves) can fail.
Recommendation
- 120s–300s
- Start at 300s for your use case.
PHP-FPM Worker Management (this is the big performance/stability lever)
PHP-FPM runs a pool of PHP “workers.” Each concurrent uncached request generally needs a worker. More workers = more concurrency, but also more RAM usage. Too many workers = memory pressure → swapping → slow site → crashes.
Choosing the mode: Static vs Dynamic vs On-Demand
- Static
- Always keeps exactly
Max Workersrunning. - Best for predictable, steady traffic and lowest latency.
- Can waste RAM on quiet sites.
- Always keeps exactly
- Dynamic (usually best general-purpose choice) 🌿
- Keeps a baseline and scales up/down with demand.
- Great balance of responsiveness and RAM efficiency.
- On-Demand
- Starts workers only when needed; kills them after idle timeout.
- Efficient for very low traffic.
- Slight latency spikes as workers spawn; can feel worse in WP admin if constantly cold-starting.
Recommendation
- Use Dynamic for “excellent performance + stability” on a typical production WP server.
Worker parameters (what they mean + what to set)
A) Max Workers (pm.max_children)
- What it is: Maximum number of PHP requests that can run at the same time.
- If too low: Requests queue → slow TTFB under load, admin feels laggy when multiple users.
- If too high: RAM exhaustion → swapping/oom → site instability.
How to size it (rule of thumb)
- Estimate average memory per PHP worker under your workload:
- many WP sites: 80–200MB per worker
- heavy builders/admin ops can spike higher
- Then ensure:
max_workers × (avg worker RAM)fits comfortably in available RAM after OS + Nginx + DB + caches.
Recommendation (practical starting points)
- If your server is 2GB RAM: 4–6 workers
- 4GB RAM: 6–12 workers
- 8GB RAM: 12–24 workers
- If you set
memory_limit=512M, do not assume each worker uses 512M—but plan conservatively.
B) Max Requests (pm.max_requests)
- What it is: How many requests a worker handles before it’s recycled.
- Why it matters: Mitigates memory leaks/fragmentation from plugins/themes over time.
- Trade-off: Too low = more respawns (minor overhead).
Recommendation
- 500–1000
- Start at 500 if you run lots of plugins and want stability.
- Use 1000 if everything is stable and you want slightly fewer respawns.
Dynamic mode-specific
C) Start Workers (pm.start_servers)
- What it is: Workers spawned on PHP-FPM start/reload.
- Recommendation
- Set to about 25–50% of Max Workers
- Example: max 12 → start 4–6
D) Min Idle Workers (pm.min_spare_servers)
- What it is: Minimum number of idle workers to keep ready.
- Recommendation
- About 15–30% of Max Workers
- Example: max 12 → min idle 2–4
E) Max Idle Workers (pm.max_spare_servers)
- What it is: Maximum idle workers to keep around.
- Recommendation
- About 50–70% of Max Workers
- Example: max 12 → max idle 6–8
On-Demand mode-specific
F) Idle Worker Timeout (pm.process_idle_timeout)
- What it is: How long an idle worker lives before it’s killed.
- Recommendation
- 10s–30s
- For WP admin comfort, lean 30s
- For ultra-low-traffic efficiency, 10s–15s
Suggested “strong baseline” config (most Bricks sites)
Use this as a starting point, then adjust based on real usage. 📌
Nginx
- Client Max Body Size: 512M
- Client Body Timeout: 300s
- FastCGI Read Timeout: 300s
PHP
- Upload Max File Size: 512M
- Post Max Size: 640M
- Memory Limit: 512M (go 768M if you hit memory fatals)
- Max Execution Time: 300
- Max File Uploads: 50
- Max Input Vars: 10,000 (20,000 if large builder pages still don’t save fully)
- Max Input Time: 300
PHP-FPM (Dynamic)
- Max Workers: depends on RAM:
- 4GB RAM → 10
- 8GB RAM → 18
- Max Requests: 500
- Start Workers: ~40% of max
- Min Idle Workers: ~20% of max
- Max Idle Workers: ~60% of max
Concrete examples:
- If 4GB RAM
- Max Workers: 10
- Max Requests: 500
- Start Workers: 4
- Min Idle Workers: 2
- Max Idle Workers: 6
- If 8GB RAM
- Max Workers: 18
- Max Requests: 500
- Start Workers: 6
- Min Idle Workers: 3
- Max Idle Workers: 10
Two quick guardrails (important for “stability”)
- Don’t oversubscribe workers
- If you see swapping (disk activity high, load average high, site suddenly slow), reduce Max Workers first.
- Make sure limits agree
client_max_body_size(Nginx) must be ≥post_max_size(PHP) must be ≥upload_max_filesize(PHP), otherwise you get confusing failures.
If you tell me these 4 details, I can give a precise worker count ⚙️
- Server RAM (and whether DB is on the same server)
- CPU cores
- Traffic level (avg + peak concurrent visitors)
- Whether you run WooCommerce / membership / heavy search/filter plugins
I’ll then recommend an exact Dynamic worker configuration sized to your hardware and workload.