Nginx vs Apache web server comparison

Apache has dominated the web server market for over 30 years. Nginx was built specifically to solve what Apache couldn't handle well — and today Nginx has surpassed Apache in raw deployment numbers globally. But that doesn't mean Nginx is better in every situation.

This article compares Nginx and Apache directly — covering architecture, performance, PHP handling, .htaccess, virtual hosts and the use cases where each wins.

Quick answer: Choose Nginx for VPS deployments requiring high performance, static files, reverse proxy, or Node.js/Python apps. Choose Apache when you need .htaccess per-directory config (Shared Hosting standard), mod_rewrite, or when you don't control the server's web server choice.

What is Apache?

Apache HTTP Server launched in 1995 from NCSA HTTPd and is now maintained by the Apache Software Foundation. It uses a process-based or thread-based (MPM) architecture — each request spawns its own process or thread, making isolation easy but consuming RAM as concurrent connections grow.

Apache's lasting strength is .htaccess — per-directory configuration that developers (not just admins) can modify. This makes Apache the standard for virtually all shared hosting providers.

What is Nginx?

Nginx (pronounced "engine-x") was created by Igor Sysoev in 2004 to solve the C10K problem (serving 10,000 concurrent connections simultaneously). It uses an event-driven, non-blocking, asynchronous architecture — a single worker process handles thousands of requests simultaneously via an event loop.

Today Nginx is most commonly used as a reverse proxy in front of app servers (Node.js, Python, PHP-FPM) rather than a standalone web server, and is the default web server in most Ubuntu VPS tutorials.

Feature Comparison Table

FeatureNginxApache
ArchitectureEvent-driven, async, non-blockingProcess/thread-based (MPM)
Concurrent ConnectionsVery high (event loop)Lower under high traffic
RAM Usage (idle)Very low (~3–5 MB/worker)Higher (~10–30 MB/process)
Static File ServingSignificantly fasterSlower
PHP SupportVia PHP-FPM (requires config)mod_php or PHP-FPM
.htaccess Support❌ Not supported✅ Per-directory support
Config StyleBlock-based (nginx.conf)Directive-based (.htaccess / httpd.conf)
Reverse Proxy✅ Excellent✅ mod_proxy (slower)
SSL/TLS Termination✅ Fast✅ mod_ssl
WebSocket✅ Native✅ mod_proxy_wstunnel
Load Balancing✅ Built-in✅ mod_proxy_balancer
Shared Hosting❌ Rarely available✅ Shared Hosting standard
Config ReloadZero-downtime (signal)Graceful restart

5 Key Practical Differences

1. Architecture — the Root of Every Difference

Apache creates a new process or thread per connection (Prefork/Worker/Event MPM), making isolation easy but causing RAM and CPU spikes under high concurrency. Nginx uses an event loop in a single process — the worker handles I/O events without blocking, serving 10,000+ connections with constant RAM usage.

On a 1GB RAM VPS at normal traffic levels this difference may not be noticeable. But during traffic spikes or with slow clients (long-lived connections), Nginx won't OOM while Apache may stop accepting new connections.

2. .htaccess — Nginx's Biggest Limitation

Apache reads .htaccess files in every directory on each request, letting developers set redirects, authentication and rewrites without touching server config. This is why WordPress, CodeIgniter and virtually every PHP framework generates .htaccess files.

Nginx has no .htaccess concept — all config lives in /etc/nginx/sites-available/ requiring sudo access. This makes Nginx unsuitable for shared hosting where each user must manage their own configuration.

⚠️ WordPress on Nginx: WordPress relies on mod_rewrite via .htaccess for Pretty Permalinks. On Nginx you must add config to the server block manually: try_files $uri $uri/ /index.php?$args; — no plugin can handle this automatically, so every fresh WordPress install on Nginx requires this manual step.

3. Static File Performance

Nginx serves static files (HTML, CSS, JS, images) significantly faster than Apache thanks to event-driven I/O and the sendfile() system call. In real benchmarks Nginx serves static files 2–5× faster than Apache under high concurrency. However, with a caching layer (Varnish, Redis, CDN) in front, this difference becomes negligible in practice.

4. PHP — Both Use PHP-FPM Now

Modern Apache uses PHP-FPM instead of mod_php, just like Nginx — so PHP performance differences are minimal. Apache can still use mod_php (in-process) which is easier to configure, but not recommended since a PHP crash can crash Apache with it.

5. Reverse Proxy for Node.js / Python / Go

When running an app server like Node.js (Express, Next.js) or Python (Gunicorn, FastAPI), Nginx is the best reverse proxy — simpler config, better request body buffering, upstream health checks and round-robin/least_conn load balancing built in. Apache can do this with mod_proxy but configuration is more verbose and performance is lower under high traffic.

