NGINX vs. Apache: How to Choose the Best Web Server

by Alejandro Granata
NGINX vs. Apache: How to Choose the Best Web Server thumbnail

Imagine this: you’re searching for new sneakers, you find a good deal, and decide to check it out on the website.

You wait for 10 seconds…20 seconds…and the site just won’t load. You’re tired of waiting, so you move on to another site. Here’s what probably happened: the sneaker website likely spent a lot of time and money on snazzy images and sleek designs, but it’s all for nothing if it takes forever to load.

The internet is full of slow websites.

The average mobile landing page takes 22 seconds to load, and that’s terrible for business.

A study by Portent found that a site that loads in under one second has a three-fold higher conversion rate than a site that takes five seconds to load.

Now, what does this have to do with our NGINX vs. Apache comparison?

A major factor affecting site speed is your web server — the software that delivers your pages to visitors.

Apache and NGINX are two of the most prominent web servers out there.

As of July 2024, w3techs reports that NGINX powers over 34% of websites, while Apache supports 29.4%.

Does that make NGINX the clear winner? Not just yet.

Both web servers work differently for varying use cases. In this guide, we’ll take a look at the differences between Apache and NGINX and explain what to look for when choosing a server.

Let’s get started.

What are Web Servers?

Web servers are software applications that run on a physical server and handle incoming user requests.

When you type in a URL like “google.com,” your browser sends a request to the web server, which stores the files required to run the website.

Infographic explaining what web servers are with icons for web browser, internet, and web server, two lines connecting them.

The server then sends back the appropriate content, whether HTML, CSS, JavaScript, images, or another type.

Web servers handle lots of important tasks behind the scenes:

  • Managing HTTP connections and requests
  • Routing requests to the correct backend application if needed (like PHP, Python, or Ruby on Rails)
  • Reading and writing files from disk to serve static assets
  • Enforcing security policies
  • Compressing content for faster transmission
  • Logging requests for analysis

Now that we’ve covered how web servers work, let’s see how NGINX and Apache approach these tasks.

What Is Apache?

DreamHost Glossary

Apache

Apache HTTP Server is free, open-source web server software that connects servers and browsers via HTTP requests.

Read More

Apache HTTP Server, commonly called Apache, is a popular open-source web server software created by Robert McCool and released in 1995. It’s based on the NCSA HTTPd server.

The Apache Software Foundation, a non-profit organization supporting open-source software projects, developed and continues to maintain it.

For many years, Apache was the most widely used web server in the world, powering many websites. In fact, it played a significant role in the growth of the World Wide Web in its early days.

Some of the key features and benefits of Apache are:

  • Modular architecture: Its functionality can be extended through modules for different features and languages.
  • Works on various operating systems: Apache is built to be cross-platform to host your web server on any operating system, including Linux, Windows, and macOS.
  • Extensive documentation and a large community: Helps users and developers fix problems and develop better solutions while working together.
  • Flexible configuration: The .htaccess files can facilitate directory-specific configuration changes for users.
  • Security features: Apache has fairly good security due to its open-source nature and regular updates to fix vulnerabilities and bugs.

That being said, Apache does have a few limitations:

  • Higher memory usage: It uses more memory than NGINX, particularly when handling several concurrent connections.
  • Slower under heavy loads: It can be slower than NGINX when serving static files, especially under heavy loads.
  • Challenging for developers to develop and maintain: Over the years, the growing complexity of its codebase has made it more challenging to build and maintain.

What Is NGINX?

NGINX (pronounced “Engine X”) is a free, open-source, high-performance web server software first released in 2004. It was created by Igor Sysoev, a Russian software engineer, to solve the problem of handling many users accessing a website simultaneously, which was a challenge for other web servers like Apache.

Sysoev’s work on NGINX began in 2002. He aimed to tackle the “C10k problem” — handling 10,000 concurrent connections.

His vision was of a fast, stable, and scalable server. This focus on performance makes NGINX exceptionally good at serving static content such as HTML pages, images, and CSS files.

Beyond its speed, NGINX excels as a reverse proxy. It receives user requests and intelligently routes them to other servers, like Apache or web applications, optimizing resource utilization.

DreamHost Glossary

Web Application

Web applications are programs that operate on a web server. The user can access web applications through their browser. Examples of web applications include photo editing programs and email services.

Read More

