2015-10-19 131 views
6

我想代理一個請求到另一臺使用proxy_pass的服務器,同時刪除匹配的路徑前綴。我相信這樣做的一種方式如下:NGINX proxy_pass刪除路徑前綴並解析DNS

location /a/ { 
    proxy_pass https://website.com/ 
} 

例如, http://localhost/a/b.html的請求將代理到https://website.com/b.html

據我所知在NGINX上的非商業版本中的問題是website.com的DNS A記錄將在啓動時被永久加載和緩存。我已經看到了一種技術,通過在proxy_pass指令中使用諸如$request_uri的變量來解決此問題,從而迫使NGINX根據記錄的TTL重新解析DNS。

E.g.

location /a/ { 
    rewrite ^/a/(.*) /$1 break; 
    proxy_pass https://website.com/$request_uri 
} 

不幸的是,似乎上述不起作用,因爲它似乎仍然通過/ a /前綴到上游。

基本上我想要在這裏實現的是代理一個請求,同時刪除路徑前綴,以便DNS記錄不會永久緩存。

謝謝。

回答

11

我不確定你在哪裏看到它,但只是專門使用$request_uri肯定不會神奇地讓nginx動態地爲你解析域名。

也許建議明確使用變量,如$uri(這是一個不同的變量),假設當變量在使用時,那麼域名每次單獨解析,沒有任何緩存?我不確認或否認這樣的假設是否正確,但以下至少會爲您擺脫/a

location /a/ { 
    rewrite ^/a/(.*) /$1 break; 
    proxy_pass https://website.com/$uri$is_args$args; 
} 

(請注意,如果它確實實現不緩存域名,那麼你可能也想運行一個本地解析器,否則,你的託管服務提供商的DNS的額外延遲和停機將立即影響到你的網站,更何況他們的服務器的可能的DNS查詢限制。)


也許一個更好的解決辦法是定期重啓nginx的自動拿起DNS的變化?例如,nginx -s reloadkill -HUP?正如在http://nginx.org/en/docs/beginners_guide.html#controlhttp://nginx.org/en/docs/control.html#reconfiguration中所解釋的那樣,nginx在重載期間從不停止處理任何請求,所以它應該是安全操作;而且它很可能也會導致DNS被刷新。

+0

謝謝你的回覆,我今天會測試一下,如果它能正常工作,我會標記接受的答案。我發現以前關於解決方案的建議[這裏](http://gc-taylor.com/blog/2011/11/10/nginx-aws-elb-name-resolution-resolvers)。我相當確信,在解決DNS問題上,這具有「預期」的效果,因爲如果沒有這種情況,每隔幾天左右上游就不再可用,我需要重新啓動。我已經運行了3個多月,現在沒有重新啓動,並且自從進行更改以來我沒有遇到任何DNS問題。 –

+0

呵呵,是的,如果nginx在proxy_pass內存在任何變量的情況下解決了所有主機名的5分鐘緩存,那將是有道理的;它實際上甚至以這種方式記錄下來,但它並不十分明確!每天學習! :-)因此,我想上面的應該可以工作,你甚至應該在'.com'之後去掉'/',例如''。com $ uri' – cnst

+0

因此,初步測試似乎可以與你原來的建議'重寫^/a /(.*)/ $ 1 break; proxy_pass https://website.com/$uri$is_args$args;)'但與剛'.COM $ uri'(查詢參數不會傳播到上游OK,我會第一建議堅持謝謝對於回覆! –