記一次 hosts 檔案配置錯誤導致應用卡頓的奇葩問題

myhui0926發表於2021-06-18

今天將一個專案的原始碼拉下來,使用新的 Laravel-Sail 開發環境,之前的 Homestead 開發環境現在僅做備用了。剛開始一切都很順利,依賴安裝、容器啟動、資料遷移,然後我高高興興的將開發用的域名配置到 hosts 檔案中:

127.0.0.1 devocus.test

開啟瀏覽器,訪問: http://devocus.test:8016,本以為一切順利,但是卻發現頁面一直處於載入狀態,隔了差不多 30 秒才將完整的介面載入出來,我百思不得其解,其他幾個專案我都是用的 Laravel-Sail 開發環境,幾乎都是秒開,這個專案是腫麼了:flushed:
然後我開啟瀏覽器開發者工具,發現所有的請求都需要 30 秒以上,難道遇到了檔案 IO 問題?但是我專案是放在 Ubuntu 子系統中的呀。網路問題?那其他幾個專案又完全正常呀。我嘗試著各種可能的解決辦法,改檔案許可權、關閉ladder、刪除並重新建立容器等等,一頓折騰下來,毫無結果。
於是安裝了 Telescope,檢視每個請求的詳細情況,開啟 Telescope 速度也非常慢,我等待了大概一分鐘,Telescope 的介面終於載入出來了。但是查詢結果令我非常意外:

記一次 hosts 檔案配置錯誤導致的應用卡頓問題

Telescope 顯示,每個請求的處理速度都很快,資料查詢也很快,我佛了…:smiley_cat:
於是找同事的電腦試一下,開發環境都是 Laravel-Sail 沒想到他的電腦上訪問也同樣十分緩慢,這直接將我們的思維引導到 “專案程式碼有問題” 這個方向上,於是我花了一上午時間仔細對比檢查各種配置檔案、env檔案,升級了 laravel 以及各種依賴的版本。但是當我每次滿懷期待的在瀏覽器開啟應用時,還是卡的讓我懷疑人生,而且日誌記錄一切正常。然後使用搜尋引擎嘗試搜尋這個問題的解決方案,中文搜尋、英文搜尋都沒有結果。一個上午過去了,還是沒有搞定這個問題,甚至一股絕望感湧上心頭。:neckbeard:
最後還是決定去吃午飯,先讓自己放鬆下來。吃完飯回來的路上,我又一次思考這個問題,腦袋裡各種搜尋出來的答案一條一條閃過,突然一個單詞從我眼前“飛過”:hosts
回到工位上我開啟電腦,想著先用 ip 直接訪問應用看看情況,於是在瀏覽器輸入http://127.0.0.1:8016,介面被急速開啟,我大概有點眉目了,於是開啟 hosts 檔案,想著換個域名試試:

# 127.0.0.1 devocus.test
127.0.0.1 ifocus-dev.test

然後開啟瀏覽器,輸入http://ifocus-dev.test:8016,應用被快速開啟,非常流暢,問題就這樣莫名其妙的解決了。
但是問題出在哪裡呢?我再次開啟 hosts 檔案,仔細檢查,發現之前做過的同一個域名的解析靜靜地躺在 hosts 檔案裡面,我將開發環境由 Homestead 遷移到 Laravel-Sail時,忘記修改 hosts 檔案了:

...
192.168.10.10 devocus.test
...
# 127.0.0.1 devocus.test
127.0.0.1 ifocus-dev.test

在 hosts 檔案中,同一個域名解析到兩個 ip 會發生什麼情況呢?我去搜尋引擎上搜尋了一下,找到了答案:

電腦在hosts檔案中是由上往下查詢 IP,相同的域名取第一個 IP,如果第一個IP受阻,那麼會轉向第二個IP,乃至第N個,但是這種方式達不到負載均衡的效果,但可以增大開啟網站的機率。

由於我將 devocus.test解析到了兩個IP地址:192.168.10.10 及127.0.0.1,當我在瀏覽器中開啟http://devocus.test時,首先訪問 192.168.10.10,但是由於我的 Homestead 是關閉狀態,所以肯定訪問失敗,這個過程持續30秒左右,然後系統又去 hosts 檔案中繼續查詢其他的IP,找到並訪問 127.0.0.1 時才開啟了網頁。因為每個請求都要經過這個過程,所以我會感覺到系統非常的卡頓。至此,困擾我的問題得於解決。

所以大家在開發專案時,一定要多留意這些細微的小問題,小問題很多時候也會造成巨大的困擾,即使我這樣自以為是的老手,也會掉入深坑。軟體行業真是一個需要不斷踩坑、不斷挖坑、不斷填坑的實踐性行業。

不過我想了想,要是我當時 Homestead 環境是開啟的,我可能會更加的困擾。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
順勢而為

相關文章