Apache 简介与架构
Apache 简介与架构
Apache HTTP Server 是世界上使用最广泛的 Web 服务器软件之一,自 1995 年以来一直在互联网基础设施中扮演重要角色。
1. 历史背景
1.1 起源与发展
Apache 最初由 NCSA httpd 服务器发展而来,名称源自 “A Patchy Server”(一个补丁服务器)。
| 年份 | 里程碑 |
|---|---|
| 1995 | Apache 0.6 发布 |
| 1996 | 成为最流行的 Web 服务器 |
| 1999 | Apache 基金会成立 |
| 2002 | Apache 2.0 发布,引入 MPM 架构 |
| 2005 | Apache 2.2 发布 |
| 2012 | Apache 2.4 发布(当前主要版本) |
1.2 市场地位
根据 Netcraft 调查,Apache 长期占据 Web 服务器市场份额的 30-40%。
2. 核心架构
2.1 模块化设计
Apache 采用高度模块化的架构:
┌─────────────────────────────────────┐
│ Apache 核心 │
├─────────────────────────────────────┤
│ MPM (Multi-Processing Module) │
├─────────────────────────────────────┤
│ 功能模块 (mod_*) │
├─────────────────────────────────────┤
│ 过滤器 (Filters) │
├─────────────────────────────────────┤
│ 协议处理 │
└─────────────────────────────────────┘
2.2 请求处理流程
- 连接接收:监听端口,接受 TCP 连接
- 请求解析:解析 HTTP 请求头
- URL 映射:将 URL 映射到文件系统
- 访问控制:检查访问权限
- 内容生成:读取文件或调用处理程序
- 响应发送:发送 HTTP 响应
- 日志记录:记录访问日志
3. 多处理模块(MPM)
MPM 是 Apache 2.x 的核心特性,决定了如何处理并发连接。
3.1 常见 MPM 类型
| MPM | 描述 | 适用场景 |
|---|---|---|
| prefork | 预派生进程模型 | 需要稳定性的传统应用 |
| worker | 多进程多线程模型 | 高并发场景 |
| event | 事件驱动模型 | 高并发长连接 |
| winnt | Windows 专用 | Windows 平台 |
3.2 MPM 配置示例
# 查看当前 MPM
apachectl -V | grep MPM
# 配置 MPM (httpd.conf)
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 250
MaxConnectionsPerChild 0
</IfModule>
<IfModule mpm_worker_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule>
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule>
3.3 MPM 选择指南
# 性能测试对比
ab -n 10000 -c 100 http://localhost/
# 监控进程/线程
ps aux | grep httpd
pstree -p | grep httpd
选择建议:
- Linux/Unix:优先选择
eventMPM(Apache 2.4+) - Windows:只能使用
winntMPM - PHP mod_php:必须使用
preforkMPM - PHP-FPM:可以使用
worker或eventMPM
4. 与 Nginx 的对比
4.1 架构差异
| 特性 | Apache | Nginx |
|---|---|---|
| 架构 | 进程/线程模型 | 事件驱动模型 |
| 并发处理 | 每个连接一个进程/线程 | 单线程异步处理 |
| 内存使用 | 较高 | 较低 |
| 动态内容 | 内置支持(mod_php) | 需要外部处理器 |
| 配置语法 | 指令式 | 声明式 |
| 模块加载 | 动态/静态 | 编译时静态 |
| .htaccess | 支持 | 不支持 |
4.2 性能对比
# 测试静态文件性能
# Apache
ab -n 10000 -c 100 http://apache-server/index.html
# Nginx
ab -n 10000 -c 100 http://nginx-server/index.html
# 测试动态内容性能
# Apache + mod_php
ab -n 1000 -c 50 http://apache-server/info.php
# Nginx + PHP-FPM
ab -n 1000 -c 50 http://nginx-server/info.php
4.3 适用场景
选择 Apache 当:
- 需要
.htaccess分布式配置 - 使用
mod_rewrite复杂重写规则 - 需要精细的访问控制
- 运行传统 PHP 应用(mod_php)
- 需要模块热加载
选择 Nginx 当:
- 高并发静态文件服务
- 反向代理负载均衡
- 微服务网关
- 资源受限环境
- 纯 API 服务
4.4 混合部署
客户端 → Nginx (前端代理) → Apache (后端应用)
# Nginx 配置示例
upstream apache_backend {
server 127.0.0.1:8080;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://apache_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
root /var/www/static;
expires 30d;
}
}
5. 业务场景
5.1 传统企业网站
- 使用 Apache + mod_php 运行 WordPress、Drupal 等 CMS
- 利用
.htaccess实现 URL 重写和访问控制
5.2 共享主机环境
- Apache 的虚拟主机和
.htaccess支持非常适合共享主机 - 每个用户可以独立配置自己的站点
5.3 开发测试环境
- Apache 的配置灵活性适合开发调试
- 模块热加载便于功能测试
6. 注意事项
- MPM 选择:生产环境务必选择合适的 MPM,默认的 prefork 性能较差
- 模块精简:只加载必要的模块,减少攻击面
- 版本选择:推荐使用 Apache 2.4.x,2.2 已停止维护
- 安全更新:定期检查并应用安全补丁
7. 扩展阅读
8. 总结
Apache HTTP Server 作为一个成熟的 Web 服务器,具有以下优势:
- 模块化架构,功能丰富
- 配置灵活,支持分布式配置
- 社区活跃,文档完善
- 兼容性好,应用广泛
在选择 Web 服务器时,应根据具体需求、团队技术栈和运维能力综合考虑。Apache 和 Nginx 并非互斥,混合部署往往是最佳实践。