Apache:代理到URL中命名的Unix套接字

8
我正在构建一个设置,其中主机运行一堆Docker容器,用于测试不同的代码分支,并且我想访问容器中正在运行的Web服务器。
所有容器都在主机上运行。每个容器通过主机上的Unix套接字提供Web应用程序,例如/var/sockets/
我的目标是让主机上的Apache根据URL代理到容器,以便当我执行 GET https://<host>.com/<socket_name>/my_url时,Apache会将请求代理到名为<socket_name>的容器: GET https://<host>.com/my_url。也就是说,它识别出URL中的套接字名称,重写URL并将其发送到该套接字。
这种做法可行吗?我仍在阅读文档,但似乎找不到任何提示。

Apache自2.4.x版本开始支持代理到Unix套接字。具体来说,我通过谷歌搜索找到了你的问题。 :-) - peterh
1个回答

6

根据网上的多篇文档,思路是通过两步操作结合 mod_proxymod_rewrite 实现:首先处理URL以提取出套接字名称并将其重写为不包含该部分的形式,然后基于新(缩短的)URL和套接字名称进行代理。

下面是可能的实现方式:

RewriteEngine On
RewriteRule      /(.*)/(.*)  http://%{HTTP_HOST}/$2    [P]
ProxyPass        /           unix:/var/sockets/$1.sock|http://%{HTTP_HOST}/
ProxyPassReverse /           unix:/var/sockets/$1.sock|http://%{HTTP_HOST}/

我根据(.*)表达式提出建议,该表达式将提取两个感兴趣的参数。然后,我们重新编写URL,并通过P标志表示结果将传递给代理。之后,我们指定两个相同的ProxyPassProxyPassReverse,并指定Unix套接字路径、管道|分隔符和主机基地址。
我希望这可以起作用或者至少给你一些关于我们要寻找什么的草图。

我会看看是否有时间尝试这个。同时,我创建了一个小的Python Web应用程序,仅简单地重定向URL。 - Eldamir
好的,Python Web 应用程序也可能是一个合适的解决方案。 - user8549610
你可能想要在第一个正则表达式组中使用(\w+),以确保不匹配任何恶意字符串,这些字符串可能用于访问您所期望之外的其他文件。 - Daniel Böhmer
这对我不起作用,因为套接字路径中的“$1”没有被替换,而是尝试打开一个具有文字“$1”的套接字路径。我已经使用LocationMatchProxyPassMatch 实现了同样的效果,但是据说mod_rewrite更强大。如何启用“$1”的插值? - Daniel Böhmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接