Web Servers Explained: Apache, Nginx, and LiteSpeed — Concurrency Models and Real Hosting Stacks

Mangesh Supe, Hosting Performance Analyst

By

Founder, ThatMy.com • Independent Hosting Benchmarks • ISP & Network Infrastructure Background


Web Servers Explained: Apache, Nginx, and LiteSpeed — Concurrency Models and Real Hosting Stacks

Your hosting control panel says "Apache 2.4" or "Nginx." Most WordPress owners read that and move on. They are missing one of the most commercially important decisions in their entire stack. The web server determines whether your site can handle a thousand concurrent visitors or collapses at two hundred. It determines whether caching operates at the server level or the plugin level. It determines whether a single PHP crash takes down one site or the entire server. This is not a background detail. It is the foundation everything else runs on.

The quape.com comparison and most hosting guides describe web servers in a table and stop there. This guide explains the underlying architecture: why Nginx uses less memory than Apache under identical load, what a reverse proxy actually does at the connection level, why LiteSpeed Cache is faster than WP Rocket in a way that no configuration change can overcome, and what your hosting stack actually looks like depending on which tier you are on. Understanding this changes how you evaluate hosting providers, how you debug slow WordPress sites, and what you ask for when choosing between plans. The web hosting infrastructure guide covers the full server hardware context that these web servers run on.

Apache

Best for shared hosting compatibility. .htaccess works out of the box. Slower under high concurrency. Powers most legacy shared hosting stacks.

Nginx

Best for high-concurrency VPS and managed hosting. Event-driven, memory-efficient. Used by Cloudways, Kinsta, WP Engine. No .htaccess.

LiteSpeed

Fastest for WordPress with LiteSpeed Cache. Server-level page cache, .htaccess compatible, HTTP/3 native. Best performance per dollar on compatible hosts.

What a Web Server Actually Does (Not Just "Serves Websites")

Every explanation of web servers starts with "software that serves web content." That description is accurate in the same way that "a car moves you from place to place" is accurate. It misses everything that matters. A web server performs five distinct jobs in sequence, and each job has a different performance profile, different failure modes, and different configuration options that affect your WordPress site.

Web server request handling pipeline: connection acceptance, request parsing, static file serving, PHP execution via FastCGI, and HTTP response delivery with timing annotations
1

Connection Handling

The web server listens on port 80 (HTTP) and port 443 (HTTPS). When a visitor's browser initiates a TCP connection, the server accepts it, completes the TCP handshake, and for HTTPS, completes the TLS handshake. This is where concurrency limits come in. How many simultaneous open connections can the server manage? Apache and Nginx answer this question with completely different architectures. This is the most consequential difference between the two servers, and it is invisible to users until traffic spikes.

Network Layer
2

Request Parsing

Once the connection is established, the server reads the HTTP request: the method (GET, POST, PUT), the URL path, the HTTP version, and the request headers (Host, User-Agent, Accept-Encoding, Cookie, etc.). The server parses these headers to determine what the request is asking for and how to route it. On a server hosting 500 WordPress sites, the Host header determines which virtual host configuration applies — which document root, which PHP pool, which access rules.

Request Layer
3

Static File Serving

If the request is for a static file — an image, a CSS file, a JavaScript file, a PDF — the web server reads the file from disk and returns it directly. No PHP runs. No database is queried. Nginx is particularly fast at this step because it uses the operating system's sendfile() system call to transfer file contents from disk to the network socket entirely in kernel space, without copying data through user space. On a site where 70-80% of requests are for static assets, this matters.

Static Files
4

PHP Execution and Dynamic Request Routing

If the request is for a PHP file (or matches a rewrite rule that routes to index.php, as all WordPress requests do), the web server hands it off to PHP. The method of handoff is where Apache, Nginx, and LiteSpeed diverge significantly. Apache can run PHP as an embedded module (mod_php) or forward to PHP-FPM via FastCGI. Nginx always forwards to PHP-FPM via FastCGI or Unix socket. LiteSpeed uses its own LSAPI protocol, which is faster than FastCGI because it avoids the overhead of the CGI protocol negotiation. The PHP process executes WordPress, runs database queries, builds the HTML response, and returns it to the web server.

PHP Layer
5

Response Delivery and Reverse Proxying

The web server takes the PHP response (or the static file content) and sends it back to the visitor with appropriate HTTP headers: Content-Type, Cache-Control, Content-Encoding (if compression is enabled), and the HTTP status code. In a reverse proxy setup, an additional job exists: forwarding requests from a public-facing Nginx instance to a backend Apache or application server, then returning the backend's response to the visitor. The web server adds response headers, applies keep-alive logic, and manages the connection lifecycle for subsequent requests.

Response Layer

The One Number That Explains Server Choice

Requests per second is the headline. The number most hosting providers never show you is memory usage per concurrent connection. Apache prefork uses approximately 10-20 MB per active connection. Nginx uses approximately 1-2 MB. At 100 concurrent connections, Apache uses 1-2 GB of RAM on PHP execution alone. Nginx uses 100-200 MB. At 1,000 concurrent connections — a perfectly normal load for a medium-traffic site — Apache needs 10-20 GB just for connection handling. Nginx needs 1-2 GB. This is why shared hosting imposes strict concurrent connection limits, and why every serious managed WordPress host runs Nginx or LiteSpeed.

Apache vs Nginx vs LiteSpeed: The Three Engines That Power WordPress

These three web servers power over 75% of all websites. They share the same job — accepting HTTP requests and returning responses — but they make fundamentally different architectural choices about how to do it. Those choices produce different performance characteristics under different conditions, different compatibility requirements, and different optimization ceilings. The table below is not just a feature list. Read the implications column — that is where the practical decisions live.

Apache HTTP Server

~30% web server market share
Open source since 1995 Apache License 2.0 .htaccess native

Apache is the web server that built the modern web. The original LAMP stack (Linux, Apache, MySQL, PHP) ran — and still runs — the majority of the world's WordPress sites. Its defining feature is .htaccess: a distributed configuration system where each directory can have its own configuration file, readable by the web server on every request, without restarting the server. This is what makes shared hosting possible.

Where Apache wins: Compatibility. Every shared host supports it. Every WordPress plugin that writes to .htaccess (security plugins, cache plugins, permalink systems) works without any server configuration. The ecosystem of Apache modules (mod_rewrite, mod_security, mod_headers) is the most mature in the industry.

Where Apache struggles: Under high concurrency. Each connection requires a process or thread, and processes use 10-20 MB of RAM. A thousand concurrent visitors means Apache is holding a gigabyte of RAM just in worker processes.

Best for: Shared hosting, legacy stacks, any environment requiring .htaccess-based control panel integration

Nginx

~34% web server market share
Open source since 2004 BSD License Event-driven

Nginx (pronounced "engine-x") was built in 2004 specifically to solve Apache's concurrency problem. Its creator Igor Sysoev designed it around the C10K problem: how do you handle 10,000 simultaneous connections on a single server? The answer was an event-driven, asynchronous architecture that handles thousands of connections within a single worker process using non-blocking I/O.

