【问题标题】:nginx proxy_pass dynamic destinationnginx proxy_pass 动态目的地
【发布时间】:2012-06-22 20:57:54
【问题描述】:

是否可以将 nginx 配置为查询服务(不是 DNS),以根据当前请求的 URI 确定 proxy_pass 目标?

例如:

  1. 客户端请求http://somesite.tld/somepage,需要代理。
  2. nginx 连接到解析服务并发送用于确定代理目的地的请求 URI。
  3. 解析服务做出响应,提供目标的主机名。
  4. 客户端的请求被重定向到给定的目的地。

如果不支持,有什么好的方法可以做到这一点?我可以将 proxy_pass 传递给解析器+代理,但更愿意让 nginx 直接处理到目的地的代理。请注意,需要查询解析器,因为每个 URI 的目的地可能会发生变化。

谢谢:-)

【问题讨论】:

    标签: nginx


    【解决方案1】:

    我看不到实现您所要求的方法。

    但是,如果您只是想将请求 args 映射到主机名(并且它们不会发生太大变化),那么您可能会使用 Nginx 的 map module

    您也可以使用mod_lua 做一些事情,但它可能会非常骇人听闻。

    【讨论】:

    • mod_lua 看起来很有希望——可能使用 ngx.location.capture 来执行查找并使用目标主机设置变量。
    【解决方案2】:

    这是完全支持的盒子。在 *proxy_pass* 指令中使用域名。例如:

    proxy_pass http://yourproxy:port;
    

    之后,您可以配置您的 DNS 并根据需要更改 yourproxy 地址。

    【讨论】:

    • 感谢您的回复。我正在寻找一种不使用 DNS 的方法,而是寻找一种更简单的方法来编写服务器(例如 HTTP)。 nginx 可以发出 HTTP 请求并将响应中的值提取到变量中吗?然后可以在 proxy_pass 目标中使用该变量。
    • 这是一个非常奇怪的黑客配置。这将更好地查看 SSI 或为您使用内部标头 X-Accel-Redirect。实际上您可以在 proxy_pass 指令中使用变量,但使用标准模块您无法将请求保存到变量。
    【解决方案3】:

    @帕维尔 你有机会按照描述配置 nginx 吗?我有一个类似的任务:在代理请求之前,必须定义哪个服务器可以处理它。到目前为止,我只看到两种方法可以做到这一点:要么为 nginx 实现一个自定义模块(查看如何完成“负载平衡”的来源),要么使用应用程序服务器并组合一个将执行转发的应用程序请求数。

    后一种方法似乎更简单,但我不确定性能。

    谢谢。

    【讨论】:

    • 我同意您列出的两个选项。我采用了应用服务器方法——实现起来非常简单,而且效果很好。如果是为了绝对巨大的流量,我会考虑使用自定义 nginx 模块。
    • @Pavel,我已经联系了 nginx 开发人员,他们建议使用 X-Accel-Redirect。唯一要做的就是响应(在标头中)应该将请求重定向到的位置。我可以确认它工作正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    相关资源
    最近更新 更多