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