核心设计理念差异
在深入参数之前,理解两者的设计哲学至关重要,这决定了你应该如何思考它们的配置。

(图片来源网络,侵删)
| 特性 | Apache | Nginx |
|---|---|---|
| 架构模型 | 进程/线程驱动 (Process/Thread-Driven) | 事件驱动 (Event-Driven) |
| 工作方式 | 每个连接(或每个请求)通常会消耗一个进程或线程,当并发量高时,系统资源消耗会急剧增加。 | 使用少量工作进程,通过高效的 I/O 多路复用(如 epoll, kqueue)来处理成千上万的并发连接。 |
| 优点 | 稳定、成熟,模块化程度极高,功能非常全面(.htaccess处理等),配置直观,易于上手。 |
高性能、高并发、低内存消耗,在处理静态文件和反向代理方面表现卓越,配置简洁,逻辑清晰。 |
| 缺点 | 高并发下性能瓶颈明显,内存占用较高。 | 处理能力相对较弱(通常需要配合后端应用服务器)。 |
| 适用场景 | 传统网站、需要大量 .htaccess 的虚拟主机环境、作为功能强大的应用服务器(如 PHP-FPM)。 |
高流量网站、API 网关、反向代理、负载均衡、静态资源服务器。 |
核心配置文件与模块
Apache
- 主配置文件:
/etc/httpd/conf/httpd.conf(RHEL/CentOS) 或/etc/apache2/apache2.conf(Debian/Ubuntu) - 虚拟主机配置: 通常在
conf-available/和conf-enabled/目录下,通过Include或IncludeOptional引入。 - 目录级配置:
.htaccess文件,允许用户在不修改主配置文件的情况下,对特定目录进行配置。 - 模块: 通过
LoadModule指令动态加载,LoadModule mod_rewrite.so。
Nginx
- 主配置文件:
/etc/nginx/nginx.conf - 虚拟主机配置: 通常放在
/etc/nginx/conf.d/或/etc/nginx/sites-available/目录下,在nginx.conf中通过include指令引入。 - 目录级配置: Nginx 没有
.htaccess机制,所有配置必须在主配置文件或其包含的文件中完成,以保证性能和清晰性。 - 模块: 编译时静态编译或通过
--add-module动态添加。
关键功能参数对比详解
监听端口与服务器
这是最基础的配置,两者语法非常相似。
| 功能 | Apache 配置示例 | Nginx 配置示例 | 说明 |
|---|---|---|---|
| 监听端口 | Listen 80 |
listen 80; |
Apache 的 Listen 指定服务器监听的地址和端口,Nginx 的 listen 在 server 块内,指定虚拟主机监听的地址和端口。 |
| 服务器名称 | ServerName example.com |
server_name example.com; |
定义虚拟主机的主机名。 |
| 虚拟主机 | <VirtualHost *:80><br> ServerName example.com<br> ...<br></VirtualHost> |
server {<br> listen 80;<br> server_name example.com;<br> ...<br>} |
Apache 使用 <VirtualHost> 块,Nginx 使用 server 块。 |
网站根目录与首页
| 功能 | Apache 配置示例 | Nginx 配置示例 | 说明 |
|---|---|---|---|
| 网站根目录 | DocumentRoot "/var/www/html" |
root /var/www/html; |
指定网站文件存放的根目录。 |
| 默认首页 | DirectoryIndex index.html index.php |
index index.html index.php; |
定义按顺序查找的默认文件名。 |
虚拟主机(基于域名)
这是最常见的场景。
Apache (httpd.conf 或虚拟主机配置文件):
<VirtualHost *:80>
ServerName www.example.com
ServerAlias example.com
DocumentRoot "/var/www/example.com"
ErrorLog "/var/log/httpd/example.com_error.log"
CustomLog "/var/log/httpd/example.com_access.log" combined
</VirtualHost>
Nginx (/etc/nginx/conf.d/example.com.conf):
server {
listen 80;
server_name www.example.com example.com;
root /var/www/example.com;
index index.html;
access_log /var/log/nginx/example.com_access.log;
error_log /var/log/nginx/example.com_error.log;
# 其他 location 配置...
}
URL 重写
两者都使用 mod_rewrite 和 ngx_http_rewrite_module,语法基本兼容。
Apache (通常在 .htaccess 或虚拟主机配置中):
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
Nginx (在 server 或 location 块中):
server {
# ... 其他配置 ...
location / {
try_files $uri $uri/ /index.php?$query_string;
}
}
- 注意: Nginx 的
try_files是一个非常强大且高效的指令,通常比 Apache 的RewriteRule组合更简洁高效,用于检查文件或目录是否存在,不存在则重定向。
反向代理
这是 Nginx 的强项,配置非常简洁。
场景: 将 example.com/api 的所有请求转发到后端的 Tomcat 服务器 (localhost:8080)。
Apache (需要 mod_proxy 和相关模块):
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass /api http://localhost:8080/api
ProxyPassReverse /api http://localhost:8080/api
</VirtualHost>
Nginx (语法更清晰):
location /api {
proxy_pass http://localhost:8080;
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;
}
- 说明: Nginx 的
proxy_pass指令非常直接,并且可以轻松处理头部信息的转发。
静态文件服务
Nginx 在这方面性能远超 Apache。
Apache (通常需要额外配置):
<Directory "/var/www/static">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
Nginx (天生高效):
location /static/ {
alias /var/www/static/; # alias 指定精确路径
# root /var/www; # 如果用 root,则路径是 /var/www/static/
expires 30d; # 设置缓存过期时间
add_header Cache-Control "public, no-cache";
}
- 说明: Nginx 处理静态文件的 I/O 效率极高,非常适合作为 CDN 或静态资源服务器。
性能优化参数
| 功能 | Apache 配置示例 | Nginx 配置示例 | 说明 |
|---|---|---|---|
| 工作模式/进程数 | StartServers 5MinSpareServers 5MaxSpareServers 10MaxRequestWorkers 150MaxConnectionsPerChild 0 |
worker_processes auto;worker_connections 1024; |
Apache (MPM - Prefork): 控制子进程的创建和销毁。 Nginx: worker_processes 通常设置为 CPU 核心数。worker_connections 是每个 worker 能处理的最大并发连接数,总并发数约等于 worker_processes * worker_connections。 |
| 连接超时 | KeepAlive OnKeepAliveTimeout 5MaxKeepAliveRequests 100 |
keepalive_timeout 65;keepalive_requests 100; |
控制持久连接(长连接)的设置,减少 TCP 握手开销,提升性能。 |
| 请求体大小 | LimitRequestBody 20M |
client_max_body_size 20M; |
限制客户端上传文件的大小。 |
总结与选择建议
| 对比维度 | Apache | Nginx |
|---|---|---|
| 配置风格 | 分散式(.htaccess),适合小型项目,但生产环境不推荐。 |
集中式(nginx.conf),强制配置清晰,适合大型和高并发场景。 |
| 静态文件 | 性能一般。 | 性能极高,首选。 |
通过 mod_php 等模块直接处理,集成度高。 |
通常作为反向代理,将请求转发给 PHP-FPM, Tomcat, Node.js 等,本身不处理。 | |
| 反向代理 | 功能强大,但配置相对复杂。 | 功能强大且配置简洁,业界标准。 |
| 并发能力 | 较低,受限于进程/线程模型。 | 非常高,受限于事件驱动模型。 |
| 学习曲线 | 对于新手,.htaccess 模式可能更直观。 |
配置逻辑性强,需要一次性理解整个配置结构。 |
如何选择?
-
选择 Nginx 的场景:
- 高流量网站: 如门户网站、电商平台、内容分发网络。
- API 服务: 需要高效处理大量短连接请求。
- 反向代理/负载均衡: 需要统一入口,将请求分发到后端多个应用服务器。
- 纯静态网站: 如博客、文档站、企业官网。
- 作为前端: 在 Apache 前面放置一个 Nginx,用 Nginx 处理静态文件和反向代理,Apache 处理动态内容(混合架构)。
-
选择 Apache 的场景:
- 传统应用或老旧系统: 如果系统深度依赖
.htaccess且难以迁移。 - 虚拟主机环境: 为大量用户提供独立的、隔离的虚拟主机空间,且用户需要自己管理配置。
- 作为应用服务器: 直接使用
mod_php运行 PHP 应用,配置简单直接,无需额外配置 PHP-FPM。 - 功能需求极其复杂: 需要使用一些 Apache 独有的、Nginx 没有或实现困难的模块。
- 传统应用或老旧系统: 如果系统深度依赖
在现代架构中,最常见的模式是 Nginx + Apache (或其他应用服务器) 的组合,取两者之长,这也是目前性能和灵活性最高的方案之一。
