最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關于Nginx中虛擬主機的一些冷門知識小結(jié)

 更新時間:2022年03月02日 09:09:48   作者:三國夢回  
這篇文章主要給大家介紹了關于Nginx中虛擬主機的一些冷門知識,文中通過圖文以及實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

前言

nginx的虛擬主機,不知道大家了解不。以前吧,如果在nginx上要反向代理多個服務,我一般是讓nginx監(jiān)聽多個不同端口,比如8080/8081,不同端口,反向代理到不同的服務。

server {
	listen 9981 so_keepalive=on;
	proxy_pass service1;
}

server {
	listen 9982 so_keepalive=on;
	proxy_pass service2;
}

來了現(xiàn)在公司,發(fā)現(xiàn)這邊是基于域名(端口都是80)來反向代理到不同服務,如下:

基于以上的nginx配置,域名a和b,分別代表了系統(tǒng)a和系統(tǒng)b,實際dns是指向同一臺nginx機器。當你用域名a訪問時,就會走上面的配置;域名b訪問時,就會走下面的配置。

對線上配置的一個小疑問

問題背景

我的一位同事,和我差不多時間入職,接手了一個幾年前的系統(tǒng),看到線上環(huán)境的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監(jiān)聽80端口),nginx配置如下:

這個配置,基于我們對虛擬主機的了解,也就是說,訪問aaaa.com,就會到第一段的配置,aaaa.access.log里面就會有訪問日志;如果是訪問bbbb.com,就會到第二段的配置,bbbb.access.log就會有訪問日志。

但是,客戶端不按套路出牌啊,用的是,10.0.0.6:80/xx這樣的url來訪問該nginx,同時,/etc/hosts里面有配置bbbb.com指向本機,那么,大家覺得最終的訪問結(jié)果如何?

實測結(jié)果

結(jié)果是,訪問了aaaa那一段。

這。。。我們就有點想不通了,沒理由啊,為啥呢,why?不是不能接受結(jié)果,而是不知道為什么會這樣。

探索

排查網(wǎng)絡

按理說,用域名形式訪問,應該才會去查看/etc/hosts文件和dns系統(tǒng),找到域名背后的ip;但是,按ip訪問,貌似java建立里面的socket底層實現(xiàn)利,也會有根據(jù)ip去獲取host的代碼(還導致一些超時問題之類的)。

所以,我們猜測,難道是,訪問10.0.0.6時,查看了/etc/hosts,把10.0.0.6轉(zhuǎn)換成了aaaa.com?但是,/etc/hosts里面只有把10.0.0.6轉(zhuǎn)換為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

抓包結(jié)果:

看到這邊host是 10.0.0.6.

這讓我開始懷疑,可能和/etc/hosts沒什么關系,問題應該變成了:nginx在拿到上面這段http報文時,為啥要路由到aaaa.com那一段配置里面去。

排查nginx

怎么才能知道nginx做了啥呢,我們又沒有代碼,但是,好歹,我們還有shell 命令啊。 strace這個命令,可以查看一個進程的系統(tǒng)調(diào)用,還是比較好用的。

為啥要查這個?因為我懷疑是不是nginx拿到10.0.0.6后,把它轉(zhuǎn)成了域名,不過,轉(zhuǎn)的話,應該也是轉(zhuǎn)換為bbbb.com。另外,這個命令有沒有用,我也不確定,因為該命令只能看這個進程發(fā)起了哪些系統(tǒng)調(diào)用(不是java里的rpc),而是對內(nèi)核發(fā)起的系統(tǒng)調(diào)用(system call)。萬一,ip轉(zhuǎn)域名的部分,沒有通過系統(tǒng)調(diào)用實現(xiàn)的話,那這個命令就失效了。

不過還是試試?

先拿到了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

結(jié)果如下:

好像只有接收網(wǎng)絡請求的系統(tǒng)調(diào)用(recvfrom),系統(tǒng)調(diào)用,大家可以拿這個函數(shù)名去網(wǎng)上查。

此時,排查陷入了僵局,于是,我只能提議,我先回座位上找找nginx相關資料。

然后就開始在網(wǎng)上查,運氣也還不錯,就找到了:

https://docs.nginx.com/nginx/admin-guide/web-server/web-server/

上面這段話,大概就是說,虛擬主機的匹配,是通過取req報文里的host字段,來和nginx.conf中server里的server_name做匹配,

