題 服務器只擁有一個網站嗎?


從我所知道的DNS鏈接域名與網站所存儲的服務器的IP地址,這是否意味著每個服務器只能擁有一個網站?如果他們不這樣做,如果在同一台服務器上有很多網站,如何調用服務器的IP地址知道我想要哪個網站?


79
2018-06-18 03:02


起源


維基百科有一個很好的介紹 共享虛擬主機。如果您在瀏覽器中輸入http:// <IP_ADDR> /,則HTTP請求中不會包含域 Host: 頭。在共享主機的情況下,提供商可以配置web服務器以不同的方式處理它(例如,具有默認,重定向到提供者等)。 - Jedi
我點擊了與“此服務器從未/當前未託管您正在尋找的網站”等消息相關的鏈接。 - aitchnyu
如果您正在尋找在單個服務器上運行多個應用程序的方法 - 假設您分別在端口8001和8002上有兩個應用程序MyApp和YourApp。您可以在以下位置擁有兩個負載均衡器或應用程序代理:myapp.com和yourapp.com。讓他們在默認端口(80/443)接收請求,並將其分別轉發到端口8001和8002的實際服務器。 - rohithpr
好問題。每個網站過去都需要自己的IP地址(服務器可以有多個IP地址)。引入了HTTP / 1.1中的Host頭來解決您描述的確切問題。請參閱“Internet地址保護” www8.org/w8-papers/5c-protocols/key/key.html - A E
如果http 1.1沒有主機頭,ipv6將立即實現;-) :-( - Lenne


答案:


基本上:瀏覽器在HTTP請求中包含域名,因此Web服務器知道請求了哪個域並且可以相應地做出響應。


HTTP請求

以下是典型HTTP請求的發生方式:

  1. 用戶在表單中提供URL http://host:port/path

  2. 瀏覽器提取URL的主機(域)部分,並在必要時將其轉換為IP地址,這一過程稱為 名稱解析。此轉換可以通過DNS進行,但不必(例如,本地 hosts 常見操作系統上的文件繞過DNS)。

  3. 瀏覽器在該IP地址上打開指向指定端口的TCP連接,或默認為端口80。

  4. 瀏覽器發送HTTP請求。對於HTTP / 1.1,它看起來像這樣:

    GET /path HTTP/1.1
    Host: example.com
    

    (該 Host 標頭是標準的,在HTTP / 1.1中是必需的。它沒有在HTTP / 1.0規範中指定,但有些服務器無論如何都支持它。)

從這裡開始,網絡服務器可以使用幾條信息來決定響應應該是什麼。請注意,單個Web服務器可以綁定到多個IP地址。

  • TCP套接字中請求的IP地址
    • 客戶端的IP地址也可用,但很少使用 - 有時用於阻止/過濾
  • 來自TCP套接字的請求端口
  • 請求的主機名,如中所指定 Host HTTP請求中的瀏覽器頭。
  • 請求的路徑
  • 任何其他標題(cookie等)

您似乎已經註意到,最近最常見的共享主機設置將多個網站放在一個IP地址上:端口組合,只留下 Host 區分網站。

這被稱為a 基於名稱的虛擬主機 在Apache-land中,而Nginx稱之為 服務器塊中的服務器名稱 和IIS更喜歡 虛擬服務器


那麼HTTPS怎麼樣?

HTTPS有點不同。在建立TCP連接之前,所有內容都是相同的,但在此之後必須建立加密的TLS隧道。目標是不洩漏有關請求的任何信息。

為了驗證服務器實際擁有此域,服務器必鬚髮送由受信任的第三方簽名的證書。然後,瀏覽器將此證書與其請求的域進行比較。

這提出了一個問題。如果在收到HTTP請求之前需要執行此操作,服務器如何知道要發送哪個主機(網站)的證書?

傳統上,這是通過為每個需要HTTPS的網站提供專用IP地址(或端口)來解決的。顯然,當我們開始耗盡IPv4地址時,這就成了問題。

輸入 SNI (服務器名稱指示)。瀏覽器現在在TLS協商期間傳遞主機名,因此服務器及早發送此信息以發送正確的證書。在服務器端,配置與HTTP虛擬主機的配置方式非常相似。

缺點是主機名現在在加密之前作為純文本傳遞,並且基本上是洩露的信息。考慮到主機名通常在DNS查詢中公開,這通常被認為是可接受的權衡。


如果您僅通過IP地址請求網站怎麼辦?

服務器在不知道您請求的特定主機時所執行的操作取決於服務器實現和配置。通常,指定了“默認”,“catchall”或“fallback”站點,它將為未明確指定主機的所有請求提供響應。

此默認站點可以是其自己的獨立站點(通常顯示錯誤消息),也可以是服務器上的任何其他站點,具體取決於服務器管理員的首選項。


149
2018-06-18 03:11



此外,一個站點可能會分散在許多服務器上,就像Heroku和Amazon使用的負載均衡器一樣。 - phyrfox
@phyrfox是的,我想補充一點,但它只是與問題切線相關,我不想讓答案太長。可能最後還會為它添加一個部分。 - Bob
傳說,子域指向網絡內的特定計算機。理論上 - Loupax
“傳統上,這是通過為每個需要HTTPS的網站提供專用的IP地址(或端口)來解決的。顯然,當我們開始耗盡IPv4地址時,這就成了問題。”,所以如果沒有這種推廣,我們現在都會擁有ipv6 。 - Lenne


我對非技術人員有這個解釋。

傑克,吉爾和喬住在宿舍裡,他們沒有手機。

在電話簿中,它們都列出了相同的號碼。 (一個記錄)

你撥號碼,有人拿起電話;你說“我想跟吉爾說話”,你讓她上線了。

可能只是說“宿舍X”,而不是電話簿中的A記錄(A phonenumber / IP-adress),那麼你必須進一步查看宿舍X的號碼。這是一個CNAME記錄。

如果Jill不可用,你可能會得到

  • 404吉爾不在這裡
  • 410吉爾死了。
  • 301吉爾和彼得一起搬進來
  • 吉爾正在拜訪彼得, 打電話給他

  • 400我無法理解你。

  • 401你是誰?密碼是什麼?或者我們在晚上10點之後不允許男性來電者
  • 402需要付款(你確定吉爾是她的真名;-))
  • 403不,這不是正確的密碼。
  • 418吉爾是一個茶壺:-)
  • 429吉爾不能再打電話了。
  • 451您違反了限制令。

  • 500我們的電話系統已崩潰。


