nginx 反向代理aws上服務的問題排查

現象

  • nginx反向代理了兩個服務A和B,其中A是本機,客戶端訪問正常;另外一個B經過proxy_pass轉發,地址是亞馬遜內部的域名。客戶端訪問無結果返回,超時。
  • 在nginx所在服務器curl B的域名是能夠正常訪問的。
  • 查看nginx日誌,error.log中有沒法與B服務域名對應的IP地址創建鏈接的錯誤日誌。
  • 重啓nginx 解決問題。客戶端訪問B服務正常。

緣由

  • nginx在啓動時會將域名對應的幾個IP地址保存起來,至關於對域名所對應的IP地址配置了負載均衡。
  • 亞馬遜雲上的服務域名對應的的IP地址會變。
  • 上述現象中,經nslookup獲得現有B的IP地址和錯誤日誌中的IP地址都不相同,因此nginx原來緩存的幾個IP地址目前都變了,沒有一個IP地址可用,因此沒法正常轉發。
  • 重啓nginx後,nginx從新解析域名對應的IP地址,獲得可用的IP地址列表,因而轉發正常。

解決方法

nginx.conf中增長定時解析域名對應的IP地址的配置,以下:nginx

# DNS server IP address, valid=300s means IP cache expire time, turn off IPv6 lookup
    resolver 10.2.0.2 valid=300s ipv6=off;

    # DNS resolve time out 
    resolver_timeout 10s;

# DNS服務器的IP地址經過/etc/resolv.conf獲得。緩存

這不是一個完美的解決方案。其實咱們應該設置的是域名對應的IP地址的有效時間。而不該該設置DNS服務的IP地址。若是resolver的值變的不可用了呢?爲什麼不能自動調用DNS服務獲取域名的IP呢?或許多網卡的狀況,nginx沒法知道要用哪一個resolver?或許nginx跨平臺兼容問題?那爲何若是不設置,nginx啓動以後卻能自動獲取到域名對應的IP並緩存呢?服務器

先這樣設一下吧,看看可否解決問題。負載均衡

參考: Nginx with dynamic upstreamscurl

相關文章
相關標籤/搜索