因為server_name可以是通配符之類的,所以這里有個優(yōu)先級,完全匹配》模糊匹配。

上圖的最后那幾行,就是關鍵了:

如果完全沒匹配上(我們這里就是,拿了個ip來匹配,然而nginx.conf里配置的是aaaa.com和bbbb.com),就會路由到這個端口的默認server。默認server是哪個呢,就是:nginx.conf里端口為80的、且寫在第一個的server。

ok,打完收工。

總結(jié)

知識點可能很小,但排查也比較麻煩,因為線上環(huán)境不好動,然后配置的域名其實不止兩個,有7/8個,中間繞的路比上面其實還多一點。

不過這邊的大概思路是這樣的,希望對大家也有一點點幫助。

相關文章

  • 一文了解nginx中的signal處理機制

    一文了解nginx中的signal處理機制

    nginx利用信號處理機制,可以捕獲和處理各種信號,本文主要介紹了nginx中的signal處理機制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-05-05
  • Nginx配置Basic Auth登錄認證的實現(xiàn)方法

    Nginx配置Basic Auth登錄認證的實現(xiàn)方法

    這篇文章主要介紹了Nginx配置Basic Auth登錄認證的實現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • Nginx代理Partainer的實現(xiàn)

    Nginx代理Partainer的實現(xiàn)

    本文主要介紹了Nginx代理Partainer的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • nginx 老網(wǎng)站域名重定向到新網(wǎng)站的方法(親測)

    nginx 老網(wǎng)站域名重定向到新網(wǎng)站的方法(親測)

    本文主要介紹了nginx 老網(wǎng)站域名重定向到新網(wǎng)站的方法,以減少業(yè)務影響并確保流量導向新域名,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-02-02
  • Nginx中配置HTTP2協(xié)議的方法

    Nginx中配置HTTP2協(xié)議的方法

    HTTP2協(xié)議是HTTP的重大升級,提供多路復用、頭部壓縮和服務器推送等優(yōu)點,正確配置HTTP2可以為用戶提供更快、更流暢的訪問體驗,提升網(wǎng)站競爭力,本文就來介紹一下Nginx中配置HTTP2協(xié)議的方法,感興趣的可以了解一下
    2024-10-10
  • Debian7編譯安裝nginx簡明教程

    Debian7編譯安裝nginx簡明教程

    這篇文章主要介紹了Debian7編譯安裝nginx簡明教程,本文直接給出操作命令和步驟,需要的朋友可以參考下
    2015-03-03
  • Nginx+Windows負載均衡配置方法

    Nginx+Windows負載均衡配置方法

    Nginx負載均衡如何才能實現(xiàn)呢?這個問題有很多的程序員都希望知道,下面我們就向大家詳細的介紹有關Nginx負載均衡的信息
    2012-11-11
  • Nginx服務器基礎的安全配置與一些安全使用提示

    Nginx服務器基礎的安全配置與一些安全使用提示

    這篇文章主要介紹了Nginx服務器基礎的安全配置與一些安全使用提示,文中舉了一些典型的Nginx與PHP的環(huán)境用例,需要的朋友可以參考下
    2016-01-01
  • Nginx下配置Https證書詳細過程

    Nginx下配置Https證書詳細過程

    這篇文章主要介紹了Nginx下配置Https證書詳細過程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Nginx上配置Basic Authorization登錄認服務證的教程

    Nginx上配置Basic Authorization登錄認服務證的教程

    現(xiàn)在我們所使用的包括社交網(wǎng)絡API等開放平臺授權獲得用戶的用戶名和密碼一般有兩種認證方式,一種是Basic Auth,一種是OAuth,這里我們就來看一下Nginx上配置Basic Authorization登錄認服務證的教程
    2016-06-06

最新評論

科尔| 双峰县| 昌宁县| 花垣县| 获嘉县| 芜湖市| 云林县| 安仁县| 鄂尔多斯市| 濉溪县| 洛隆县| 武城县| 江城| 徐水县| 江北区| 菏泽市| 黎平县| 夏邑县| 尉氏县| 滦平县| 凤城市| 托克托县| 和林格尔县| 瑞安市| 册亨县| 体育| 深泽县| 玉田县| 三穗县| 罗源县| 吴江市| 平武县| 长寿区| 佳木斯市| 滦南县| 来凤县| 洛浦县| 永康市| 大同县| 南溪县| 奇台县|