国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Localhost 就一定是 Localhost 么?

網絡 通信技術
我們在本地測試或者本地通訊的時候經常使用 localhost 域名,但是訪問 localhost 的對應的一定就是我們的本機地址么?

 [[405743]]

我們在本地測試或者本地通訊的時候經常使用 localhost 域名,但是訪問 localhost 的對應的一定就是我們的本機地址么?

背景

在一個風和日麗下午,突然收到了運維同學的反饋,說我們的一個服務調用突然報錯了,關鍵是這個服務已經半年沒有更新發版過了,詢問后得知最近基礎架構也沒有什么變更,這就很迷了

我們排查日志后發現這個服務去調用了一個不知名的 ip 地址,這個地址還能 ping 通,但是我們明明是配置的 localhost,為什么會出現這個地址?localhost 不應該指向的是 127.0.0.1 么?我們使用 dig 和 nslookup 之后發現 localhost 的確是 127.0.0.1。

我們修改了應用的配置,讓這個調用直接調用 127.0.0.1 結果發現這個時候服務就正常了,然后我們在機器上抓包之后發現 localhost 竟然走了域名解析! 并且 localhost 這個域名在我們內網還被注冊了,解析出來的地址就是最開始發現的這個不知名的地址

小結

所以我們下意識認為的域名解析流程應該是這樣的,先去找 /etc/hosts 文件,localhost 找到了(默認是 127.0.0.1)就返回了

排查之后發現,實際上的流程是這樣的,先做了 DNS 查詢 DNS 沒查到然后去查了 /etc/hosts 文件

直到有一天,我們的內網域名解析中添加了一個 localhost 的域名解析,就直接查詢成功返回了

復現