Where Nginx wins: High-concurrency performance, static file serving efficiency, reverse proxy capability, and memory usage. Nginx is the standard for managed WordPress hosts and any serious VPS setup. Cloudways, Kinsta, and WP Engine all run Nginx as their primary web server.

Where Nginx struggles: No .htaccess. Every configuration change requires editing central config files with root access. This makes it incompatible with traditional shared hosting architectures.

Best for: Managed VPS, high-traffic WordPress, reverse proxy configurations, any setup with root server access

LiteSpeed

~12% market share (growing fast)
Enterprise: paid license OpenLiteSpeed: free .htaccess compatible

LiteSpeed describes itself as a "drop-in replacement for Apache" — and for shared hosting operators, that claim is accurate. LiteSpeed reads Apache configuration files, respects .htaccess, supports all Apache directives, and integrates with cPanel without changing the control panel software. A shared host can switch from Apache to LiteSpeed without touching a single customer's .htaccess file or config.

Where LiteSpeed wins: It combines Apache's .htaccess compatibility with event-driven performance similar to Nginx, then adds the LiteSpeed Cache plugin integration that operates at the server level rather than the PHP level. LiteSpeed's LSAPI PHP protocol is faster than FastCGI. Its native HTTP/3 support is the most mature of the three servers.

Where LiteSpeed struggles: Enterprise licensing costs. The open-source OpenLiteSpeed version removes some advanced features. Smaller community than Apache or Nginx for third-party tooling.

Best for: Shared hosting operators upgrading from Apache, any WordPress site using LiteSpeed Cache, performance-critical VPS setups
FeatureApacheNginxLiteSpeed
Concurrency modelProcess/thread per connection (MPM prefork or worker)Event-driven, async, non-blocking I/OEvent-driven with native PHP LSAPI (faster than FastCGI)
.htaccess supportYes — per-directory config, read on every requestNo native .htaccess; requires rewrite rules in nginx.confYes — full .htaccess compatibility, same as Apache
Static file servingGood — reads from disk, serves directlyExcellent — in-kernel sendfile(), minimal memory overheadExcellent — similar to Nginx, slightly faster on cached content
PHP execution methodmod_php (module) or PHP-FPM via proxyPHP-FPM only via FastCGI/Unix socketLSAPI (LiteSpeed API) — tighter integration than FastCGI
Memory per connection~10-20 MB per Apache process (prefork)~1-2 MB per connection (shared event loop)~1-2 MB, similar to Nginx
Config file approachDistributed .htaccess per directoryCentral nginx.conf, no per-directory overrideCentral config with full .htaccess support at server level
WordPress compatibilityExcellent — native .htaccess permalink supportExcellent — requires try_files block in configExcellent — best with LiteSpeed Cache plugin
WordPress page cachePlugin-level only (WP Rocket, W3TC)Plugin-level only or server-level with FastCGI cacheServer-level with LiteSpeed Cache plugin (fastest option)
SSL/TLS terminationYes — mod_sslYes — built-in, very efficientYes — built-in
HTTP/2 supportYes — mod_http2 (requires worker/event MPM)Yes — native, excellentYes — native, including QUIC/HTTP/3
HTTP/3 (QUIC) supportExperimental, not production-readyAvailable (quiche module), not defaultYes — native, enabled by default on many hosts
Load balancingmod_proxy_balancer (limited)Upstream module (excellent, widely used)Built-in, enterprise-grade with QoS controls
Market share (web)~30% of active sites~34% of active sites~12% of active sites (growing)
LicenseOpen source (Apache License 2.0)Open source (BSD)Enterprise (paid) / OpenLiteSpeed (free, open source)

PHP Execution Methods: The Part Most Comparisons Skip

The web server handles the HTTP layer. What PHP actually runs on, and how the web server hands off to PHP, is a separate decision that affects WordPress performance as much as the web server choice itself. There are four methods, and two of them should never appear in a production WordPress setup.

MethodHow It WorksAdvantageDisadvantage
mod_phpPHP runs as Apache module inside the Apache processFastest for single-site setups. PHP and Apache share memory.Memory leak in PHP can crash entire Apache worker. No per-user isolation.
PHP-FPM (FastCGI)PHP runs as separate process pool, connected via Unix socketProcess isolation. Each PHP-FPM pool can run as different user. Configurable pool size.Requires extra configuration. Socket communication adds marginal overhead vs mod_php.
LSAPILiteSpeed's proprietary PHP integration (LiteSpeed API)Faster than FastCGI because it reuses PHP processes more efficiently. Lower overhead.Only available on LiteSpeed web server. Not compatible with Apache or Nginx.
CGI (legacy)New PHP process spawned for every single requestComplete isolation, simple setupCatastrophically slow — one PHP process per request, no reuse. Never use on production.

The correct combination for a modern WordPress stack is: Nginx or LiteSpeed as the web server, PHP-FPM (or LSAPI for LiteSpeed) as the PHP execution method. This combination gives you event-driven connection handling at the web server layer, process isolation and pool management at the PHP layer, and no dependency between web server crashes and PHP crashes. I have seen multiple sites go down because mod_php was running on Apache and a single PHP infinite loop caused the Apache worker to hang, blocking all connections — the web server and PHP shared the same process. With PHP-FPM, PHP hanging would have killed one FPM worker and been replaced by another.

Event-Driven vs Process-Based: The Architecture That Defines Concurrency

Most hosting comparisons note that "Nginx uses less memory." Almost none explain why. The why is the most important thing to understand about web servers — because it is not a tuning difference or a configuration difference. It is a fundamental architectural choice made at design time that cannot be optimized away.

Apache vs Nginx concurrency models: Apache spawns a process per request with multiple worker processes, Nginx runs a single-threaded event loop handling thousands of connections with non-blocking I/O

Apache's Process-Based Model

Apache in prefork mode creates a new process for every incoming connection. A process is a complete copy of the Apache runtime: its own memory space, its own file descriptors, its own copy of loaded modules. When 200 visitors connect simultaneously, Apache maintains 200 processes. Each process sits in memory doing one of three things: handling an active request, waiting for a keep-alive request on an existing connection, or waiting to be assigned a new connection.

The memory cost is the first problem. The blocking behavior is the second. While a process is waiting for PHP to finish executing — which might take 300ms on a slow database query — that process is blocked. It cannot accept another connection. It cannot do anything except sit there waiting. Apache's response: increase the number of processes. More processes means more blocking capacity. But more processes means more RAM. The two problems compound each other.

Apache's worker and event MPMs improve on prefork by using threads instead of separate processes for connections. Threads within a process share memory, making each connection cheaper. But the fundamental limit remains: the concurrency ceiling is still tied to the number of threads and processes, not to the number of connections the kernel can handle.

Nginx's Event-Driven Model

Nginx runs one worker process per CPU core. That is typically 4-16 worker processes on a modern server, regardless of how many simultaneous connections are active. Each worker process runs a single-threaded event loop that uses the Linux kernel's epoll mechanism to monitor thousands of open file descriptors (connections) simultaneously.

