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

Apache2域名子路径反向代理至多LXC容器的配置问题求助

Apache2域名子路径反向代理至多LXC容器的配置问题求助

大家好,我目前遇到了Apache反向代理配置的难题,想请各位帮忙出出主意。先交代下我的环境:

  • 服务器上安装了 Apache/2.4.56 (Debian)
  • 配置了NoIP域名 http://example.com
  • 部署了多个LXC容器,每个容器跑着不同的Web应用

我的核心需求是实现域名子路径到对应LXC容器的反向代理,具体映射关系如下:

  • example.com/app1 → LXC容器1(运行Zend2),容器IP:10.0.3.101
  • example.com/app2 → LXC容器2(运行Laravel 5),容器IP:10.0.3.102
  • example.com/app3 → LXC容器3(运行Mattermost)
  • example.com/app4 → LXC容器4(运行Plex)
  • example.com/app5 → LXC容器5(运行Laravel 10)
  • example.com/app6 → LXC容器5(运行Psono)
  • ...以此类推,example.com/appN 对应到LXC容器N

接下来我分享下自己尝试过的几种配置方法,以及遇到的问题:

第一种尝试方法

我先写了最基础的反向代理配置:

<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass             "/app1"       "http://10.0.3.101"
ProxyPassReverse      "/app1"       "http://10.0.3.101"
</VirtualHost>

问题来了:访问 example.com/app1 时,页面跳转到了 example.com/auth/index/index,丢失了/app1前缀,本该是 example.com/app1/auth/index/index才对,感觉ProxyPassReverse没起作用?

第二种尝试方法

我给配置加了一行ProxyPassReverse "/app1" "/":

<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass             "/app1"       "http://10.0.3.101"
ProxyPassReverse      "/app1"       "http://10.0.3.101"
ProxyPassReverse      "/app1"       "/"
</VirtualHost>

这次单个app1的访问完全正常!但问题是我有多个LXC容器,需要同时配置多个子路径,于是我尝试了第三种方法。

第三种尝试方法

我把多个容器的代理配置写到同一个VirtualHost里:

<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass             "/app1"       "http://10.0.3.101"
ProxyPassReverse      "/app1"       "http://10.0.3.101"
ProxyPassReverse      "/app1"       "/"
ProxyPass             "/app2"       "http://10.0.3.102"
ProxyPassReverse      "/app2"       "http://10.0.3.102"
</VirtualHost>

测试下来example.com/app1是正常的,但app2出问题了。容器2里的Laravel应用按钮原本的action是action="{{ route('login') }}",解析后变成了example.com/login,我手动改成了action="example.com/app2/login",结果点击登录按钮后,路径变成了example.com/app1/app2/login,完全不对!

第四种尝试方法

我去掉了app1那行ProxyPassReverse "/app1" "/",配置改成这样:

<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass             "/app1"       "http://10.0.3.101"
ProxyPassReverse      "/app1"       "http://10.0.3.101"
ProxyPass             "/app2"       "http://10.0.3.102"
ProxyPassReverse      "/app2"       "http://10.0.3.102"
</VirtualHost>

结果example.com/app1又回到了之前的问题,直接跳转到example.com/auth/index/index,丢失了/app1前缀。而app2那边,手动修改action后,访问example.com/app2能看到欢迎页,点击登录进入example.com/app2/login,但登录后页面变成example.com/app2/#,而且大量CSS、JS和图片都加载失败了。

之后我又尝试了各种修改,都没解决问题,下面是我试过的其他配置尝试:

尝试1:用Rewrite规则

RewriteEngine On
RewriteCond %{HTTP_HOST} ^10\.0\.3\.101$
RewriteRule ^/(.*)$ example.com/app1/$1 [P,L]
RewriteCond %{HTTP_HOST} ^10\.0\.3\.102$
RewriteRule ^/(.*)$ example.com/app2/$1 [P,L]

没用,问题依旧。

尝试2:基于响应内容的Rewrite

RewriteEngine On
RewriteCond %{RESPONSE} ^.*app1.*
RewriteRule ^/app1/(.*)$ /app1/$1 [P,L]
RewriteCond %{RESPONSE} ^.*app2.*
RewriteRule ^/app2/(.*)$ /app2/$1 [P,L]

还是不行。

尝试3:基于请求URI的Rewrite

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/app1/
RewriteRule ^/app1/(.*)$ example.com/app1/$1 [P,L]
RewriteCond %{REQUEST_URI} ^/app2/
RewriteRule ^/app2/(.*)$ example.com/app2/$1 [P,L]

没效果。

尝试4:用ProxyHTML模块

ProxyHTMLEnable On
ProxyHTMLExtended On
ProxyHTMLURLMap http://10.0.3.101 example.com/app1
ProxyHTMLURLMap http://10.0.3.102 example.com/app2

依然没能解决路径跳转的问题。

尝试5:用Substitute模块替换内容

AddOutputFilterByType SUBSTITUTE text/html
Substitute "s|http://10\.0\.3\.101|example.com/app1|n"
Substitute "s|http://10\.0\.3\.102|example.com/app2|n"

还是没解决问题。

尝试6:修改请求头的Location字段

RequestHeader edit Location ^http://10\.0\.3\.101(.*)$ example.com/app1$1
RequestHeader edit Location ^http://10\.0\.3\.101(.*)$ example.com/app2$1

依旧失败。

现在我实在没思路了,有没有大佬能给我一些新的尝试方向?真的非常感谢!另外如果这个配置搞定了,我之后还想把HTTPS也配置上。

P.S.:我不太想用端口访问,觉得用子路径的方式更规范。

备注:内容来源于stack exchange,提问作者Lethal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 07:54:38