Some of the main advantages of NGINX are:

  • Concurrent handling: NGINX handles many users simultaneously without demanding excessive memory or CPU power.
  • Easy to set up and configure: NGINX has a simple and intuitive configuration file format that helps users easily configure the web server according to their use case.
  • Various performance features: NGINX has many built-in features for load balancing, caching, and securing websites with SSL/TLS encryption.
  • Supports IMAP and POP3: NGINX even functions as a mail proxy server, supporting protocols like IMAP and POP3.

However, there are a few drawbacks to using NGINX:

  • Default settings are not optimal: The default load-balancing algorithms may not always perform optimally in every situation.
  • No built-in language compilers: It doesn’t have native support for generating dynamic websites using server-side languages like PHP or Python. Nonetheless, you can bypass this with a third-party extension.

Apache vs. NGINX: What Are the Differences?

Apache was once the top choice as a web server. However, NGINX quickly took over the market share and is now popular among many high-traffic websites.

If you plan to work with dedicated hosting, choosing the right web server is an important decision.

So, what sets these two apart?

Let’s take a closer look.

DetailsApache HTTP ServerNGINX
Founded19952004
Licensing termsApache License 2.02-clause BSD license
Operating system compatibilityWindows, Linux, macOS, Unix-based systemsWindows, Linux, macOS, Unix-based systems
WebSocket protocol supportYesYes (introduced in version 1.3.13)
Reverse proxy supportYesYes
Virtual host configurationSupportedSupported
Caching Available through modulesBuilt into the core
Resource consumption (memory)HighLow
Setup and configuration formatText-basedText-based (simpler syntax)
Security featuresmod_security support offers flexible rule configuration and access controlAdvanced filtering, rate limiting, built-in support for DDoS mitigation, and SSL/TLS performance
Encrypted communication (SSL/TLS)SupportedSupported
Concurrent connection handlingGoodHighly efficient
Scaling performanceGoodOutstanding
Load distribution functionalityAchievable with modulesBuilt-in feature
Overall performance and speedSatisfactoryTwo times faster than Apache

Architecture and Concurrency

One of the most significant differences between NGINX and Apache is how they handle incoming requests under the hood.

This has a substantial impact on their performance and resource efficiency.

Apache’s Process-Based Architecture

Diagram showing Apache's process-based approach: client request, server processing, response, and handling index.php file.

Apache follows a process-based model, spawning a new thread or process for each incoming request.

These processes or threads are managed by Multi-Processing Modules (MPMs):

  • Prefork MPM: The original Apache model. Each process has a single thread and handles one connection at a time. It’s simple but can be memory-intensive.
  • Worker MPM: Uses multiple threads per process, each handling a single connection. It’s better than prefork for memory, but heavy traffic and resource-intensive requests can still bottleneck the CPU, leading to performance issues.
  • Event MPM: Similar to the worker MPM but optimized for keep-alive connections (devices that can’t be disconnected from the server). Although, it’s still not fully async.

These are all good modules, but they have one major disadvantage: Apache must create new processes or threads for each incoming connection and destroy them when done. It tries to manage this by pre-forking some idle processes in advance.

However, if several people want to connect to the site simultaneously, Apache might exceed its existing pool, and then it must quickly create more processes. This takes time and eats up memory.

This model works perfectly fine for low to medium-traffic sites. Even so, Apache can start to strain sites with many concurrent connections.

All these separate processes aren’t super efficient. Even with the event MPM, Apache can’t entirely escape the one-thread-per-connection model.

Get Content Delivered Straight to Your Inbox

Subscribe now to receive all the latest updates, delivered directly to your inbox.

NGINX’s Event-Driven Architecture

NGINX's event-driven architecture

NGINX takes a very different approach. Instead of separate processes or threads for each connection, NGINX uses an asynchronous, event-driven architecture.

Here’s how it works: 

  • NGINX has a primary process (usually one per CPU core) that manages several worker processes. Each worker can handle thousands of simultaneous connections. There’s no need for workers to spawn new threads or route each request to a dedicated process.
  • Instead, the workers have an event loop where they efficiently watch for new events on existing connections using the operating system’s mechanisms, like kqueue or epoll. This lets them juggle multiple connections within a single thread. When an event happens, like a new request coming in or a backend server responding, NGINX quickly dispatches it to a free slot in the worker.
  • This is way more efficient than Apache’s model. NGINX can serve a massive number of requests with a tiny memory footprint. It scales incredibly well, which is why it’s used for many of the busiest sites on the web.

The downside is that NGINX can’t embed code interpreters like Apache does.

So, when you want to run PHP or Python code, NGINX sends requests to a separate FastCGI process manager like php-fpm. This process runs the code and translates it to something the user’s browser can understand.