Here is the critical difference: when Nginx is waiting for PHP-FPM to finish processing — those same 300ms the Apache process is blocked — Nginx's event loop is not blocked. It loops back and checks if any other connection has data ready to read or write. A single Nginx worker can be managing 10,000 keep-alive connections while also forwarding 100 PHP requests to PHP-FPM and simultaneously serving static files from 500 ongoing downloads. None of these operations block the others because all I/O is non-blocking: Nginx registers interest in the file descriptor and continues to the next event, returning to that file descriptor when the kernel signals it has data.

Apache Prefork Under Load
Worker 1 PHP wait
Worker 2 PHP wait
Worker 3 DB query
Worker 4 PHP wait
Worker 5 Idle
Worker 6 Idle
100 simultaneous connections: ~1-2 GB RAM
New connections queue when all workers are busy
Nginx Event Loop Under Load
Worker Process (single event loop)
Static file → PHP forward → Keep-alive → Static file → PHP return ←
100 simultaneous connections: ~100-200 MB RAM
10,000+ connections possible without additional workers

What This Means in Practice for WordPress

For a WordPress blog that handles 50 concurrent visitors on a good shared hosting plan, the concurrency model difference is invisible. Both Apache and Nginx serve the traffic comfortably. The difference emerges under three conditions: traffic spikes, slow PHP execution, and keep-alive connections from modern browsers.

A news site that gets linked on a major social platform goes from 50 to 2,000 concurrent visitors in 90 seconds. Apache spawns processes until it hits MaxRequestWorkers, then new connections queue and wait for a worker to free up. Response times degrade from 200ms to 8 seconds as the queue grows. Nginx's event loop continues handling 2,000+ connections within the same workers it was using at 50 concurrent visitors. The bottleneck shifts to PHP-FPM pool size and database capacity — not the web server. Understanding which layer is the actual bottleneck is the entire point of knowing the hosting infrastructure at this level of detail.

Reverse Proxy Architecture: Why the Fastest Stacks Use Two Web Servers

The highest-performing WordPress hosting stacks do not choose between Apache and Nginx. They run both. Nginx in front handles connections, static files, SSL termination, and load balancing. Apache in the backend handles PHP via mod_php or PHP-FPM, .htaccess processing, and application logic. Each server does what it is best at. This is the reverse proxy architecture, and once you understand it, every other web server setup looks like a compromise.

Nginx reverse proxy architecture: Nginx accepts all connections, routes static file requests directly to disk, forwards PHP requests to Apache backend on port 8080
Visitor Browser

Connects to server IP on port 443. Sees only Nginx's public address. Has no knowledge of Apache or the internal port.

→
Nginx (Port 443 / 80)

SSL termination. Static file serving. Cache hit detection. Load balancing across multiple backends. Forwards PHP requests to backend.

Static Files

Served directly from disk by Nginx. Apache never involved. Response in 5-15ms.

PHP Requests

Forwarded to Apache on internal port 8080. Nginx passes headers including visitor IP via X-Forwarded-For.

↓ (PHP path only)
Apache (Port 8080, internal only)

.htaccess processing. mod_rewrite. PHP-FPM via FastCGI. Returns HTML response to Nginx.

→
Response to Browser

Nginx sends Apache's PHP response back to the visitor with additional headers (compression, cache control, security headers).

Static File Offloading

Static file offloading is the most immediately impactful benefit of the reverse proxy setup. In a pure Apache setup, every request — including a request for a 5KB CSS file — goes through an Apache process. In a reverse proxy setup, Nginx handles static file requests entirely, never touching the Apache backend. Nginx's static file serving with sendfile() is extremely fast and extremely cheap in terms of server resources. The Apache backend only sees PHP requests.

I have seen this change measured in practice: a WordPress site that was spending 40% of Apache's worker capacity serving static files (images, CSS, JS) moved to an Nginx-in-front configuration. Immediately, Apache's MaxRequestWorkers utilization dropped by 40% under identical traffic. The same hardware handled significantly more concurrent PHP requests because Apache workers were no longer occupied serving static files.

Load Balancing

In an Nginx reverse proxy setup, the upstream configuration block becomes a load balancer with one additional line:

Nginx upstream load balancing configuration:
upstream wordpress_backend {
    # Default: round-robin distribution
    server 10.0.0.1:80 weight=3;   # App server 1 (3x traffic share)
    server 10.0.0.2:80 weight=1;   # App server 2 (1x traffic share)
    server 10.0.0.3:80 backup;     # Failover only — used when 1 and 2 are down

    # Least-connections algorithm (better for PHP with variable response times)
    least_conn;

    # Keepalive connections to backend (reduces connection overhead)
    keepalive 32;
}

server {
    listen 443 ssl;
    location / {
        proxy_pass http://wordpress_backend;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
    }
}

This configuration scales WordPress horizontally. Add a third application server and update the upstream block — no changes to PHP, no changes to WordPress, no changes to the database configuration. Cloudways uses this exact architecture on its managed WordPress plans. ScalaHosting's high-tier managed VPS plans offer similar configurations on request. Understanding this architecture tells you exactly what you are paying for when a managed host charges premium prices: it is this infrastructure, configured and maintained for you.

Nginx FastCGI Cache as a Reverse Proxy for PHP

Nginx can also act as a reverse proxy for PHP-FPM in a single-server configuration, adding a page cache layer entirely outside WordPress:

Nginx FastCGI cache configuration for WordPress:
# Define cache storage location and size
fastcgi_cache_path /var/run/nginx-cache levels=1:2
    keys_zone=WORDPRESS:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";

server {
    location ~ \.php$ {
        # Try cache first
        fastcgi_cache WORDPRESS;
        fastcgi_cache_valid 200 60m;
        fastcgi_cache_bypass $skip_cache;
        fastcgi_no_cache $skip_cache;
        add_header X-Cache $upstream_cache_status;

        # Forward to PHP-FPM
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        include fastcgi_params;
    }
}

# Skip cache for logged-in users and WooCommerce sessions
map $http_cookie $skip_cache {
    default 0;
    "~*wordpress_logged_in" 1;
    "~*woocommerce_cart_hash" 1;
    "~*wp-postpass" 1;
}

The X-Cache header this configuration adds tells you whether any request is served from Nginx's cache (HIT) or from PHP-FPM (MISS). This is a no-plugin page cache that operates at a lower level than any WordPress cache plugin. The tradeoff compared to plugins like WP Rocket: cache invalidation requires either a server-side script or a plugin like Nginx Helper to trigger purge on WordPress publish events. The caching guide covers how this server-level cache integrates with the full six-layer cache stack.

HTTP/2 and HTTP/3: What Changed and Why Your Server Version Matters

HTTP/1.1 has been the web's protocol since 1997. HTTP/2 shipped in 2015. HTTP/3 is in production deployment now. Most hosting discussions treat these as background checkbox items — "supports HTTP/2: yes." They are not background items. HTTP/2 changed the entire optimization strategy for web performance, and HTTP/3 changes it again. If you are still domain-sharding assets or running JavaScript bundlers to reduce request count specifically because of HTTP/1.1 limits, you have already optimized for the wrong protocol.

HTTP/1.1 vs HTTP/2: HTTP/1.1 serial request waterfall with head-of-line blocking versus HTTP/2 multiplexed streams over a single TCP connection
FeatureHTTP/1.1HTTP/2Practical Impact
Head-of-line blockingOne slow resource blocks all subsequent requests on that connectionMultiple streams — slow resource does not block othersHTTP/2 wins on any page with 10+ assets
Connection countBrowsers open 6 connections per origin to work around serial limitsOne connection per origin, unlimited multiplexed streamsFewer connections = lower server overhead
Header compressionHeaders sent uncompressed on every request (repeated cookies, user-agent)HPACK compression — duplicate headers sent onceMeaningful savings on cookie-heavy WordPress sites
Server pushNot availableServer can push assets before browser requests themPush is rarely used correctly in practice — benefits are marginal
TLS requirementHTTP/1.1 works without TLSAll browsers require HTTPS for HTTP/2 in practiceHTTP/2 effectively requires an SSL certificate
WordPress load time impactBaseline — domain sharding sometimes used to work around limits15-30% faster for first-page load on asset-heavy sitesImpact higher on sites with many small files (plugins, scripts)

Why HTTP/1.1 Forced Bad Optimization Practices

HTTP/1.1 allows one outstanding request per connection. Browsers work around this by opening up to 6 connections per domain. A page with 30 assets sends them in batches of 6, with each batch waiting for the previous batch to complete. Developers responded by inventing practices that no longer make sense under HTTP/2: bundling many JavaScript files into one (fewer requests), spriting CSS images into a single image file (one request instead of 40), domain sharding assets across cdn1.example.com and cdn2.example.com (12 connections instead of 6). Under HTTP/2, all of these optimizations are unnecessary and some are counterproductive. HTTP/2's multiplexing sends all 30 assets simultaneously over a single connection. Bundling creates large files with lower cache granularity — one change to any JavaScript module invalidates the entire bundle.

HTTP/2 Server Requirements

HTTP/2 requires HTTPS in practice (all browsers enforce this). For Apache, HTTP/2 requires the event MPM — which means mod_php is incompatible with HTTP/2 (mod_php requires the prefork MPM). Many legacy shared hosts running Apache with mod_php are therefore still serving HTTP/1.1 to every visitor. Verifying your protocol: open Chrome DevTools, go to Network tab, right-click the column headers, enable "Protocol." Every request should show h2 (HTTP/2) or h3 (HTTP/3). A request showing http/1.1 means either your server or the connection between a reverse proxy and your origin is still using HTTP/1.1.

HTTP/3 and QUIC: What Changes at the Transport Layer

HTTP/2 solved head-of-line blocking at the HTTP layer, but TCP itself still has head-of-line blocking. A single lost TCP packet stalls all HTTP/2 streams on that connection until retransmission. On a reliable wired connection this is rare. On mobile networks and congested Wi-Fi — which represent the majority of global traffic — packet loss is common. HTTP/3 replaces TCP with QUIC, a UDP-based protocol where each stream is independent at the transport layer. A lost packet for stream 5 does not stall streams 1-4 and 6-30. The practical result: HTTP/3 loads pages measurably faster on mobile networks and shows the largest improvements in regions with infrastructure limitations.

LiteSpeed natively supports HTTP/3 and enables it automatically. Cloudflare delivers HTTP/3 to visitors regardless of your origin server's protocol, because the protocol negotiation happens at the Cloudflare edge. This is one of the less-discussed advantages of putting Cloudflare in front of any WordPress site: even a site on a legacy Apache shared host running HTTP/1.1 at the origin level delivers HTTP/3 to browsers, because Cloudflare handles the modern protocol at the edge and communicates with your origin via HTTP/2 or HTTP/1.1 as appropriate. The CDN guide explains how Cloudflare's edge protocol handling differs from what your origin server delivers.

The LiteSpeed Cache Advantage: Server-Level Integration No Plugin Can Match

LiteSpeed Cache is the best free WordPress caching plugin. It is also a statement that requires qualification: LiteSpeed Cache is the best plugin on LiteSpeed web servers. On Apache or Nginx, most of its key features are disabled. The reason reveals something fundamental about how server-level caching works versus plugin-level caching — and why the two are not interchangeable.

Server-Level vs Plugin-Level Cache: The Architecture Difference

WP Rocket, W3 Total Cache, and most cache plugins operate at the PHP level. When a page request arrives, the web server passes it to PHP-FPM. PHP boots, loads WordPress, and runs the advanced-cache.php dropin — a hook that intercepts the request early in the WordPress bootstrap process. If a cached version exists, the dropin returns it immediately and WordPress stops loading. This is fast — the cache hit takes 5-15ms of PHP execution time and no database queries — but PHP still started, loaded, and ran code.

LiteSpeed Cache, when running on LiteSpeed web server, operates at the server level. The cached page is served by the web server directly, before PHP starts at all. The cache hit happens at the same layer as a static file: the web server reads the cached HTML from its internal cache store and returns it. PHP is never invoked. The speed difference is measurable: server-level cache hits typically complete in 1-5ms. Plugin-level cache hits take 10-30ms. For a high-traffic site, this difference compounds across thousands of requests per minute.

Plugin-Level Cache (WP Rocket, W3TC)

  1. Request arrives at web server
  2. Web server passes to PHP-FPM
  3. PHP process starts (5-10ms)
  4. WordPress core loads
  5. advanced-cache.php dropin runs
  6. Cache lookup (disk read)
  7. Cache HIT: return cached HTML (10-30ms total)
  8. Cache MISS: continue full WordPress load

Server-Level Cache (LiteSpeed Cache)

  1. Request arrives at LiteSpeed server
  2. LiteSpeed cache lookup (built into server)
  3. Cache HIT: return cached HTML (1-5ms total)
  4. PHP never started
  5. WordPress never loaded
  6. Cache MISS: pass to PHP-FPM
  7. Normal WordPress execution

What LiteSpeed Cache Does That Nginx Cannot Do Automatically

Nginx FastCGI cache is also a server-level page cache, and it achieves similar performance to LiteSpeed Cache for simple cache hits. The difference is in cache management and WordPress integration. LiteSpeed Cache's plugin communicates directly with the LiteSpeed server via a shared-memory control channel to invalidate specific cache entries. When you publish a new post in WordPress, the plugin tells the server: purge the cached version of this URL, the homepage, and the category page that includes this post. This targeted purge happens in milliseconds, at the server level, without needing a separate cache-purging script or webhook.

With Nginx FastCGI cache, you need either the Nginx Helper plugin (which triggers a Nginx purge endpoint on WordPress events) or a custom bash script to handle invalidation. LiteSpeed Cache's integration is tighter and more reliable in practice, especially for WooCommerce stores where product page invalidation needs to trigger precisely when prices or inventory change.

LiteSpeed Cache Features Beyond Page Cache

