You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

虚拟主机ProxyPass下前端应用配置异常问题求助

问题分析

你的问题根源在于Apache反向代理的路径匹配顺序错误,加上前端API请求的循环代理,导致Apache的连接数被耗尽,最终触发MaxRequestWorkers上限和连接超时错误。

具体来说:

  • 当前Apache配置中,ProxyPass /是最宽泛的规则,会匹配所有请求(包括/admin、/api),后续的/admin规则根本不会生效。
  • 前端页面发起的/api请求被Apache转发到frontend容器,而frontend的ember-cli代理又将该请求转发到backend容器,这个过程中形成请求循环,导致Apache不断创建新连接,最终耗尽worker进程。
  • 之前后端端口映射为5004:80时,前端代理直接访问后端容器的内部端口,不经过Apache,因此没有循环问题;改为80:80后,容器间通信逻辑未调整,加上Apache规则错误,触发了循环。
解决方案

1. 调整Apache ProxyPass规则顺序

将更具体的路径规则(/admin、/api)放在最前面,确保优先匹配,避免根路径规则覆盖所有请求:

<VirtualHost *:80>
    ServerName cookie.com
    ServerAlias www.cookie.com

    # 优先匹配/api请求,直接转发到backend对应路径
    ProxyPass /api http://backend/ratata/backend/public/index.php/api
    ProxyPassReverse /api http://backend/ratata/backend/public/index.php/api

    # 匹配/admin请求,转发到admin容器
    ProxyPass /admin http://admin:8080/
    ProxyPassReverse /admin http://admin:8080/

    # 剩余所有请求转发到frontend
    ProxyPass / http://frontend:4200/
    ProxyPassReverse / http://frontend:4200/

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

注意:/api的转发路径要和前端实际调用的API路径匹配,确保backend能正确处理请求。

2. 关闭或调整前端ember-cli代理配置

既然Apache已经负责转发API请求到backend,前端的ember-cli代理无需保留,修改.ember-cli配置:

{
  // 移除或注释掉proxy配置
  // "proxy": "http://backend/ratata/backend/public/index.php"
}

如果开发环境需要保留代理,确保代理目标直接访问backend容器,不经过Apache:

{
  "proxy": "http://backend:80/ratata/backend/public/index.php"
}

3. 验证Docker网络和端口映射

  • 确保所有容器(Apache、backend、frontend、admin)在同一个Docker网络中,这样容器名可直接解析(比如http://frontend:4200能正常访问)。
  • 后端容器的80:80端口映射是宿主机端口,不影响容器间通信,容器间访问backend用http://backend:80即可。

4. 临时调整Apache的MaxRequestWorkers(可选)

如果调整规则后仍有worker耗尽问题,可临时调高MaxRequestWorkers值,编辑Apache的MPM配置文件(比如/etc/apache2/mods-available/mpm_prefork.conf):

<IfModule mpm_prefork_module>
    StartServers             5
    MinSpareServers          5
    MaxSpareServers         10
    MaxRequestWorkers       500  # 适当调高
    MaxConnectionsPerChild   0
</IfModule>

修改后重启Apache:

sudo systemctl restart apache2

这只是临时缓解方案,核心问题还是要解决代理循环。

验证步骤
  1. 重启Apache容器(或服务)加载新配置。
  2. 重启frontend容器确保代理配置生效。
  3. 访问http://localhost,检查页面资源和API请求是否正常加载,查看Apache日志是否还有错误。

内容的提问来源于stack exchange,提问作者Ramix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 18:37:43