Nginx vs Apache Web服务器对比

Apache 在Web服务器市场中统治超过30年。Nginx 专为解决Apache无法很好处理的问题而开发——如今在全球部署数量上Nginx已超过Apache。但这不意味着Nginx在所有情况下都更好。

本文直接对比 Nginx 和 Apache —— 涵盖架构、性能、PHP处理、.htaccess、虚拟主机和各自优势的使用场景。

快速答案: 选择 Nginx 用于需要高性能、静态文件、反向代理或Node.js/Python应用的VPS部署。选择 Apache 当您需要.htaccess按目录配置(共享主机标准)、mod_rewrite,或当您无法控制服务器Web服务器选择时。

Apache是什么?

Apache HTTP Server 于1995年从NCSA HTTPd推出,现由Apache软件基金会维护。它使用 基于进程或基于线程的(MPM)架构 —— 每个请求产生自己的进程或线程,这使隔离变得容易但随着并发连接数增加会消耗大量RAM。

Apache持久的优势是 .htaccess —— 开发人员(不仅是管理员)可以修改的按目录配置。这使Apache成为几乎所有共享主机提供商的标准。

Nginx是什么?

Nginx(发音"engine-x")由Igor Sysoev在2004年创建来解决C10K问题(同时服务10,000个并发连接)。它使用 事件驱动、非阻塞、异步架构 —— 单个worker进程通过事件循环同时处理数千个请求。

如今Nginx最常见的用途是作为应用服务器(Node.js、Python、PHP-FPM)前面的 反向代理,而不是独立的Web服务器,是大多数Ubuntu VPS教程中的默认Web服务器。

功能对比表

功能NginxApache
架构事件驱动、异步、非阻塞基于进程/线程(MPM)
并发连接非常高(事件循环)高流量下较低
RAM使用(空闲)非常低(~3–5 MB/worker)较高(~10–30 MB/进程)
静态文件服务明显更快较慢
PHP支持通过PHP-FPM(需要配置)mod_php或PHP-FPM
.htaccess支持❌ 不支持✅ 按目录支持
配置风格块级(nginx.conf)指令级(.htaccess/httpd.conf)
反向代理✅ 优秀✅ mod_proxy(较慢)
SSL/TLS终止✅ 快速✅ mod_ssl
WebSocket✅ 原生✅ mod_proxy_wstunnel
负载均衡✅ 内置✅ mod_proxy_balancer
共享主机❌ 很少可用✅ 共享主机标准
配置重载零停机时间(信号)优雅重启

5个关键实际差异

1. 架构 —— 所有差异的根源

Apache为每个连接创建新的进程或线程(Prefork/Worker/Event MPM),这使隔离变得容易但在高并发下会导致RAM和CPU波动。Nginx在单个进程中使用事件循环 —— worker处理I/O事件而无需阻塞,以恒定的RAM使用量服务10,000+连接。

在1GB RAM VPS上的正常流量下这种差异可能不明显。但在流量尖峰期或与慢客户端(长连接)一起时,Nginx不会OOM而Apache可能停止接受新连接。

2. .htaccess —— Nginx最大的限制

Apache在每个请求时读取每个目录中的 .htaccess 文件,让开发人员无需接触服务器配置就能设置重定向、身份验证和重写。这就是为什么WordPress、CodeIgniter和几乎每个PHP框架都生成 .htaccess 文件。

Nginx没有.htaccess概念 —— 所有配置都在 /etc/nginx/sites-available/ 中需要sudo访问。这使Nginx不适合共享主机,其中每个用户必须管理自己的配置。

⚠️ Nginx上的WordPress: WordPress依赖mod_rewrite通过.htaccess实现漂亮链接。在Nginx上您必须手动将配置添加到server块: try_files $uri $uri/ /index.php?$args; —— 没有插件可以自动处理这个,所以每个新安装在Nginx上的WordPress都需要这个手动步骤。

3. 静态文件性能

Nginx由于事件驱动的I/O和sendfile()系统调用而比Apache快得多地服务静态文件(HTML、CSS、JS、图像)。在真实基准中,Nginx在高并发下比Apache快2-5倍。然而,在前面有缓存层(Varnish、Redis、CDN)的情况下,这种差异在实践中变得微乎其微。

4. PHP —— 两者现在都使用PHP-FPM

现代Apache使用PHP-FPM而不是mod_php,就像Nginx一样 —— 所以PHP性能差异最小。Apache仍然可以使用mod_php(进程内)更容易配置,但不推荐因为PHP崩溃可能导致Apache崩溃。

