TechEarl

50 Nginx vs Apache Jokes Every Web Server Admin Knows

Nginx vs Apache jokes every web server admin knows: .htaccess survivors, mod_rewrite migrations, prefork MPM, try_files, and Nginx-in-front-of-Apache.

Ishan Karunaratne⏱️ 4 min readUpdated
Share thisCopied

50 Nginx vs Apache Jokes

"Should we use Nginx or Apache?" Ask the room and watch two engineers stop being friends.

Apache has been running on a server in the basement since 2008. Nobody knows the root password. It has 100% uptime.

"Nginx is faster." "Apache is more flexible." "Both of you are wrong, it's the database."

An .htaccess file is a small piece of paper that says: "please redirect this, please." Apache reads it and obliges. Nginx sets it on fire.

The first sign someone is migrating from Apache is the sentence: "Where is mod_rewrite in Nginx?"

The Apache config file has 47 includes. The Nginx config file has zero, but somehow loads the same amount of config.

"Apache is dead." Apache, still serving 30% of the public internet, says nothing.

Nginx errors: Cryptic, terse, line numbers wrong by two. Apache errors: A novel.

"Why is the site slow?" Because you have prefork MPM enabled and 400 simultaneous connections. Pick a lane.

I asked an Nginx user how Apache handles requests. They described prefork the way you describe a haunted house.

"Just use Caddy." This is what people say when they want to leave the conversation.

Apache modules are loaded by default. All of them. Forever. This is fine.

An Nginx config reload can save your evening. An Apache config reload can also save your evening, in a different and slower way.

"Why does my rewrite rule not work?" Because this is Nginx and you wrote it in Apache syntax. We have all done it.

The number of people who fully understand Nginx's location block precedence rules is fewer than the number who claim to.

Apache's `.htaccess` is the convenience of editing config without restarting and the curse of editing config without thinking.

"Nginx config is declarative." It is also case sensitive, whitespace sensitive, and order sensitive. So declarative in name only.

Every old project has an `httpd.conf` and a `nginx.conf` and uses neither.

"We are putting Nginx in front of Apache." That sentence is the entire 2014–2019 backend industry in nine words.

Apache's documentation is comprehensive. Nginx's documentation is correct. These are different things.

The day I learned `try_files` was the day I stopped fighting Nginx and started worshipping it. I still got 404s.

"It's just a config file." Yes, and War and Peace is just a book.

I have written `worker_connections 1024` in every Nginx config I have ever shipped and I have never once known why.

"Apache is bloated." The entire team's Slack client is currently using more memory than Apache.

Nginx fans say config-driven. Apache fans say battle-tested. Both mean: "the one I learned first."

An Apache admin retiring is a kind of geological event. The knowledge they leave behind is half oral tradition, half post-it note.

"Just put a reverse proxy in front of it." The answer to every web architecture question since 2012.

Apache: include the conf.d directory. Nginx: include the conf.d directory. Both of us, mostly: copy the example file from the docs and edit one line.

The first time I tried to deny by IP in Nginx I learned that order matters. The second time I learned it again.

"Use Lua in Nginx." Now my web server is also a programming language. Cool. Cool cool cool.

Apache 1.3 ran for 19 years on a server in a closet at a university nobody remembers. It was finally turned off in 2024. A librarian cried.

"Why is mod_php still a thing?" Because shared hosting exists. Stop asking.

Nginx's `if` directive is documented as evil. Literally. The docs use the word evil. I still use it weekly.

Apache served the first website I ever broke. Nginx serves the last website I will break.

"What does this Apache config block do?" It was added in 2011 to fix something that has not been a problem since 2013. We are afraid to remove it.

Nginx config syntax does not have inline comments inside a directive value. I learned this by losing two hours.

"Apache is too heavy for static files." The site serves 300 requests a day. It is fine.

The Nginx upgrade went smoothly. The new binary loaded. The old workers drained. Nothing exploded. This is suspicious.

"Why doesn't gzip work?" Because you set `gzip on;` but did not set `gzip_types` and the default is `text/html` only. Welcome to Nginx.

Apache's `RewriteCond` and `RewriteRule` together are a small esoteric programming language. I have written four-line rewrites and called in sick the next day.

"Just use Apache for development and Nginx for production." The team is currently doing exactly that and the bugs are exquisite.

Nginx Plus is a paid product. Most people learn this by emailing support and getting a quote.

Apache's MPM choice is a decision you make once and regret on a different Thursday.

"Use HAProxy instead." That is a different argument, friend. Sit down.

Nginx is fine until you need WebSockets. Then Nginx is also fine, but only after you read the proxy_http_version note twice.

Apache is fine until you need WebSockets. Then Apache is also fine, but only after you enable two modules you have never heard of.

The Nginx config has one server block per virtual host. The Apache config has one VirtualHost block per virtual host. The production server has 47 of either kind and runs three sites.

"Why is the wrong site loading?" Because your default_server matches before your server_name does. Read the docs once more, slowly.

I once swore off Apache. I came back six months later because cPanel exists. There is no exit.

The holy war ended quietly. Nginx fronts everything. Apache sits behind it, doing the actual work, talking to nobody.

Why the Nginx vs Apache joke outlived the holy war

The argument has been over for a while, technically. Nginx took the reverse proxy and load balancer slot for almost every modern stack, Apache stayed entrenched in shared hosting, PHP-FPM, and anywhere mod_rewrite has been load-bearing since the early 2010s. Most production systems now run both, with Nginx out front and Apache behind, and neither team admits that arrangement is the actual peace treaty. The joke survives because the cultural posture survived. Nginx people still say lightweight. Apache people still say flexible. Both of them mean: the config language I memorized.

What makes web server humor specifically funny instead of just nerdy is the load-bearing role these files play. The webserver config is the one file in the stack that is allowed to silently route every request to the wrong place, and it has the syntax of a small, opinionated programming language with no debugger. A typo in your application code throws a stack trace. A typo in your Nginx config returns the wrong site for an hour and nobody notices until a customer screenshots it.

The other reason the genre keeps producing material is the depth of the config tradition. Every team has an httpd.conf and a nginx.conf and a folder full of includes that have not been audited since the original author left. Both servers reward the engineer who knows the obscure directive, and both punish the engineer who copies the obvious one from Stack Overflow. The jokes are recognition: you have also kept an .htaccess file alive past the point of sanity, you have also written if blocks inside Nginx despite the docs calling them evil, you have also Googled try_files more times than you will admit.

See also

Sources

Authoritative references this article was fact-checked against.

TagsHumorJokesNginxApacheWeb ServerSysadminDevOps

Found this useful? Pass it on.

Copied

Ishan Karunaratne

Tech Architect · Software Engineer · AI/DevOps

Tech architect and software engineer with 20+ years building software, Linux systems, and DevOps infrastructure, and lately working AI into the stack. Currently Chief Technology Officer at a healthcare tech startup, which is where most of these field notes come from.

Keep reading

Related posts