2012-06-20 162 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