92
2018-06-18 17:15



對於奇怪的是418後面的RFC是 tools.ietf.org/html/rfc2324 還有一篇有趣的文章 sitesdoneright.com/blog/2013/03/... :) - Wordzilla


從我所知道的DNS鏈接域名與網站所存儲的服務器的IP地址,這是否意味著每個服務器只能擁有一個網站?

首先,您需要了解這裡有許多不同的概念。

  • 網站,一組形成連貫整體的網頁。
  • IP地址,Internet協議使用的數字地址(IPv4為32位,IPv6為128位),用作流量的源或目標。
  • 服務器,一種機器,其工作是為客戶端提供服務。
  • 主機名,用於標識DNS中計算機的名稱(例如“www.example.com”或“en.wikipedia.org”)

這些事情之間沒有一對一的關係。一台服務器可以有多個IP地址;多個主機名可以指向一個IP地址;一個主機名可以指向多個IP地址。多個網站可以在同一主機名下。一個網站可以分佈在多個主機名中。

如果他們不這樣做,如果在同一台服務器上有很多網站,如何調用服務器的IP地址知道我想要哪個網站?

在過去(HTTP 1.0及之前),服務器想要以不同方式處理的每個主機名必須擁有自己的IP地址。這很浪費。

HTTP 1.1添加了 Host“標頭作為HTTP請求中的必填字段(IIRC,一些供應商以前曾支持此作為擴展)。這告訴服務器請求了哪個主機名,因此允許它為同一IP地址上的不同主機名提供不同的內容。對於客戶端中的HTTP 1.1,現在無處不在。

