设项目为Apache DocumentRoot时访问子目录报ERR_CONNECTION_REFUSED
异常根本成因
你遇到的连接错误并不是目录权限或网络配置导致的,核心是两处Apache配置的硬冲突:
- 同时加载了两个互斥的MPM多处理模块:
mpm_event_module和mpm_prefork_module。Apache 2.4架构中MPM是决定进程/线程运行模型的核心组件,同一时间仅允许加载一个。双模块共存时,Apache启动阶段不会直接抛出致命错误,根目录下的简单请求可能被兼容逻辑正常处理,但一旦处理子目录下需要PHP解析的动态请求时,就会触发进程上下文冲突,直接导致worker进程崩溃、中断TCP连接,浏览器就会收到ERR_CONNECTION_REFUSED的报错。这也能解释你把DocumentRoot切到上层Sites目录时所有请求恢复正常的现象——此时请求匹配到上层目录的配置规则,双MPM的冲突分支不会被触发。 - 项目根目录对应的
<Directory>配置块为空,没有配置Apache 2.4要求的显式访问授权规则。根目录文件能临时正常访问,是因为请求匹配到了上层~/Sites目录的默认权限规则;一旦访问子目录路径,会优先匹配到你写的空Directory块,触发访问控制模块的默认异常退出逻辑,进一步加剧连接中断的问题。
配置调整步骤
按以下顺序调整即可完全复现生产环境的访问逻辑:
- 注释掉不兼容的MPM模块
你加载的是PHP 7.2版本的模块,该版本和prefork运行模型完全兼容,和event模型存在兼容问题,因此保留mpm_prefork_module,在配置文件找到对应行前面加#注释:
同时可以删掉配置里两个空的IfModule判断块,这两段配置没有实际运行逻辑,属于冗余内容。# LoadModule mpm_event_module lib/httpd/modules/mod_mpm_event.so - 补全项目根目录的Directory授权配置
按照Apache 2.4的标准要求,在你之前写的空Directory块内补充完整访问规则:DocumentRoot "/Users/brendan/Sites/UK_Libraries_Site" <Directory "/Users/brendan/Sites/UK_Libraries_Site"> Options Indexes FollowSymLinks MultiViews AllowOverride All Require all granted </Directory> - 校验并重启服务
配置修改完成后,先执行配置语法校验命令,确认无报错后再重启Apache,避免配置错误导致服务启动失败:# 配置语法校验 httpd -t # 校验返回Syntax OK后重启服务 sudo apachectl restart - 异常兜底排查
如果调整后仍有访问异常,可直接查看Apache错误日志定位问题,日志默认路径为/private/var/log/apache2/error_log,双MPM冲突的场景下,日志中一般会记录worker进程异常退出、模块上下文不匹配类的报错。
内容的提问来源于stack exchange,提问作者Brendan Jackson
相关产品推荐
相关产品推荐

