【问题标题】:Apache: proxy to unix socket named in URLApache:URL 中命名的 unix 套接字的代理
【发布时间】:2016-02-26 12:44:01
【问题描述】:

我正在构建一个设置,其中主机运行一堆 Docker 容器来测试不同的代码分支,我想访问容器中正在运行的网络服务器。

所有容器都在host 上运行。每个容器通过主机上的 unix 套接字为 Web 应用程序提供服务,例如/var/sockets/<socket_name>.

我想要的是host上的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 套接字。究竟如何,嗯......我发现你的问题正在寻找谷歌的答案。 :-)

标签: apache sockets unix proxy


【解决方案1】:

基于网上的各种文档,想法是将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套接字路径、管道|分隔符和主机基地址。

我希望这可以工作,或者至少给你一些我们应该寻找什么的草图。

【讨论】:

  • 我看看能不能抽出时间试试这个。与此同时,我创建了一个简单的重定向 url 的小型 python webapp
  • 好的,Python webapp 也可能是一个合适的解决方案。
  • 您可能希望将(\w+) 用于第一个正则表达式组,以确保没有匹配可能用于访问您预期之外的其他文件的恶意字符串。
  • 这对我不起作用,因为套接字路径中的 $1 未被替换,而是尝试打开带有文字 $1 的套接字路径。我已经用LocationMatchProxyPassMatch 实现了同样的效果,但是mod_rewrite 被告知要更强大。如何启用$1的插值?
猜你喜欢
  • 2017-02-06
  • 2016-07-31
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
相关资源
最近更新 更多