不幸的是,SSL(後來的TLS)增加了皺紋。建立SSL / TLS會話要求服務器向客戶端提供涵蓋所請求主機名的證書,但HTTP請求在SSL / TLS會話建立之後才會到達。

通過使用,可以讓一個證書覆蓋多個主機名 SubjectAltName 野外或使用通配符 CommonName 領域。但是,這會帶來行政上的挑戰,特別是如果所涉及的主機名屬於擁有不同所有權的域名。

因此TLS引入了“服務器名稱指示”(SNI)擴展。使用此擴展,客戶端在TLS握手過程中將請求的主機名發送到服務器。然後,服務器可以顯示相應的證書。不幸的是,雖然所有主要SSL / TLS實現的當前版本都支持SNI,但舊版本的使用時間已經很長時間了。


6
2018-06-19 05:23



你忘了提到TCP可以監聽很多端口,每個端口上運行不同的服務器...... - Toby Speight
是的,但你在dns中沒有portnumber,你不能指望joe.p.user去 our.fabulous.site:81 此外,一些防火牆阻止對非標準端口號的傳出訪問。 - Lenne


答案比一些答案要復雜得多。當您執行DNS查找時,您必須獲得一個IP地址(A IPv4記錄, AAAA 對於IPv6)。您必須能夠通過TCP / IP打開套接字進行通信,否則整個過程都會失敗。該地址可能代表服務器,也可能代表負載均衡器。它甚至可以代表代理。例如,如果主機位於CloudFlare之後,則您獲得的地址是CloudFlare服務器。真正的服務器在其他地方。這使主機可以避免諸如拒絕服務攻擊之類的問題。

虛擬主機 是你所問的(其他一些問題涉及到這個,但沒有詳細說明)。虛擬主機接收Web請求並查看主機名(即domain.com)以確定要提供的網站。所以在 Apache HTTP Web服務器 你會有這樣的配置

<VirtualHost *:80>
    ServerName www.domain.com
    ServerAlias domain.com

    DocumentRoot /var/www/domain.com
</virtualHost>

例如,這是簡化的。因此,我們告訴Apache監聽任何IP的端口80(在現代虛擬機中託管您的機器的IP可能與其實時IP不同)。然後我們告訴它這是 domain.com 網站以及該網站所在的目錄。然後我們可以一遍又一遍地重複這個塊,告訴Apache處理不同的網站。每個Web服務器都支持這種類型的系統。

處理此問題的另一種方法是告訴Web服務器將所有Web流量定向到一個編程腳本(即PHP,ASP.NET等),然後該單個腳本將確定要顯示的網站和頁面。


3
2018-06-20 20:54





使用DNS,您可以根據需要為單個IP地址分配盡可能多的名稱(在您的 主機文件 例如,您可以簡單地用空格分隔每個名稱。您也可以使用DNS服務器 為單個名稱分配多個IP地址。它不限於一對一的關係。

Web服務器知道要服務的站點 檢查 請求的URL。它查看請求的域,請求的端口以及使用的協議。這與DNS無關,由HTTP協議處理。


1
2018-06-18 03:15





Web服務器具有主機容器的概念(這裡 例如,是Tomcat的文檔。可以為同一個盒子/ IP地址配置多個主機容器,為多個域提供服務。容器具有獨立的工作目錄,身份驗證領域,日誌目錄和類似的東西。

服務器找到新請求的相關容器購買域名是該HTTP請求的一部分。

完全不同的Web服務器實例如果在不同的端口上運行,則可以共享相同的IP地址。這主要用於各種開發和測試環境,其中域名可能不可用,因為生產服務器無法在任意端口上運行。

最後,即使網站需要嚴格唯一的IP地址,服務器盒通常也有多個網絡適配器,因此配置為使用多個IP地址。


0
2018-06-20 07:49





您的服務器IP地址可以同時包含許多不同的域名。

當您訪問該網站時,您的瀏覽器會發送帶有域名的HTTP請求,服務器可以找到它應該發送給您的網站數據。

它被稱為虛擬主機,就這麼簡單:)

看一看 這裡 有關DNS和虛擬主機的更多信息。


0
2017-07-23 06:59