<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
nginx的虛擬主機,不知道大家瞭解不。以前吧,如果在nginx上要反向代理多個服務,我一般是讓nginx監聽多個不同埠,比如8080/8081,不同埠,反向代理到不同的服務。
server { listen 9981 so_keepalive=on; proxy_pass service1; } server { listen 9982 so_keepalive=on; proxy_pass service2; }
來了現在公司,發現這邊是基於域名(埠都是80)來反向代理到不同服務,如下:
基於以上的nginx設定,域名a和b,分別代表了系統a和系統b,實際dns是指向同一臺nginx機器。當你用域名a存取時,就會走上面的設定;域名b存取時,就會走下面的設定。
我的一位同事,和我差不多時間入職,接手了一個幾年前的系統,看到線上環境的nginx設定,表示有點懵,不知道how it works。
這裡把這個問題,簡單描述下。
為了方便我這邊模擬,假設機器ip為10.0.0.6,機器上有個python指令碼,會去存取一個api:http://10.0.0.6:80 。
機器上的/etc/hosts如下:
[root@VM-0-6-centos nginx]# cat /etc/hosts ...... 10.0.0.6 bbbb.com
也就是說,存取bbbb.com,就相當於存取這臺機器了。
[root@VM-0-6-centos nginx]# ping bbbb.com PING bbbb.com (10.0.0.6) 56(84) bytes of data.
基於以上資訊,這個api存取本機的80,是會到本機的nginx(nginx監聽80埠),nginx設定如下:
這個設定,基於我們對虛擬主機的瞭解,也就是說,存取aaaa.com,就會到第一段的設定,aaaa.access.log裡面就會有存取紀錄檔;如果是存取bbbb.com,就會到第二段的設定,bbbb.access.log就會有存取紀錄檔。
但是,使用者端不按套路出牌啊,用的是,10.0.0.6:80/xx這樣的url來存取該nginx,同時,/etc/hosts裡面有設定bbbb.com指向本機,那麼,大家覺得最終的存取結果如何?
結果是,存取了aaaa那一段。
這。。。我們就有點想不通了,沒理由啊,為啥呢,why?不是不能接受結果,而是不知道為什麼會這樣。
按理說,用域名形式存取,應該才會去檢視/etc/hosts檔案和dns系統,找到域名背後的ip;但是,按ip存取,貌似java建立裡面的socket底層實現利,也會有根據ip去獲取host的程式碼(還導致一些超時問題之類的)。
所以,我們猜測,難道是,存取10.0.0.6時,檢視了/etc/hosts,把10.0.0.6轉換成了aaaa.com?但是,/etc/hosts裡面只有把10.0.0.6轉換為bbbb.com的可能性吧?
本著不管三級二十一,先抓個包再說的想法,於是在nginx的80埠,開了個tcpdump:
[root@VM-0-6-centos ~]# tcpdump -i lo tcp port 80 -Ann
然後再次存取:
[root@VM-0-6-centos nginx]# curl 10.0.0.6:80
抓包結果:
看到這邊host是 10.0.0.6.
這讓我開始懷疑,可能和/etc/hosts沒什麼關係,問題應該變成了:nginx在拿到上面這段http報文時,為啥要路由到aaaa.com那一段設定裡面去。
怎麼才能知道nginx做了啥呢,我們又沒有程式碼,但是,好歹,我們還有shell 命令啊。 strace這個命令,可以檢視一個程序的系統呼叫,還是比較好用的。
為啥要查這個?因為我懷疑是不是nginx拿到10.0.0.6後,把它轉成了域名,不過,轉的話,應該也是轉換為bbbb.com。另外,這個命令有沒有用,我也不確定,因為該命令只能看這個程序發起了哪些系統呼叫(不是java裡的rpc),而是對核心發起的系統呼叫(system call)。萬一,ip轉域名的部分,沒有通過系統呼叫實現的話,那這個命令就失效了。
不過還是試試?
先拿到了nginx的worker程序的pid:8845
[root@VM-0-6-centos nginx]# ps -ef|grep nginx root 610 1 0 12:15 ? 00:00:00 nginx: master process ./nginx nobody 8845 610 0 13:13 ? 00:00:00 nginx: worker process
再開啟一個strace:
[root@VM-0-6-centos ~]# strace -p 8845 -s 1024 -q -f -v -e trace=network
結果如下:
好像只有接收網路請求的系統呼叫(recvfrom),系統呼叫,大家可以拿這個函數名去網上查。
此時,排查陷入了僵局,於是,我只能提議,我先回座位上找找nginx相關資料。
然後就開始在網上查,運氣也還不錯,就找到了:
https://docs.nginx.com/nginx/admin-guide/web-server/web-server/
上面這段話,大概就是說,虛擬主機的匹配,是通過取req報文裡的host欄位,來和nginx.conf中server裡的server_name做匹配,
因為server_name可以是萬用字元之類的,所以這裡有個優先順序,完全匹配》模糊匹配。
上圖的最後那幾行,就是關鍵了:
如果完全沒匹配上(我們這裡就是,拿了個ip來匹配,然而nginx.conf裡設定的是aaaa.com和bbbb.com),就會路由到這個埠的預設server。預設server是哪個呢,就是:nginx.conf裡埠為80的、且寫在第一個的server。
ok,打完收工。
知識點可能很小,但排查也比較麻煩,因為線上環境不好動,然後設定的域名其實不止兩個,有7/8個,中間繞的路比上面其實還多一點。
不過這邊的大概思路是這樣的,希望對大家也有一點點幫助。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45