Page cache is LiteSpeed Cache's flagship feature, but the plugin also includes: object cache via Redis or Memcached integration, image optimization (WebP conversion, lazy loading), CSS/JS minification and combination, critical CSS generation, browser cache header management, and CDN configuration. These features work on any web server. The object cache, CDN, and image optimization work on Apache and Nginx installations of LiteSpeed Cache. Only the page cache and LSAPI PHP integration require LiteSpeed web server. For a comprehensive look at how LiteSpeed Cache fits into the full caching stack, the WordPress caching guide breaks down all six cache layers and where LiteSpeed Cache addresses each.

Which Hosts Run LiteSpeed

LiteSpeed Enterprise requires a paid license from LiteSpeed Technologies. Hosting providers pay this license and pass the benefit to customers. The hosts most commonly associated with LiteSpeed shared hosting: A2 Hosting's Turbo plans, Hostinger on some plans, FastComet, NameHero, and Ultahost. On the VPS side, any host that lets you install OpenLiteSpeed on a self-managed VPS gives you LiteSpeed's performance at zero additional cost. ScalaHosting offers LiteSpeed on their managed VPS plans alongside Nginx and Apache options.

Real Hosting Stack Examples: Shared, Managed VPS, and Enterprise

The web server is one component of a hosting stack. Knowing the web server alone does not tell you how your WordPress site performs. Performance depends on the full stack: what sits in front of the web server, how PHP connects to the web server, how the database is configured, what caching layers exist, and what the hardware underneath everything looks like. Here is what the stack actually looks like at three distinct hosting tiers.