On the other hand, Apache can run languages like PHP, Perl, and Python within its processes.

Since NGINX can’t, the config file can become a little more complex.

The performance gains, however, usually outweigh the hassle.

Performance

NGINX is known for being highly performant when serving static files like HTML pages, images, CSS, and JavaScript.

The event-driven architecture helps, but NGINX also has some other tricks.

First, unlike Apache, NGINX doesn’t need to go through the cache and hit the disk for every request. It can serve files directly from the disk. Also, NGINX eliminates the overhead that comes with checking permissions and locking files.

Apache has these issues because each request is a process, and if one process is modifying something, the other process can’t use the same file simultaneously.

While smaller websites won’t notice this bottleneck because of how quickly things are processed behind the scenes, a large site with a couple of thousand requests every second will begin to see these issues slowing down the user experience.

NGINX also has a built-in file cache. On the first request for a file, NGINX reads it from the disk and puts it into its cache. Future requests for that file can be served blazingly fast straight from memory without touching the disk. It also automatically invalidates the cached data if the file on disk changes.

These optimizations add up. In benchmarks, NGINX can often serve static files about three times faster than Apache, especially as concurrent requests grow.

A bonus: this can also help you improve your core web vitals, giving you a bit of a boost on Google.

DreamHost Glossary

Core Web Vitals (CWV)

Core Web Vitals (CWV), developed by Google, enhance web browsing with three metrics: Largest Contentful Paint (LCP), First Input Delay (FID), and Cumulative Layout Shift (CLS).

Read More

Apache isn’t slow, either. You simply need to spend time fine-tuning it for it to work just right. It’s also capable of serving static files very quickly.

But NGINX is the way to go if you want a performant web server right out of the box.

Configuration and Syntax

NGINX and Apache have different configuration philosophies.

Apache is famous for its extensive configuration options. In addition to the apache2.conf, you must add your rules and configurations to the .htaccess file.

The configuration files use XML-like syntax and offer incredible flexibility. Apache has a massive list of directives you can use to tweak every aspect of the server’s behavior.

You can set configuration options globally or override them for specific directories or virtual hosts.

Basic Apache server configuration file screenshot, showing settings for port, modules, user, directories, and logs.

Apache’s real power comes from its sprawling ecosystem of modules. A huge array of official and third-party Apache modules lets you do everything from URL rewriting to security filtering to advanced caching. To use a module, you load it in your Apache configuration.

The flip side is that Apache configuration can get complex quickly, especially for fancy setups. Directives can override each other in tricky inheritance chains. Configuration options are often split across multiple files in various subdirectories of the main config folder. It’s super flexible, but it takes some time to master.

NGINX’s configuration, on the other hand, aims for simplicity and readability. There’s no .htaccess file here. You simply configure the sites in your NGINX.conf along with the sites-enabled folder, and you’re good to go.

The syntax borrows styling from common programming languages. It’s still powerful but not quite as sprawling as Apache.

Nginx configuration file screenshot showing settings for user, worker processes, events, HTTP server, and directory options.

Instead of modules, NGINX has a smaller set of core directives and features that come baked in. All your options for a given feature are usually in one block together (enclosed in curly brackets { }).

Some advanced features like load balancing and caching are configured in the main NGINX.conf, not split off into side files.

The result is that NGINX configuration files tend to be leaner, and more accessible to read and configure than the hefty Apache ones, but you can still do a lot with them.

Security

NGINX and Apache are open-source projects with large, active communities of developers constantly working to identify and patch vulnerabilities. They both receive regular security updates and have a good track record of addressing issues quickly.

That said, there are some differences in how they approach security.

Here are a few key points to consider:

  • Modularity: Apache’s modular architecture means you only need to enable the features you use, minimizing the attack surface. With NGINX, many standard features are built directly into the core, which some may argue makes it less flexible from a security standpoint.
  • Request filtering: NGINX has a powerful built-in request filtering engine that can help block common web attacks like SQL injection and cross-site scripting (XSS). Apache has similar capabilities through modules like mod_security.
  • SSL/TLS configuration: Both servers support SSL/TLS for encrypted connections, but NGINX is often said to be easier to configure. It has clearer documentation and more secure defaults out of the box.
  • Process isolation: NGINX’s use of a single master process with multiple worker processes can help isolate troubled areas. Apache’s prefork and worker MPMs can provide similar process-level isolation but at the cost of using more resources.
  • DDoS mitigation: NGINX’s event-driven architecture and efficient handling of concurrent connections make it a popular choice for mitigating small- to medium-sized DDoS attacks. A few additional modules and tuning can also make Apache resistant to DDoS attacks.

