如何将 Apache 设置为 Docker 容器的反向代理

如何将 Apache 设置为 Docker 容器的反向代理

我努力将我的 Apache 服务器设置为包含 Docker 的反向代理绿灯实例。

在官方文档建议在 Docker 容器中运行 Greenlight,并使用 Nginx 实例作为反向代理(主要是为了方便与BBB 服务器)。但是,在我的设置中,我不想运行自己的 BBB 实例,而是使用 Greenlight 作为外部 BBB 服务器的前端。

但为了方便起见,我还是选择在 docker 容器中设置 Greenlight。

但由于我的服务器有很多用途(主要是用来提供几个网站和提供电子邮件帐户,均由弗罗克斯洛但它也可以作为一个矩阵服务器)我不想将 Nginx 设置为代理,因为这将迫使我大幅改变我实际运行的 Froxlor 管理的 Apache 设置。

因此我尝试将 Apache 配置为反向代理。不幸的是,文档中只有一个 Nginx 示例:

location /b {
  proxy_pass          http://127.0.0.1:5000;
  proxy_set_header    Host              $host;
  proxy_set_header    X-Forwarded-For   $proxy_add_x_forwarded_for;
  proxy_set_header    X-Forwarded-Proto $scheme;
  proxy_http_version  1.1;
}

location /b/cable {
  proxy_pass          http://127.0.0.1:5000;
  proxy_set_header    Host              $host;
  proxy_set_header    X-Forwarded-For   $proxy_add_x_forwarded_for;
  proxy_set_header    X-Forwarded-Proto $scheme;
  proxy_set_header    Upgrade           $http_upgrade;
  proxy_set_header    Connection        "Upgrade";
  proxy_http_version  1.1;
  proxy_read_timeout  6h;
  proxy_send_timeout  6h;
  client_body_timeout 6h;
  send_timeout        6h;
}

我尝试使用以下 VirtualHost 设置在 Apache 上完成此工作:

<VirtualHost MYIP:443>
  ServerName greenlight.example.com
ProxyPreserveHost On
ProxyRequests Off
ProxyVia On
ProxyPass / http://127.0.0.1:5000
ProxyPassReverse / http://127.0.0.1:5000   
<Location "/cable">
  ProxyPass / http://127.0.0.1:5000 connectiontimeout=6h timeout=6h
  ProxyPassReverse / http://127.0.0.1:5000
</Location>
</VirtualHost>

我偏离了示例,我不想使用虚拟子文件夹 »b«,而是使用子域 t 将特定流量重定向到本地端口5000。不幸的是,这不起作用。服务器返回

502 Prox error

Proxy Error

The proxy server received an invalid response from an upstream server.
The proxy server could not handle the request

Reason: Error reading from remote server

有人能向我解释一下这个错误的原因吗?如何将 Nginx Header 设置转换为 Apache 和其他超时设置,这些设置是否必要?

答案1

这里有几个问题:

  1. 顺序
    第一个匹配的路径获胜。由于您放置/在 之前/cable,因此/将始终匹配并且/cable永远不会被使用。
  2. 匹配尾部斜杠
    如果第一个参数以 结尾,ProxyPass/需要在第二个参数中添加一个,反之亦然。否则,您最终会得到发送到后端的无效 URL
  3. <Location>块内的 ProxyPass如果在 内
    使用,则只会获取第二个参数。第一个参数被 替换。ProxyPass<Location><Location>

例子:

<VirtualHost MYIP:443>
    ServerName greenlight.example.com
    ProxyPreserveHost On
    ProxyRequests Off
    ProxyVia On
    ProxyPass /cable http://127.0.0.1:5000 connectiontimeout=6h timeout=6h
    ProxyPassReverse /cable http://127.0.0.1:5000
    ProxyPass / http://127.0.0.1:5000/
    ProxyPassReverse / http://127.0.0.1:5000/
</VirtualHost>

最后,但并非最不重要的一点是,目前您正在将两个位置代理到同一个后端 URL。这通常是错误的。

相关内容