apache请求处理是一套分8阶段、模块可插拔、request_rec贯穿全程的精密流水线:从post_read_request到logging/cleanup,各阶段职责明确、顺序固定,mpm仅影响并发模型而不改变流程逻辑。

Apache 请求处理不是“收到请求就发回页面”,而是一套分阶段、可插拔、状态贯穿的精密流水线。核心在于 request_rec 结构体携带完整上下文,从 TCP 连接建立开始,到日志落盘结束,每个环节由模块在固定钩子上介入,配置逐级继承生效。
8 个关键处理阶段各司其职
Apache 将请求划分为 8 个严格顺序的逻辑阶段,模块按需注册钩子参与:
- post_read_request:刚读完原始请求行和头部,URI 尚未解码,适合做协议升级(如强制 HTTPS)、拦截异常 User-Agent
-
uri_translation:对 URI 解码、标准化路径(如移除
./、../),执行Alias、RewriteRule,生成filename或标记为代理目标 -
map_to_storage:确认资源落脚点——是磁盘文件、PHP 脚本,还是
proxy:地址;同时触发目录级配置(如.htaccess)合并与权限检查 -
header_parse:解析并标准化请求头(如合并重复
Accept、提取Authorization凭据),mod_setenvif和mod_ssl在此工作 -
access_checker:基于 IP、Referer、时间等做粗粒度放行/拒绝(如
Require ip 10.0.0.0/8) -
check_user_id:验证身份,调用
mod_auth_basic解析 Base64 用户密码 -
auth_checker:检查用户是否被授权访问该资源(如
Require group admins),任一失败即返回 403 -
fixups / response / logging:设置 MIME 类型、添加响应头、启用压缩、调用处理器(如
mod_php),最后记录日志并清理内存
模块化架构靠钩子与 request_rec 驱动
所有功能都以模块形式存在,不硬编码进核心。每个模块通过注册钩子函数,在指定阶段被调用。整个流程中,request_rec 是唯一上下文载体,字段如 uri、filename、user、status 动态更新,确保各阶段看到一致的状态。配置指令(如 Require、SetEnvIf)也绑定到对应钩子,实现“在哪写,就在哪生效”。
Apache 2.4.62 官方 tar.gz 源码包是 Linux 及类 Unix 系统构建 Web 服务器的核心基础。通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
MPM 决定并发模型,不影响请求阶段逻辑
prefork(多进程)、worker(多线程)、event(事件驱动)这三种 MPM 只负责连接调度和资源分配,不改变上述 8 个阶段的执行顺序与语义。无论用哪种 MPM,一个请求始终按相同路径流转,只是背后执行它的进程/线程/事件循环不同。这也解释了为何模块开发只需关注钩子逻辑,无需适配底层并发模型。
真实请求走一遍:从 /blog/post.php?id=123 到 HTML 响应
客户端发起请求后:
- MPM 接收连接,交由协议模块调用
ap_read_request()构建初始request_rec - 进入
uri_translation:解码%20,重写规则可能把路径映射为/var/www/html/index.php?path=blog/post - 进入
map_to_storage:发现filename指向 PHP 文件,且mod_php已启用 → 标记为动态内容 - 经过访问控制与认证后,在
response阶段调用 PHP 处理器,执行脚本生成 HTML - 最后由
mod_mime设置Content-Type: text/html,mod_deflate可选压缩,mod_log_config记录访问日志