Dynamic Content, Modules, and Ecosystem

Apache has long been the go-to for serving dynamic content because it easily integrates server-side languages. With the prefork and worker MPMs, you can compile support for languages like PHP, Python, and Perl right into the Apache binary.

Apache will then run an interpreter inside each of its worker processes. This is nice and simple — Apache can pass requests for .php files to its built-in PHP interpreter and get rendered output back.

NGINX doesn’t have any built-in server-side language support. You need a separate service like php-fpm that runs the language interpreter to run PHP, Python, or Ruby on Rails with NGINX. NGINX receives requests and proxies them to the backend, which processes the code and returns a response.

This is a little more work to set up than Apache’s all-in-one approach. Then again, it does fit NGINX’s philosophy of doing one thing (serving requests) — and doing it well.

As for other features, NGINX ships with a tight core of beneficial ones like load balancing, proxying, caching, rate limiting, compression, and SSL termination. But it doesn’t match the incredible breadth of Apache’s module ecosystem. With Apache, you have modules for authentication schemes, content filtering, embedded scripting languages, and beyond.

Not every one of these is unique. NGINX can do many of the same jobs, just in different ways. However, Apache’s module library is quite extensive.

If there’s some super-specific piece of functionality you need, Apache may have the edge here.

Still, NGINX’s feature set is robust for most common web serving needs.

Real-World Usage, Performance, and Community

NGINX’s popularity has risen over the past decade.

NGINX vs. Apache market share. As of 2022, NGINX powers over 34% of all websites globally, compared to Apache's roughly 29%.

As of 2022, it powers over 34% of all websites globally, compared to Apache’s roughly 29%.

One thing you should keep in mind: you won’t notice the difference between these web servers unless you have a large website or a really small server.

Suppose you like Apache’s extensive configuration options and all-in-one approach to dynamic content. The Apache documents are some of the best, and the community is massive if you ever need help.

NGINX may be better if you’re chasing maximum concurrency or building a huge site. Its architecture is a bit more future-proof and built for scale. And the NGINX community has grown fast. The documents are solid, too; you can find plenty of guides and support.

Apache vs. NGINX: Which One Is Right for You?

There’s no one-size-fits-all answer to the NGINX vs. Apache debate. Nonetheless, here are some good rules of thumb to help you make the decision.

NGINX is better if:

  • You have a very high-traffic site.
  • You need to serve a ton of static assets quickly.
  • You’re building a microservices architecture.
  • You like a more streamlined configuration style.
  • You’re using containers or cloud hosting where every ounce of memory counts.

Apache is better if:

  • You need deep compatibility with Apache-only features like .htaccess.
  • You want modules for super-specific functionality.
  • You need to run older web apps built for Apache and mod_php.
  • You’re just plain fond of the Apache configuration system.
  • Your server is primarily a development box, and performance is less critical.

There’s no rule that says you have to choose one.

Running NGINX in front of Apache as a reverse proxy is very common. This lets you combine NGINX’s unbeatable static file serving and concurrent processing with Apache’s rich dynamic language support on the backend — the best of both worlds.

Wrapping Up

Apache and NGINX are both great, so choosing one is mostly about what best fits your needs.

Remember, even the beefiest web server is just one cog in the machine. So, if the site feels sluggish, the web server software or hardware shouldn’t necessarily be the first thing to optimize.

Smarter caching, database tuning, code optimization, and solid underlying hardware can all help speed up your stack more than spending hours tinkering with NGINX or Apache.

If you need a server to play around with, try DreamHost’s managed VPS. With a VPS, you can choose what software to install, how the server should respond to requests, and more. Plus, with the flexibility of a VPS, you can host multiple websites on a single server and divide resources among them accordingly.

Additionally, all DreamPress plans now come with NGINX.

The only way to find an ideal setup is to experiment. Spin up a VPS, install NGINX and Apache, and see which works best for you!

VPS Hosting
VPS Hosting

We Know You’ve Got Lots of VPS Options

Here’s how DreamHost’s VPS offering stands apart: 24/7 customer support, an intuitive panel, scalable RAM, unlimited bandwidth, unlimited hosting domains, and SSD storage.

Change Your VPS Plan

Alex is one of our WordPress specialists at DreamHost. He is responsible for providing technical support, optimization tips, and assisting customers with internal migrations. In his free time, he enjoys cooking, playing videogames, and reading. Follow Alex on LinkedIn: https://www.linkedin.com/in/agranata/