2012-06-20 114 views
1

是否可以配置nginx查询服务(而不是DNS),以确定基于当前请求的URI的proxy_pass目的地?nginx proxy_pass动态目的地

例如:

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

如果不支持,这将是做到这一点的好办法?我可以将proxy_pass传递给解析器+代理,但宁愿让nginx直接将代理处理到目标。请注意,需要查询解析器,因为每个URI的目标可能会更改。

感谢:-)

回答

1

我没有看到一种方法来实现你所要求的。

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

您可能还能够做到用mod_lua的东西,但它很可能是可怕的hackish。

+0

mod_lua看起来很有希望 - 可能使用ngx.location.capture来执行查找并为目标主机设置一个变量。 – Pavel

0

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

proxy_pass http://yourproxy:port; 

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

+0

感谢您的回复。我正在寻找一种不使用DNS的方式,而是为某个服务器(例如HTTP)编写更简单的方法。 nginx能否发出一个HTTP请求并将响应中的值拉入变量中?该变量可以在proxy_pass目的地中使用。 – Pavel

+0

这是非常奇怪的&破解配置。这样可以更好地了解SSI或为您使用内部头文件X-Accel-Redirect。实际上,您可以在proxy_pass指令中使用变量,但是对于标准模块,您无法将请求保存到变量中。 –

0

@Pavel 难道你有chanсe配置nginx的描述?我有一个类似的任务:在代理请求之前,必须定义哪个服务器可以处理它。到目前为止,我只看到了两种方式:如何为nginx实现一个自定义模块(查看“负载平衡”的完成方式)或使用应用服务器,并将一个将执行转发的应用程序的请求。

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

谢谢。

+0

我同意你列出的两个选项。我采用了应用服务器方法 - 实现起来非常简单,效果很好。如果是绝对巨大的流量,我会考虑定制nginx模块。 – Pavel

+0

@Pavel,我已联系nginx开发人员,他们建议使用X-Accel-Redirect。唯一要做的就是响应(在标题中)请求应该被重定向到的位置。我可以确认它是完美的。 – Ant