In-Depth Comparison Across 6 Dimensions

Beyond the feature table above, this table digs into the dimensions that actually drive real decisions on a VPS — traffic patterns, scaling behavior, and day-to-day maintenance effort.

DimensionNginx (Event-driven)Apache (Process/Thread)
Processing modelOne worker handles thousands of connections via an event loop (epoll/kqueue)One process or thread per connection (Prefork/Worker/Event MPM)
Static files (HTML/CSS/JS/images)Faster — uses sendfile() to push files straight from the kernelSlightly slower — more module-layer overhead
Dynamic content (PHP/Python)Always proxies to PHP-FPM/upstream; never runs the app itselfCan run in-process via mod_php or proxy to PHP-FPM
Per-directory config (.htaccess)None — config is centralized in the server blockYes — editable per directory without reloading the server
Behavior under load / slow clientsConstant RAM, won't OOM even with long-lived connectionsRAM scales with connection count, OOM risk
Module systemMostly compile-in (dynamic modules since 1.9.11)Load/unload modules at runtime (a2enmod)

When to Choose Nginx

Nginx fits workloads centered on high throughput, handling large numbers of connections, and acting as the edge of your system. These are the scenarios where Nginx is the clear pick:

A minimal server block proxying to an app on port 3000:

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

When to Choose Apache

Apache remains the right — and sometimes simpler — choice, especially when your workload depends on .htaccess or an ecosystem built around Apache.

An Apache VirtualHost using PHP-FPM via proxy:

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/example/public

    <Directory /var/www/example/public>
        AllowOverride All
        Require all granted
    </Directory>

    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost"
    </FilesMatch>
</VirtualHost>

Using Both Together (Nginx Reverse Proxy + Apache Backend)

A popular VPS setup that wants both Nginx's speed and the convenience of .htaccess puts Nginx at the front (port 80/443) serving static files and handling SSL termination, then forwards PHP/dynamic requests to Apache listening on port 8080 on the backend.

The benefit: you get Nginx's static performance and connection handling while your PHP app keeps using its existing .htaccess without rewriting every rule into nginx config. An example Nginx config that proxies to Apache:

server {
    listen 80;
    server_name example.com;
    root /var/www/example/public;

    # Nginx serves static directly
    location ~* \.(jpg|jpeg|png|gif|css|js|webp|svg)$ {
        expires 30d;
        try_files $uri =404;
    }

    # everything else goes to Apache (port 8080)
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Caveat: Apache must read the real client IP from the X-Forwarded-For header (via mod_remoteip), otherwise its logs only show 127.0.0.1. And for a personal VPS with modest traffic, this two-tier setup can be overkill — picking one and mastering it is usually easier to maintain.

Decision Guide — Choose by Use Case

Using Both Together (Nginx + Apache)

Some advanced setups and hosting panels (like LiteSpeed) run Nginx as a frontend reverse proxy + Apache handling PHP on the backend (port 8080) — getting the best of both worlds: Nginx handles static files and connections fast, Apache provides .htaccess for PHP apps. For personal VPS use this is unnecessarily complex — pick one and master it.

Frequently Asked Questions

Is Nginx really faster than Apache?

Faster for serving static files and under high concurrency, thanks to its event loop and sendfile(). But for dynamic content (PHP), where both use PHP-FPM, the difference is negligible — and with a caching layer (CDN/Varnish/Redis) in front, it matters even less in practice.

Can Nginx use .htaccess?

No. Nginx has no per-directory config concept like .htaccess. Everything must live in a server block under /etc/nginx/, which requires root access and a nginx -s reload after edits. If your site relies heavily on .htaccess, migrating to Nginx means converting every rewrite rule yourself.

Should WordPress use Nginx or Apache?

Both work. Apache is simpler because Pretty Permalinks work instantly from the .htaccess WordPress generates. Nginx is faster under high traffic but you must add try_files $uri $uri/ /index.php?$args; to the server block yourself. For high-traffic sites, Nginx + PHP-FPM is recommended.

Can I run Nginx and Apache on the same machine at once?

Yes, and it's a popular pattern: Nginx listens on port 80/443 at the front serving static and handling SSL, while Apache listens on port 8080 on the backend running PHP via existing .htaccess. They must listen on different ports, and Apache should set mod_remoteip to read the real client IP.

Ready to Install Nginx or Apache on a VPS?

AsiaGB VPS starts at ฿500/month — Ubuntu 22.04 LTS, SSD, Full Root Access. Install your preferred web server in minutes.

View All VPS Plans