This is a response to a post published by W3 Techs titled “Nginx reaches 33.3% web server market share while Apache falls below 50%". It’s gotten massive upvotes on Hacker News, but I believe it’s a fundamentally flawed post.
Here’s why.
How server adoption is measured
Let’s take a quick moment to look at how W3 Techs can decide if a site is running Apache vs. Nginx. The secret lies in the HTTP headers the server sends on each response.
$ curl -I https://ma.ttias.be 2>/dev/null | grep 'Server:' Server: nginx
That Server
header is collected by W3 Techs and they draw pretty graphs from it.
Cool!
Except, you can’t rely on the Server
alone for these statistics and claims.
You (often) can’t hide the Nginx Server header
Nginx is most often used as a reverse proxy, for TLS, load balancing and HTTP/2. That’s a part the article to right.
Nginx is the leading web servers supporting some the the more modern protocols, which is probably one of the reasons why people start using it. 76.8% of all sites supporting HTTP/2 use Nginx, while only 2.3% of those sites rely on Apache.
Yes, Nginx offers functionality that’s either unstable or hard to get on Apache (ie: not on versions in current repositories).
As a result, Nginx is often deployed like this;
: 443 Nginx |-> proxy to Apache :80 Nginx |-> forward traffic from HTTP -> HTTPs
To the outside world, Nginx is the only HTTP(s) server available. Since measurements of this stat are collected via the Server
header, you get this effect.
: 443 Nginx |- HTTP/1.1 200 OK |- Server: nginx |- Cache-Control: max-age=600 |- ... \ \ \ Apache |- HTTP/1.1 200 OK |- Server: Apache |- Cache-Control: max-age=600
Both Apache and Nginx generate the Server
header, but Nginx replaces that header with its own as it sends the request to the client. You never see the Apache header, even though Apache is involved.
For instance, here’s my website response;
$ curl -I https://ma.ttias.be 2>/dev/null | grep 'Server:' Server: nginx
Spoiler: I use Nginx as an HTTP/2 proxy (in Docker) for Apache, which does all the heavy lifting. That header only tells you my edge is Nginx, it doesn’t tell you what’s behind it.
And since Nginx is most often deployed at the very edge, it’s the surviving Server
header.
Nginx supplements Apache
Sure, in some stacks, Nginx completely replaced Apache. There are clear benefits to do so. But a few years ago, many sysadmins & devs changed their stack from Apache to Nginx, only to come back to Apache after all.
This created a series of Apache configurations that learned the good parts from Nginx, while keeping the flexibility of Apache (aka: .htaccess
). Turns out, Nginx forced a wider use of PHP-FPM (and other runtimes), that were later used in Apache as well.
A better title for the original article would be: Nginx runs on 33% of top websites, supplementing Apache deployments.
This is one of those rare occasions where 1 + 1 != 2. Nginx can have 33% market share and Apache can have 85% market share, because they’re often combined on the same stack. Things don’t have to add up to 100%.