5. Node.js/Python/Go的反向代理

运行应用服务器如Node.js(Express、Next.js)或Python(Gunicorn、FastAPI)时,Nginx是最好的反向代理 —— 更简洁的配置、更好的请求体缓冲、上游健康检查和内置轮询/最少连接负载均衡。Apache可以用mod_proxy做这个但配置更冗长,高流量下性能较低。

6个维度的深度对比

超越上面的功能表,这个表深入探讨了真正驱动VPS实际决策的维度 —— 流量模式、扩展行为和日常维护工作。

维度Nginx (事件驱动)Apache (进程/线程)
处理模型一个worker通过事件循环处理数千个连接(epoll/kqueue)每个连接一个进程或线程(Prefork/Worker/Event MPM)
静态文件(HTML/CSS/JS/图像)更快 —— 使用 sendfile() 直接从内核推送文件稍慢 —— 更多模块层开销
动态内容(PHP/Python)总是代理到PHP-FPM/上游;从不运行应用本身可以通过mod_php在进程内运行或代理到PHP-FPM
按目录配置(.htaccess)无 —— 配置集中在server块是 —— 可以按目录编辑而无需重载服务器
负载/慢客户端下的行为恒定RAM,即使长连接也不会OOMRAM随连接数扩展,有OOM风险
模块系统大多编译进去(自1.9.11起支持动态模块)运行时加载/卸载模块(a2enmod)

何时选择Nginx

Nginx适合以高吞吐量、处理大量连接和充当系统边界为中心的工作负载。这些是Nginx明确选择的场景:

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;
    }
}

何时选择Apache

Apache仍然是正确的 —— 有时更简单的选择,特别是当您的工作负载依赖.htaccess或围绕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>

一起使用两者(Nginx反向代理 + Apache后端)

一个流行的VPS设置既想要Nginx的速度又想要.htaccess的便利,将 Nginx放在前面(端口80/443) 服务静态文件和处理SSL终止,然后转发PHP/动态请求到 后端监听端口8080的Apache。

好处是:您获得Nginx的静态性能和连接处理而您的PHP应用保持使用其现有的.htaccess无需将每个规则改写成nginx配置。一个代理到Apache的Nginx配置示例:

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;
    }
}

注意:Apache必须从 X-Forwarded-For 头读取真实客户端IP(通过 mod_remoteip),否则其日志只显示 127.0.0.1。对于流量适中的个人VPS,这种两层设置可能太复杂 —— 选择一个并掌握它通常更容易维护。

决策指南 —— 按使用场景选择

一起使用两者(Nginx + Apache)

某些高级设置和主机面板(如LiteSpeed)运行 Nginx作为前端反向代理 + Apache在后端处理PHP(端口8080) —— 获得两个世界的最佳效果:Nginx快速处理静态文件和连接,Apache为PHP应用提供.htaccess。对于个人VPS使用这样做过于复杂 —— 选一个并精通它。

常见问题

Nginx真的比Apache更快吗?

对于提供静态文件和高并发感谢其事件循环和 sendfile() 更快。但对于动态内容(PHP),两者都使用PHP-FPM,差异可忽略 —— 前面有缓存层(CDN/Varnish/Redis)时,实际上差异更小。

Nginx可以使用.htaccess吗?

不能。Nginx没有像.htaccess那样的按目录配置概念。一切都必须在 /etc/nginx/ 下的server块中,这需要root访问和编辑后的 nginx -s reload。如果您的网站严重依赖.htaccess,迁移到Nginx意味着自己转换每个重写规则。

WordPress应该使用Nginx还是Apache?

两者都可以。Apache更简单因为漂亮链接从WordPress生成的.htaccess立即生效。Nginx在高流量下更快但您必须自己将 try_files $uri $uri/ /index.php?$args; 添加到server块。对于高流量网站,推荐Nginx + PHP-FPM。

我可以同时在一台机器上运行Nginx和Apache吗?

可以,这是一个流行的模式:Nginx在前面监听端口80/443提供静态和处理SSL,而Apache在后端监听端口8080通过现有.htaccess运行PHP。它们必须监听不同的端口,Apache应该设置 mod_remoteip 来读取真实客户端IP。

准备在VPS上安装Nginx或Apache吗?

AsiaGB VPS 起价 ฿500/月 —— Ubuntu 22.04 LTS、SSD、完全root访问。在几分钟内安装您喜欢的Web服务器。

查看所有VPS方案