nginx反向代理使用域名的緩存問題


一般情況下,我們使用nginx反向代理到后端用的是ip或者地址池。例如
location /api { 
    proxy_pass http://192.168.150.100:8000/api; 
    }

  或者

upstream myserver { 
    server 192.168.150.100:8000; #APP1 ip:port 
    server 192.168.150.101:8000; #APP1 ip:port 
    server 192.168.150.102:8000; #APP3 ip:port 
} 
...... 

location /api { 
    proxy_pass http://myserver/api; 
    proxy_set_header Host $http_host; 
}
這種情況不存在nginx緩存問題
但是有時候我們也會反向代理到域名上
location /api { 
    proxy_pass http://www.test.com:8000/api; 
}
  在我之前做的一個項目上就這樣做過,域名通過GTM解析,分發流量。而且最開始成功了,並沒有問題。但是在某次www.test.com域名指向的兩台服務器掛了一台之后,整個服務就出現問題,訪問不了。看日志nginx對www.test.com解析一直只指向一台服務器。
  重啟nginx之后,訪問才恢復正常。
  查閱資料之后對於代理反向指向域名的這種方式,nginx只會根據啟動時從服務器獲取的解析IP進行代理,直到下一次nginx重啟,或者reload。這樣一來其實GTM的流量分發並沒有意義,並且服務架構還存在隱患。
  那么如何讓nginx實時解析反向代理的域名呢?
  可以使用nginx的resolver。示例如下
server { 
    listen 8080; 
    server_name localhost; 
    resolver 114.114.114.114 223.5.5.5 valid=60s; 
    resolver_timeout 3s; 
    set $test "www.test.com"; 
    location /api { 
    proxy_pass http://$test; 
    } 
}
說明:
resolver:后接指定的DNS服務器。多個用空格隔開。resolver可以在http里面全局設定,也可以在server里面設定。
valid:DNS緩存時間。也可以不指定,緩存時間會默認根據域名的TTL時間
resolver_timeout:指定解析域名時,DNS服務器的超時時間
set :設置變量。在使用resolver之后,必須使用set設置變量來代替域名。否則會報錯。另外,set不能寫到 location里面否則不會生效。
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM