由Nginx的DNS緩存導致的訪問404


 

 

現象

訪問某個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


免責聲明!

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



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