"Optimizing WordPress at this level isnβt about plugins β itβs about removing bottlenecks one by one."
β οΈ Disclaimer: This repo focuses solely on the technical side β site architecture, deployment, and performance tuning skills.
- Run WordPress with Docker on a basic VPS (1vCPU, 1GB RAM)
- Serve 5000 concurrent clients/minute
- Achieve 189ms average response time
- Use only free or open-source stack (Docker, Caddy, Redis, MariaDB)
- VPS: Vultr 6$ VPS (1vCPU, 1GB RAM, 25GB SSD NVMe)
- OS: Ubuntu 22.04 LTS
- Web Server: NGINX (behind Caddy for HTTPS)
- CMS: WordPress (php8.2-fpm)
- DB: MariaDB 10.5
- Cache: Redis (Object Cache)
- SSL Proxy: Caddy (reverse proxy + HTTP/3)
- CDN: Cloudflare (free plan)
pm = dynamic
pm.max_children = 4
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_requests = 500 ; auto recycle to avoid memory leak
; increased php execution timeout
request_terminate_timeout = 30sopcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.validate_timestamps=0 ; if dont require hot reload file
opcache.revalidate_freq=60maxmemory 256mb
maxmemory-policy allkeys-lru- Redis as object cache for WordPress
- Hit rate: 99.93%
- No manual preload yet, cache populated purely through real traffic
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 5; # 1 - 9(5 for best performance)
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_types
text/plain
text/css
application/json
application/javascript
application/x-javascript
text/xml
application/xml
application/xml+rss
image/svg+xml;example.com {
reverse_proxy nginx:80 {
header_up X-Forwarded-Proto https
}
encode gzip
@static {
path_regexp \.(jpg|jpeg|png|gif|ico|css|js|woff2?|ttf|svg)$
}
header @static {
Cache-Control "public, max-age=31536000"
Expires "Sun, 31 Dec 2037 23:55:55 GMT"
}
}
- 5000 clients over 1 minute
- All requests to homepage (cached via Redis)
| Metric | Value |
|---|---|
| Avg Response Time | 189ms |
| Redis Hit Rate | 99.93% |
| Success Rate | 100% |
| Max Latency | 486ms |
| RAM Usage (peak) | ~451MB |
| CPU | 2-6% |
| Errors / Timeouts | 0 |
π Even at 5000 users/minute, no Redis or MySQL bottlenecks were observed. Cache was warmed purely by live traffic.
- Dockerized WordPress stack on 1vCPU/1GB RAM VPS
- No paid services: all open-source or free-tier
- Redis cache hit 241,595 / 179 β 99.93% hit rate
- Caddy offloaded SSL + HTTP/3
- Cloudflare added as CDN layer (compression + edge cache)
π 5000 concurrent users served in 1 minute at 187ms average, no crash, no errors. RAM used: ~431MB.
Below are key screenshots capturing performance results and system metrics during the tests.
Final round:
5,000 concurrent users Β· 187ms avg Β· 0% errors Β· 100% valid redirects
Max latency only 391ms β demonstrates steady-state performance under full load.
Real-world uncached access: 198ms avg, 0% errors Shows how the stack handles cache-warming and first-hit scenarios with zero degradation.
Score: 93/100 (Desktop) Minimal layout shift, optimized loading. cf-cache-status: HIT, HTML gzip, no render-blocking JS.
β οΈ Note: idk why Pingdom score stuck at 87/100 despite full gzip and cache header tuning β likely due to CDN location and test heuristics.
241,595 cache hits vs. 179 misses β 99.93% hit rate without preload.
RAM usage: ~431MB peak
All services stayed under control, including PHP-FPM, Redis, MariaDB
Swap barely touched, CPU stable at 2β6%
β cf-cache-status: HIT
β gzip enabled
β HTTP/3 from Caddy
TTFB under 200ms, total load <2s across 67 assets.
Modular Docker-based layout with isolated services and shared volumes.
Benchmark environment: Vultr 1vCPU / 1GB RAM VPS (Frankfurt). Stack deployed on Ubuntu 22.04 with Docker. Current cost: $0.07.*
For more screenshots of alternative configs and test iterations, browse the full /screenshots folder in the repository.
- Add FastCGI Cache (NGINX-level full page caching)
- Integrate GitHub Actions to trigger Redis preload after deploy
- Explore ESI + Edge Caching (via QUIC.cloud or Cloudflare Workers)
- Auto-monitor Redis hit rate and auto-flush if fallback detected
https://github.com/aleixnguyen-vn/docker-wordpress-performance
β±οΈ I picked up Docker at 2PM. This stack was live β and benchmarking β before midnight. π "You don't need a bigger server. You need better config."






