現象
訪問某個URL出現404,而且全站都是404。透過日誌檢視Nginx的規則也正確,請求被代理到指定位置。
排查
最近針對這個站點沒有修改過Nginx配置也沒有站點升級。所以應該是其他原因。
首先PING代理到的域名,發現可以解析
檢視日誌
發現解析的2個地址都返回502,這裡[ip,ip]是因為第一個訪問失敗才走的第二個,最後2個都失敗了,後端返回502,然後Nginx給前端重定向到自定義的404頁面。
仔細一觀察發現PING解析的IP和Nginx日誌解析的IP不同。因為我們這裡代理是透過域名,所以後端IP不可控,懷疑是Nginx快取了DNS解析,後端變化而Nginx沒有更新所導致,顧首先重啟一下Nginx服務。
重新訪問並檢視日誌
總結
這種問題通常發生在Nginx代理使用代理到域名的情況下發生,尤其是代理到一個第三方的地方,它的域名解析出來的IP可能會更換(出於安全考慮),而Nginx本身有DNS快取機制,預設你可以不配置,這樣它快取DNS解析的時長就是它透過查詢DNS伺服器獲得記錄的TTL時間。
DNS快取時長
DNS快取有作業系統級別也有應用程式級別,OS級別都有生存時間,時間到了就會重新整理快取(有時候根據需要我們也會強刷)。所以你有時候需要配置。預設情況下Nginx的resolver 沒有配置,也沒有設定valid時間,那麼Nginx快取這條解析的時長就是它首次查詢DNS時從DNS伺服器響應中獲得的,得到之後這段時間就不會再查詢,當過期之後它再查詢得到結果再快取,所以如果一條DNS記錄解析在Nginx快取這個週期內變更,雖然你在系統上PING看到的新的IP,但是Nginx由於快取時長沒有過期所以它還會用老的IP。
比如在應用程式級別:以谷歌瀏覽器為例,它有一個DNS快取機制為例加快連線速度。
chrome://net-internals/#dns