Three WordPress hosting stack architectures: shared hosting with Apache and cPanel, managed VPS with Nginx plus PHP-FPM plus Redis, enterprise stack with load balancer plus multiple Nginx nodes and dedicated database
Shared Hosting $3-15/mo
Network / DDoS Basic datacenter-level protection. No application-level WAF.
Web Server Apache 2.4 or LiteSpeed (if host upgraded). cPanel integration via .htaccess.
PHP Execution mod_php (legacy) or PHP-FPM with suEXEC. Typically PHP 8.1 or 8.2. Pool shared across hundreds of sites.
Database MySQL on same physical server. Shared with hundreds of other databases. InnoDB buffer pool split across all tenants.
Caching Plugin-level only (WP Rocket, WP Super Cache). No Redis. No server-level page cache unless LiteSpeed.
Storage Shared SSD or HDD depending on host. I/O shared across all tenants. inode limits apply.
Concurrent visitors before degradation: 50-200
TTFB range: 200ms-2000ms (highly variable under neighbor load)
Best for: New sites, low-traffic blogs, development environments
Managed VPS / Cloud WordPress $30-100/mo
Network / CDN Cloudflare or provider CDN. DDoS protection at network edge. Some hosts provide WAF.
Web Server Nginx (Cloudways, Kinsta, ScalaHosting) or LiteSpeed (some providers). Event-driven, properly tuned.
PHP Execution PHP-FPM with dedicated pool per site. PHP 8.2/8.3 available. Pool size configurable. Per-site isolation.
Database MySQL or MariaDB on same VPS or separate instance (Cloudways). Dedicated InnoDB buffer pool. Properly sized for workload.
Caching Redis object cache included. Nginx FastCGI cache or LiteSpeed page cache. Cloudways uses Varnish + Nginx stack.
Storage Dedicated SSD allocation. NVMe on most modern providers. I/O not shared with other tenants.
Concurrent visitors before degradation: 500-5,000 (VPS size dependent)
TTFB range: 50-300ms (consistent, not affected by neighbors)
Examples: ScalaHosting Managed VPS, Cloudways, Kinsta, WP Engine
Enterprise / High-Traffic $500+/mo
CDN + WAF Edge Cloudflare Enterprise or Fastly. Full-page edge caching. Enterprise DDoS mitigation. Bot management.
Load Balancer Nginx or cloud load balancer distributing across multiple app servers. Health checks, weighted routing, SSL termination.
App Servers (multiple) 2-N identical servers each running Nginx + PHP-FPM. Stateless — session data in Redis, no local state.
Database Cluster Primary MySQL server with read replicas. WordPress reads routed to replicas. Writes go to primary. Or Percona XtraDB Cluster for multi-primary writes.
Distributed Cache Redis Sentinel or Redis Cluster. Shared across all app servers. Persistent object cache survives individual server restarts.
Shared Storage NFS or object storage (S3) for wp-content/uploads. Allows multiple app servers to serve the same media files.
Concurrent visitors: Scales horizontally — add app servers as needed
TTFB range: 10-50ms (served from CDN edge cache), 50-150ms (origin)
Examples: WordPress VIP, WP Engine Enterprise, custom cloud builds
ComponentShared HostingManaged VPSEnterprise
Web serverApache 2.4 (usually)Nginx or LiteSpeedNginx (load balancer) + Nginx/Apache (app nodes)
PHP executionmod_php or PHP-FPMPHP-FPM with dedicated pool per sitePHP-FPM with autoscaling pools across app nodes
DatabaseShared MySQL on same physical serverMySQL/MariaDB on same VPS or separate instanceDedicated database server, often MySQL cluster or Percona XtraDB
Object cacheUsually none (shared host constraint)Redis on same VPS or managed RedisDedicated Redis cluster with sentinel or clustering
Page cachePlugin-level only (WP Rocket, etc.)Plugin-level, or Nginx FastCGI cache, or LiteSpeed CacheNginx full-page cache at load balancer, CDN in front
Static filesServed by Apache from same processNginx static serving (sendfile) with long cache headersCDN (Cloudflare, AWS CloudFront) — origin offloaded
SSL terminationApache mod_ssl or hosting panel certNginx SSL termination (Let's Encrypt or paid cert)Load balancer SSL termination — all internal traffic HTTP
Concurrent visitors (approx)50-200 before degradation500-5,000 depending on PHP pool sizeScales horizontally — limited by database and cache capacity
ExamplesBluehost shared, HostGator shared, GoDaddy sharedScalaHosting VPS, Cloudways, Kinsta, WP EngineWP Engine Enterprise, VIP Go, custom cloud setups

The gap between shared hosting and managed VPS is not primarily about hardware quality — both run on similar data center infrastructure. The gap is architectural. Shared hosting runs one web server process for hundreds of sites with no isolation between them. Managed VPS runs a dedicated PHP-FPM pool, dedicated Redis, and properly tuned MySQL for your site alone. This architectural difference is why a site running on ScalaHosting's $30/month managed VPS consistently outperforms the same site on a $15/month shared plan with nominally more disk space and bandwidth. The managed VPS guide explains exactly what "managed" means in practice and what you are paying for beyond the server hardware itself.

Web Server Configuration That Affects WordPress Speed

The choice of web server is a decision you make once. Configuration is ongoing. Most WordPress performance problems I have traced in practice were not the web server software being wrong — they were the default configuration being unsuitable for the actual workload. Default configurations are tuned for a generic setup, not for a WordPress site with 20 plugins, a WooCommerce store, and 500 concurrent visitors.

SettingServer(s)What It ControlsWordPress Impact
keepalive_timeoutApache / Nginx / LiteSpeedHow long idle connections stay openToo low: extra TCP handshakes per resource. Too high: server holds open connections doing nothing. 15-30s is correct for most WordPress sites.
worker_processes / MaxRequestWorkersNginx / ApacheNumber of worker processes or max concurrent connectionsNginx: set to number of CPU cores. Apache: set MaxRequestWorkers to (RAM - 256MB overhead) / memory-per-worker. Undersetting causes 503s under load.
php-fpm pool pm.max_childrenPHP-FPM (all servers)Max simultaneous PHP processesToo low: requests queue and TTFB spikes. Too high: server runs out of RAM. Formula: available_RAM / avg_PHP_process_size (typically 40-80MB).
gzip / brotli compressionAll serversCompress text responses before sendingEnabling gzip on CSS, HTML, JS reduces transfer size 60-80%. Brotli compresses 10-25% better than gzip. Always enable on production.
client_max_body_sizeNginxMaximum request body sizeWordPress default upload limit is controlled here. Set to 64M or higher to avoid 413 errors when uploading media. Apache uses LimitRequestBody.
fastcgi_cache / proxy_cacheNginxServer-level page cache for PHP responsesNginx FastCGI cache is a no-plugin page cache. Cache hit serves static files from disk. Requires manual cache invalidation logic or a WordPress plugin to trigger purge.
open_file_cacheNginxCache file descriptors and stat() results in memoryEliminates repeated filesystem calls for frequently accessed static files. Enable on sites with high static asset traffic.
access_log offAll serversDisable per-request access loggingOn high-traffic production servers, access logging to disk creates measurable I/O overhead. Disable or use buffered logging.

The PHP-FPM Pool Sizing Formula

The most common performance failure I have encountered on VPS setups is an undersized PHP-FPM pool. The default pm.max_children = 5 means only 5 PHP requests can execute simultaneously. On a site with any real traffic, this creates a queue. Requests wait in the queue until a PHP-FPM worker frees up. TTFB spikes from 200ms to 3+ seconds during any traffic burst, not because the server is overloaded, but because the PHP queue is full. The fix:

PHP-FPM pool sizing for WordPress — calculate and configure:
# Step 1: Measure average PHP process memory on your server
# Run this after your site has been under normal traffic for 30+ minutes:
ps aux | grep php-fpm | awk '{print $6}' | sort -n | tail -10

# Typical results: 40-80 MB per PHP process for WordPress
# Higher for WooCommerce (60-120 MB) or heavy plugins

# Step 2: Calculate max_children
# Formula: max_children = (available_RAM_for_PHP) / (average_PHP_process_MB)
# Example: 2GB VPS, 512MB for OS/web server/Redis, leaves 1.5GB for PHP
# average PHP process = 60 MB
# max_children = 1500 / 60 = 25

# Step 3: Configure in /etc/php/8.2/fpm/pool.d/www.conf
pm = dynamic
pm.max_children = 25       # Maximum PHP workers
pm.start_servers = 5       # Start with 5 workers
pm.min_spare_servers = 3   # Keep at least 3 idle workers ready
pm.max_spare_servers = 10  # Don't keep more than 10 idle workers
pm.max_requests = 500      # Recycle workers after 500 requests (prevents memory leaks)
pm.process_idle_timeout = 10s

# Step 4: Verify the change took effect
systemctl reload php8.2-fpm
# Check active workers:
ps aux | grep -c php-fpm

Gzip and Brotli Compression

Text compression is the highest-impact, zero-risk configuration change for most WordPress setups. Enabling gzip on HTML, CSS, JavaScript, and XML responses reduces transfer size by 60-80%. Most servers have gzip available but disabled or misconfigured. Brotli is a newer compression algorithm that achieves 10-25% better compression than gzip at equivalent CPU cost. Nginx requires the ngx_brotli module (not in default builds). LiteSpeed includes brotli natively. Apache uses mod_brotli.

Nginx gzip and brotli configuration:
# Enable gzip (available in default Nginx)
gzip on;
gzip_types
    text/html text/plain text/css
    application/javascript application/json
    application/xml text/xml
    font/woff2;
gzip_min_length 1024;    # Do not compress files smaller than 1KB
gzip_comp_level 6;       # Level 1-9. Level 6 is the best CPU/compression tradeoff.
gzip_vary on;            # Add Vary: Accept-Encoding header

# Verify compression is working:
curl -sI --compressed https://yourdomain.com/ | grep -i content-encoding
# Expected: content-encoding: gzip (or br for brotli)

How to Choose the Right Web Server for Your WordPress Site

The honest answer for most WordPress owners: you do not choose your web server. Your host does. The decision is made when you choose a hosting provider. So the real question is: given that different hosts run different web servers, which host-and-server combination is right for your situation?

Starting a new site or low-traffic blog

Shared hosting with Apache or LiteSpeed is fine. The web server choice matters only when concurrency is high. Under 100 simultaneous visitors, Apache on shared hosting delivers acceptable performance with proper caching configured. LiteSpeed shared hosting (A2 Hosting Turbo, FastComet) gives you a meaningful advantage if you install the LiteSpeed Cache plugin — you get server-level page caching at shared hosting prices.

Recommended: Any shared host with LiteSpeed, or any managed WordPress host at entry level. Enable a cache plugin. Do not over-engineer at this stage.

Growing site with consistent traffic or WooCommerce

Move to a managed VPS or managed cloud WordPress host. You need dedicated PHP-FPM pools, Redis object cache, and a properly tuned database. Nginx is the standard for this tier. ScalaHosting and Cloudways both run Nginx and include Redis on their plans. Cloudways uses a Nginx + Varnish + Apache architecture that handles both static efficiency and .htaccess compatibility.

Recommended: ScalaHosting managed VPS (first choice) or Cloudways (second choice). Both provide the infrastructure listed here without requiring you to configure it yourself.

High-traffic site or site requiring horizontal scaling

You need a host that provides a managed Nginx cluster with load balancing, auto-scaling, and a distributed cache layer. At this level, the web server choice is Nginx and the question shifts to which managed service handles the operational overhead. WordPress VIP, WP Engine Enterprise, and custom cloud deployments on AWS or GCP are the options.

Recommended: Evaluate based on support quality and specific SLA requirements, not server software. They all use Nginx at this level.

Self-managed VPS where you choose the server

If you are managing a VPS yourself and can choose, the decision is between Nginx + PHP-FPM and OpenLiteSpeed + LiteSpeed Cache. Both are free. Nginx has a larger community, more documentation, and more third-party tooling. OpenLiteSpeed with LiteSpeed Cache is faster for cached WordPress pages and easier to configure if you are using a WordPress-specific control panel like CyberPanel. For a developer comfortable with server administration, Nginx is the safer choice for long-term maintainability.

Checking Your Current Web Server

Diagnose your current web server from the command line:
# Method 1: Check HTTP response header
curl -sI https://yourdomain.com | grep -i "^server:"
# Examples:
# Server: Apache     — Apache web server
# Server: nginx      — Nginx web server
# Server: LiteSpeed  — LiteSpeed Enterprise
# Server: cloudflare — Cloudflare proxy (origin server hidden)

# Method 2: If behind Cloudflare, check via direct IP
# Get your origin IP from hosting panel, then:
curl -sI --resolve "yourdomain.com:443:YOUR.ORIGIN.IP" https://yourdomain.com \
  | grep -i "^server:"

# Method 3: From within WordPress via WP-CLI
wp eval 'echo $_SERVER["SERVER_SOFTWARE"];'

# Method 4: PHP phpinfo check
# Create test.php with: 

Web Server Myths Debunked

The web server layer attracts confident-sounding claims that range from oversimplified to actively wrong. These are the ones I encounter most often when reviewing hosting setups and performance audits.

Myth: Nginx is always faster than Apache.

False for low concurrency, true for high concurrency.

For a site with 20 simultaneous visitors, Apache and Nginx deliver nearly identical response times. The performance difference is a function of concurrency — how many connections must be handled simultaneously. Under 50 concurrent visitors, both servers complete requests in similar time. Over 500 concurrent visitors, Nginx uses a fraction of Apache's RAM and degrades gracefully. "Nginx is faster" is only accurate above a concurrency threshold that most shared hosting sites never reach. The correct statement is: Nginx scales better under high concurrency with less memory per connection.

Myth: You can run LiteSpeed Cache on Nginx and get the same performance.

False. The server-level page cache is disabled on Nginx.

LiteSpeed Cache's most important feature — server-level page cache that bypasses PHP entirely — requires LiteSpeed web server. On Nginx, LiteSpeed Cache falls back to plugin-level operation: PHP still boots, loads WordPress, checks the cache dropin, and returns the cached response. This is similar performance to WP Rocket. LiteSpeed Cache's page optimization, image optimization, and CDN features still work on Nginx, but the core performance advantage is gone. If your host runs Nginx, install WP Rocket or FlyingPress instead.

Myth: Apache is outdated and should not be used for WordPress.

False. Apache is appropriate for many WordPress deployments.

Apache's event MPM with PHP-FPM handles high concurrency efficiently. It supports HTTP/2. It supports Brotli. The "Apache is slow" characterization applies specifically to the prefork MPM with mod_php — a combination that is genuinely outdated. A modern Apache configuration with event MPM, PHP-FPM, and HTTP/2 is competitive with Nginx for most WordPress workloads under a few thousand concurrent visitors. The reason to prefer Nginx is not that Apache cannot be configured well, but that Nginx defaults are better tuned for modern workloads out of the box.

Myth: More web server workers always means better performance.

False past the memory ceiling.

Increasing MaxRequestWorkers in Apache or pm.max_children in PHP-FPM improves performance until you run out of RAM. After that, the system starts swapping memory to disk. Disk I/O is orders of magnitude slower than RAM. A server thrashing swap handles fewer requests per second than the same server at 90% memory utilization without swap. The correct approach: set max_children to the formula I describe in the configuration section, monitor swap usage, and upgrade RAM if the server is consistently at 90%+ utilization. Adding workers beyond what your RAM supports makes performance worse, not better.

Myth: The web server handles SSL certificate management.

Partly true, but conflates the issue.

The web server handles SSL termination: it is the software that reads the certificate, performs the TLS handshake, and decrypts incoming requests. But the web server does not issue, validate, or renew certificates. Certificate lifecycle is managed by Certbot (Let's Encrypt automation), the hosting control panel, or a CDN like Cloudflare. On a Cloudflare-proxied site, the TLS handshake actually happens at the Cloudflare edge — the web server on your origin handles a separate TLS connection from Cloudflare to your server. Two separate TLS sessions, two separate certificates. The SSL certificates guide covers the full certificate lifecycle and how Cloudflare's edge certificates differ from origin certificates.

Where to Go Next

The web server is the entry point for every request your WordPress site receives. What happens next depends on the layers underneath it. The WordPress caching guide covers how the page cache, object cache, and PHP OPcache layers interact with the web server — and specifically how LiteSpeed Cache's server-level integration differs from every other cache plugin. The TTFB guide breaks down the milliseconds after the web server receives a request: how PHP execution time, database query time, and PHP-FPM pool configuration each contribute to the number Google measures as your server response time. For the database layer that PHP executes against on every cache miss, the database optimization guide covers MySQL configuration, query optimization, and when Redis object cache eliminates the need for repeated database queries entirely. If you are choosing between managed hosting providers and want to understand what the "managed" part means for Nginx configuration and PHP-FPM tuning, the managed VPS guide explains precisely what providers like ScalaHosting and Cloudways configure on your behalf.

Web Server FAQ

Which web server is fastest for WordPress?

LiteSpeed is technically the fastest web server for WordPress when combined with the LiteSpeed Cache plugin. LiteSpeed's LSAPI PHP integration is more efficient than Nginx's FastCGI, and LiteSpeed Cache operates at the server level rather than the PHP level — meaning cached pages bypass PHP entirely without needing a separate caching layer. Nginx is a close second and is the most widely used high-performance option on managed WordPress hosts. Apache is slower than both under high concurrency because of its process-per-connection model, but for sites under a few hundred simultaneous visitors, the real-world performance difference is not significant. The host's hardware, PHP version, and database configuration matter more than the web server choice for most WordPress sites.

Does Apache support .htaccess and does Nginx?

Apache supports .htaccess natively. WordPress uses .htaccess extensively for permalink routing: when you set a custom permalink structure (like /%postname%/), WordPress writes rewrite rules to .htaccess that tell Apache how to route requests to index.php. This works on Apache without any additional server configuration. Nginx does not support .htaccess at all. On Nginx, the equivalent WordPress permalink support requires a try_files block in the server block configuration: try_files $uri $uri/ /index.php?$args; This single line handles WordPress routing, but it requires server-level config access — you cannot set it from within WordPress itself. This is why WordPress on shared hosting almost always runs on Apache: the host does not give users server config access, but everyone can write .htaccess files.

What is PHP-FPM and why do all modern hosting stacks use it?

PHP-FPM (FastCGI Process Manager) is a PHP process manager that runs separately from the web server. Instead of PHP running as a module inside Apache (mod_php), PHP-FPM maintains a pool of PHP worker processes. The web server forwards PHP requests to PHP-FPM via a Unix socket or TCP port. PHP-FPM processes the request and returns the output. The advantages over mod_php are significant: each site on the server can have its own PHP-FPM pool running as a different system user (security isolation), the PHP pool size can be configured independently of the web server's connection limit, PHP crashes or memory leaks do not affect the web server process, and you can run multiple PHP versions simultaneously — one pool for PHP 8.1, another for PHP 8.2. Every modern WordPress host uses PHP-FPM. The only hosts still using mod_php are legacy shared hosts that have not updated their stack.

What is the difference between Apache prefork and worker MPM?

Apache has multiple concurrency models called MPMs (Multi-Processing Modules). Prefork MPM: each connection gets a separate process. One Apache process handles exactly one connection at a time. If 200 connections arrive simultaneously, Apache spawns 200 processes. Simple and compatible with mod_php, but RAM-heavy (each process is 10-20MB). Worker MPM: uses a combination of processes and threads. Multiple threads within each process handle connections. More memory-efficient than prefork. Required for mod_http2. Incompatible with mod_php (which is not thread-safe). Event MPM: an evolution of worker that handles keep-alive connections asynchronously. Allows fewer threads to handle more connections. Required for HTTP/2. The practical implication: if you are using mod_php with Apache, you are limited to prefork MPM and therefore locked out of HTTP/2. Modern shared hosts using Apache with PHP-FPM (instead of mod_php) can run event MPM and therefore support HTTP/2.

What is a reverse proxy and how does Nginx in front of Apache work?

A reverse proxy is a server that accepts incoming requests on behalf of one or more backend servers. In the Nginx-in-front-of-Apache configuration: Nginx listens on port 80 and 443 (the public ports). Static file requests (images, CSS, JS) are served directly by Nginx from disk without touching Apache. PHP requests are forwarded by Nginx to Apache, which listens on an internal port (typically 8080) and is not accessible from the public internet. Apache processes the PHP request, potentially using .htaccess rules, and returns the response to Nginx. Nginx returns the response to the visitor. This combines Nginx's efficiency at serving static files and handling connections under load, with Apache's mature PHP ecosystem and .htaccess support. Cloudways uses this architecture on their managed WordPress plans.

How do I check which web server my hosting uses?

The fastest method: run curl -sI https://yourdomain.com | grep -i server. The Server header in the HTTP response identifies the web server. Common outputs: Server: Apache (Apache), Server: nginx (Nginx), Server: LiteSpeed (LiteSpeed enterprise), Server: OpenLiteSpeed (LiteSpeed open source), Server: cloudflare (if Cloudflare is proxying, you see Cloudflare's header instead of your origin server). Some hosts suppress the Server header for security reasons. In that case, check your hosting control panel — cPanel-based hosts typically list the web server in the server information section. You can also use WordPress plugins like Query Monitor or WP Server Info to display server type from within WordPress.

Does LiteSpeed require a paid license for WordPress sites?

LiteSpeed has two versions. LiteSpeed Web Server (LSWS) Enterprise requires a paid license — pricing starts at $20/month for shared hosting use and varies by CPU count for VPS and dedicated servers. However, individual WordPress site owners do not pay this directly — their hosting provider does. Hosts like A2 Hosting, Namecheap, and others have licensed LiteSpeed for their shared hosting stacks. OpenLiteSpeed is the free, open-source version that any VPS owner can install. It is functionally similar to LSWS for most WordPress use cases and fully supports the LiteSpeed Cache plugin. The LiteSpeed Cache WordPress plugin itself is free regardless of which version you run. The commercial advantage of LSWS Enterprise over OpenLiteSpeed: higher connection limits, enterprise support, and a few advanced features. For a self-managed VPS, OpenLiteSpeed with LiteSpeed Cache is free and provides the same performance benefits.

What is HTTP/3 and does my web server support it?

HTTP/3 replaces TCP with QUIC, a UDP-based protocol developed by Google. The core problem HTTP/3 solves: HTTP/2 eliminated head-of-line blocking at the HTTP layer, but head-of-line blocking can still occur at the TCP layer. If a single TCP packet is dropped and must be retransmitted, all HTTP/2 streams on that connection stall until the retransmission completes. QUIC handles each stream independently at the transport layer — a lost packet only stalls the stream it belongs to, not all streams. The result: HTTP/3 performs better than HTTP/2 on unreliable networks (mobile, congested Wi-Fi). LiteSpeed natively supports HTTP/3 and enables it by default. Nginx supports HTTP/3 via the quiche module but it is not in the mainline builds yet. Apache's HTTP/3 support is experimental. Cloudflare delivers HTTP/3 to visitors even if your origin server does not support it, because the protocol upgrade happens at the edge.

What does keepalive_timeout do and what should I set it to?

Keepalive (HTTP persistent connection) allows multiple HTTP requests to reuse the same TCP connection instead of establishing a new connection for each resource. Without keepalive, every image, CSS file, and JavaScript file on your page triggers a new TCP handshake (and TLS handshake if HTTPS) — adding 50-200ms per resource. The keepalive_timeout setting controls how long the server keeps the connection open waiting for additional requests after the last one. Too short (under 5 seconds): browser may not have time to send the next request before the connection closes, negating the benefit. Too long (over 75 seconds): server holds open idle connections that tie up file descriptors and memory. For WordPress sites, 15-30 seconds is the correct range. The default in Nginx is 75 seconds (typically fine). The default in Apache is 5 seconds (often too short — consider increasing to 15). LiteSpeed defaults are generally well-tuned.

Can I change my web server without changing hosts?

On shared hosting, no. The web server is determined by the hosting provider and you have no control over it. On a managed VPS or cloud hosting where you have root access (Cloudways, DigitalOcean, a raw VPS), yes — you can install any web server. The migration involves installing the new server, configuring virtual hosts, moving SSL certificates, converting .htaccess rules to native config syntax (for Apache to Nginx migration), and then switching which server binds port 80/443. For Apache to Nginx specifically, the main migration work is translating .htaccess rewrite rules to Nginx's native try_files and rewrite syntax. WordPress's permalink .htaccess rules translate to the standard try_files block. Custom plugin-added .htaccess rules need individual review. On ScalaHosting's managed VPS, you can choose between Apache, Nginx, and LiteSpeed from the control panel without manual server migration.

What is Nginx FastCGI cache and how does it compare to WP Rocket?

Nginx FastCGI cache is a server-level page cache built into Nginx. When enabled, Nginx caches the complete HTTP response (including headers and body) from PHP-FPM as a static file on disk. Subsequent requests for the same URL are served directly from Nginx's disk cache without PHP ever running. WP Rocket is a WordPress plugin that generates static HTML files in wp-content/cache/. The difference: Nginx FastCGI cache operates entirely outside PHP — the cache hit is handled by Nginx before the request reaches PHP. WP Rocket's cache is also served by the web server (advanced-cache.php is a WordPress hook that intercepts early), but it operates within the PHP runtime rather than before it. In practice, Nginx FastCGI cache is slightly faster because it truly bypasses PHP. The tradeoff: cache invalidation with Nginx FastCGI cache requires either a server-side script or a plugin like Nginx Helper that triggers Nginx cache purge on WordPress publish events. WP Rocket handles its own invalidation automatically.

Why does shared hosting always use Apache?

Shared hosting uses Apache primarily because of .htaccess. On shared hosting, hundreds of websites share the same server, and the hosting company cannot give each customer access to the main server configuration file (httpd.conf or nginx.conf). Apache's .htaccess system solves this: each customer can customize their own directory without needing root access. WordPress permalinks, plugin-generated redirect rules, security rules from Wordfence, and custom headers can all be set in .htaccess without touching the server's main config. Nginx has no equivalent system. On Nginx, all configuration lives in a central file that requires root access. This makes Nginx impractical for traditional shared hosting unless the control panel (like cPanel with Nginx as a reverse proxy) handles config generation automatically on the server's behalf. The second reason: Apache with mod_php was the default LAMP stack for decades. Shared hosting infrastructure was built around it, and migration to Nginx or LiteSpeed requires updating the entire stack for every customer account.