我們先使用一段簡單的代碼復現一下,簡單請求一下 localhost 就行了

  1. package main 
  2.  
  3. import ( 
  4.  "fmt" 
  5.  "net/http" 
  6.  
  7. func main() { 
  8.  client := &http.Client{} 
  9.  _, err := client.Get("http://localhost:8080"
  10.  fmt.Println(err) 

然后我們使用 GODEBUG="netdns=go+2" 環境變量執行程序,帶上這個環境變量之后程序運行時就會輸出是先執行 dns 查詢還是先從 /etc/hosts 文件進行查詢

  1. GODEBUG="netdns=go+2" go run main.go  
  2. go package net: GODEBUG setting forcing use of Go's resolver 
  3. go package net: hostLookupOrder(localhost) = files,dns 
  4. Get "http://localhost:8080": dial tcp [::1]:8080: connectconnection refused 

上面顯示的 files,dns 的意思就是先從 /etc/hosts 文件中查詢,再去查詢 dns 結果,但是我們當時服務的運行結果是 dns,files 這個問題出現在哪里呢?和 Go 的版本以及本地環境有關系

我們使用 Docker 模擬了線上環境,我們線上也是用的 Docker

  1. FROM golang:1.15 as builder 
  2.  
  3. WORKDIR /app 
  4.  
  5. COPY main.go main.go 
  6. COPY run.sh run.sh 
  7.  
  8. ENV CGO_ENABLED=0 
  9. ENV GOOS=linux 
  10.  
  11. RUN go build main.go 
  12.  
  13. FROM alpine:3 
  14.  
  15. WORKDIR /app 
  16.  
  17. COPY --from=builder /app /app 
  18. COPY run.sh run.sh 
  19.  
  20. RUN chmod +x run.sh 
  21.  
  22. ENV GODEBUG="netdns=go+2" 
  23. ENV CGO_ENABLED=0 
  24. ENV GOOS=linux 
  25.  
  26. CMD /app/run.sh 

使用這個容器運行的結果如下,可以看到已經變成了 dns,files 為什么會這樣呢?

  1. go package net: built with netgo build tag; using Go's DNS resolver 
  2. go package net: hostLookupOrder(localhost) = dns,files 
  3. Get "http://localhost:8080": dial tcp 127.0.0.1:8080: connectconnection refused 

排查

src/net/dnsclient_unix.go

Go 中定義了下面幾種 DNS 解析順序,其中 files 表示查詢 /etc/hosts 文件,dns 表示執行 dns 查詢

  1. // hostLookupOrder specifies the order of LookupHost lookup strategies. 
  2. // It is basically a simplified representation of nsswitch.conf. 
  3. // "files" means /etc/hosts. 
  4. type hostLookupOrder int 
  5.  
  6. const ( 
  7.  // hostLookupCgo means defer to cgo. 
  8.  hostLookupCgo      hostLookupOrder = iota 
  9.  hostLookupFilesDNS                 // files first 
  10.  hostLookupDNSFiles                 // dns first 
  11.  hostLookupFiles                    // only files 
  12.  hostLookupDNS                      // only DNS 

在 src/net/conf.go 中可以看到

Go 會先根據一些初始條件判斷查詢的順序,然后就查找 /etc/nsswitch.conf 文件中的 hosts 配置項,如果不存在就會走一些回退邏輯。這次的問題出現在這個回退邏輯上

  1. func (c *conf) hostLookupOrder(r *Resolver, hostname string) (ret hostLookupOrder) { 
  2.  // ... 省略 
  3.  
  4.  nss := c.nss 
  5.  srcs := nss.sources["hosts"
  6.  // If /etc/nsswitch.conf doesn't exist or doesn't specify any 
  7.  // sources for "hosts", assume Go's DNS will work fine. 
  8.  if os.IsNotExist(nss.err) || (nss.err == nil && len(srcs) == 0) { 
  9.   if c.goos == "solaris" { 
  10.    // illumos defaults to "nis [NOTFOUND=return] files" 
  11.    return fallbackOrder 
  12.   } 
  13.   if c.goos == "linux" { 
  14.    // glibc says the default is "dns [!UNAVAIL=return] files" 
  15.    // https://www.gnu.org/software/libc/manual/html_node/Notes-on-NSS-Configuration-File.html. 
  16.    return hostLookupDNSFiles 
  17.   } 
  18.   return hostLookupFilesDNS 
  19.  } 
  20.  if nss.err != nil { 
  21.   // We failed to parse or open nsswitch.conf, so 
  22.   // conservatively assume we should use cgo if it's 
  23.   // available. 
  24.   return fallbackOrder 
  25.  } 

通過上面的代碼我們可以發現,當前系統如果是 linux 并且不存在 /etc/nsswitch.conf 文件的時候,會直接返回 dns,files 的順序,這個是參考了 glibc 的實現[^2]

這個問題其實一般在虛擬機上沒有問題,因為一般操作系統都會默認有這個配置文件,但是容器化之后我們一般喜歡使用 alpine linux 這種比較小的基礎鏡像,alpine 中就不存在的 /etc/nsswitch.conf 這個文件,所以就有可能會出現問題

上面這段邏輯不能再 1.16 中進行復現,是因為 1.16 已經修改了這個邏輯,主要就是把 linux 的這個判斷分支刪除掉了,感興趣可以看這個修改記錄[^3] 和這個 issue[^4]

總結

最大的感受就是經驗主義害死人,很多時候由于我們知識點的原因所以可能會出現一些和我們認為的常識相違背的地方,這個時候就需要大膽假設小心求證了

針對這次這個問題的修復方案,我們是直接先刪除了 localhost 的解析,復盤之后給出我不成熟的幾點小建議

  • 公司內網就不要搞注冊 localhost 域名這種騷操作了
  • 基礎鏡像的維護很重要,建議大家最好能夠統一一個基礎鏡像這樣不僅僅可以減少一些磁盤空間,同時還可以做一些統一的變更,例如這次這種就可以直接在基礎鏡像加上 /etc/nsswitch.conf 文件,避免其他業務也進坑里
  • 如果沒有什么特別的版本依賴(絕大部分應用其實都沒有)Go 版本建議升級 1.16 可以省很多事
  • dns 解析并不一定會先查詢 hosts 文件,除了這種默認的情況外,還可以手動修改 /etc/nsswitch.conf 文件,調整解析的順序,這個感興趣的話可以試試
  • 這篇文章還試著用 figma 做了幾個小動畫,感覺還是不錯,后續有空寫文章可以再搞搞(曹大不要再卷了,快學不動了)

參考文獻

[^1]: Go 1.14 標準庫源碼: https://github.com/golang/go/blob/go1.14/src/net/conf.go

[^2]: glibc 實現 https://www.gnu.org/software/libc/manual/html_node/Notes-on-NSS-Configuration-File.html

[^3]: 修改記錄: https://github.com/golang/go/commit/c80022204e8fc36ec487888d471de27a5ea47e17#diff-a7c29e18c1a96d08fed3e81f367d079d14c53ea85d739e7460b21fb29a063128

[^4]: https://github.com/golang/go/issues/35305

博客原文:https://lailin.xyz/

 

責任編輯:武曉燕 來源: lailin.xyz
相關推薦

2015-05-15 10:04:28

localhost

2018-06-08 11:28:44

MySQLlocalhost127.0.0.1

2024-05-27 00:40:00

2024-03-05 18:59:59

前端開發localhost

2024-09-12 15:28:38

localhost?網絡IPv4

2015-08-05 09:26:55

技術大公司

2015-08-05 10:40:02

大公司技術程序員

2009-06-15 10:40:14

2016-12-14 08:57:03

Weblogic報錯方法

2015-08-05 09:15:31

bat學習

2022-12-06 09:00:11

MySQL自增主鍵查詢

2025-10-27 01:00:00

2023-10-08 10:14:12

2015-11-12 09:58:45

多租戶SaaS軟件架構設計

2015-05-07 14:37:01

CoreOSAppC紅帽

2009-11-25 09:20:31

Windows 7網絡掉線

2024-05-27 00:00:00

localhostIPv6IPv4

2024-03-05 18:19:07

localhostLinux數據庫

2015-12-08 10:17:01

51CTO

2015-10-08 09:57:39

IaaS墊腳石《創業維艱》
點贊
收藏

51CTO技術棧公眾號

欧美日韩高清在线观看| 每日更新在线观看av| 青柠在线影院观看日本| 亚洲精华国产欧美| 亚洲经典中文字幕| 国产av麻豆mag剧集| 性一交一乱一伧国产女士spa| 亚洲欧美视频在线观看视频| 日本不卡免费高清视频| 亚洲国产91视频| 国产91色在线| 日韩欧美精品| 日韩av电影在线播放| 国产色综合网| 国产精品wwww| 日韩免费福利视频| 色综合亚洲精品激情狠狠| 中文在线视频| 成人黄色777网| 免费日韩av电影| 日本一本不卡| 亚洲免费色视频| 亚洲一区精彩视频| 奶水喷射视频一区| 欧美一区二区三区在线播放| 18国产精品| 欧美日韩一区二区三区四区 | 色综合色综合久久综合频道88| 伊人网在线观看| 精品久久一区| 国产精品一区视频网站| 日韩不卡一二三区| 综合网五月天| 韩国女主播成人在线观看| 奇米精品在线| 91视频免费播放| 成人亚洲精品777777大片| 99国内精品| 艳母动漫在线观看| 在线精品视频一区| 久久香蕉国产| 国产一区二区三区免费观看| 亚洲成人综合视频| 国产精品久久久久久久7电影| 成人一区二区不卡免费| 欧美日韩午夜在线| av影片在线看| 欧美日本一区二区三区四区| 欧美视频第一| 亚洲国产精品视频一区| 91国模大尺度私拍在线视频| 亚洲自拍电影| 九九99九九精彩| 欧美日韩国产在线看| 亚洲高清成人影院| 亚洲人成精品久久久久| 日日噜噜噜噜久久久精品毛片| 亚洲综合无码一区二区| av在线app| 欧美在线日韩在线| 国产在线成人| 日本在线xxx| 欧美日韩一区高清| 欧美区一区二区| 综合一区中文字幕| 2019日本中文字幕| 国内视频精品| 成人av一级片| 欧美一级在线观看| 国产精品99久久精品| 国产乱子伦农村叉叉叉| 黄色一区二区在线观看| xxxxx日韩| 欧美亚洲精品一区| 日本天堂在线| 亚洲精品mp4| 99精品国自产在线| 欧美高跟鞋交xxxxxhd| 精品国产精品| 伊人再见免费在线观看高清版| 国产乱码一区二区三区| 日韩av最新在线| 欧美—级高清免费播放| 午夜国产一区二区三区| 中文字幕在线二区| 欧美激情xxxxx| 欧美日韩国产免费观看视频| 国产精品视频导航| 中文字幕视频一区| 亚洲一二三四| 亚洲成人网上| 久久精品水蜜桃av综合天堂| 欧洲一区二区在线观看| 亚洲精品高清视频在线观看| 天堂网在线最新版www中文网| 北条麻妃在线| 91丨porny丨首页| 免费在线看污| 亚洲一级二级三级| 在线国产福利网站| 久久综合伊人77777| 一本久道综合久久精品| 全黄性性激高免费视频| 欧美高清你懂得| 日韩漫画puputoon| 久久人人九九| 成人黄色免费电影| 亚洲精品日日夜夜| 国产一区一区| 四虎永久国产精品| 欧美天堂亚洲电影院在线播放| avtt综合网| 日本一本视频| 欧洲美女免费图片一区| av在线不卡网| 理论片午夜视频在线观看| 国产精品欧美日韩一区| 白白在线精品| 女同性恋一区二区| 操91在线视频| 91在线精品一区二区| 亚洲精品久久久| 久草中文综合在线| 欧美9999| 黄网站在线播放| 福利片免费在线观看| 欧美一进一出视频| 欧美日韩国产综合一区二区| 欧美—级在线免费片| 男男视频亚洲欧美| 欧美日韩三级| 日韩中文首页| 999国产精品一区| 丁香婷婷久久| av日韩中文| www.com操| 特级丰满少妇一级| 成人黄色午夜影院| 91国产一区在线| 精品国产美女在线| 亚洲欧美综合另类中字| 欧美成人精品3d动漫h| 欧美男男青年gay1069videost| 亚洲女人小视频在线观看| 99riav国产精品| 亚洲综合另类| 精品久久久中文字幕| 在线中文字幕-区二区三区四区| huan性巨大欧美| 免费在线观看的电影网站| 影音先锋男人资源在线| 欧洲不卡视频| 男人的天堂在线视频| www在线免费观看| 99久久精品免费观看国产| 精品国产免费人成网站| 亚洲美女久久精品| 亚洲网一区二区三区| 久久国产精品亚洲人一区二区三区 | 久久成人免费视频| 亚洲亚洲人成综合网络| 中文字幕一区二区三区不卡| 亚洲第一av色| 日韩欧美精品在线视频| 精品国内产的精品视频在线观看| 国产精品99久久99久久久二8| 日韩欧美一区二区视频在线播放| 成人一区在线观看| 99riav一区二区三区| av一区二区三区黑人| 亚洲精品久久久蜜桃| 欧美不卡一区二区| 97高清免费视频| 91亚洲国产成人久久精品网站| 亚洲欧洲日韩精品| 一本免费视频| 先锋影音在线资源站91| 久久99久久人婷婷精品综合| 免费精品99久久国产综合精品| 天堂影院一区二区| 国产福利91精品一区二区三区| 99re免费视频精品全部| 中文字幕av在线一区二区三区| 中文字幕精品三区| 国产高清成人在线| av一二三不卡影片| 免费黄网站欧美| 精品一区二区影视| 亚洲一区二区三区免费在线观看| 中文欧美日韩| 成人午夜精品在线| **国产精品| 红桃视频在线观看一区二区| 久久精品国语| 色8久久人人97超碰香蕉987| 久久五月天色综合| 日韩女同互慰一区二区| 97高清免费视频| 日韩免费电影网站| 精品国产一区二区三区不卡|