HTTP/1.1 host虛擬主機詳解

一、核心需求:為什么需要虛擬主機?

在互聯網上,我們常常希望在一臺物理服務器(它通常只有一個公網 IP 地址)上運行多個獨立的網站,每個網站都有自己獨特的域名(例如 www.a-site.com?, www.b-site.org? 等)。如果每個網站都需要一個獨立的 IP 地址,那將是非常昂貴且浪費 IPv4 資源的。

虛擬主機 (Virtual Hosting) 技術應運而生,它允許你在單一 IP 地址的服務器上,經濟高效地托管多個使用不同域名的網站。

二、關鍵的“指路人”:Host? 請求頭部

HTTP/1.1 協議規定了一個強制性的請求頭部字段——Host?。

  • 它的作用:當你的瀏覽器向服務器發送請求時(比如訪問 http://www.a-site.com?),Host? 頭部會明確地告訴服務器,用戶實際想要訪問的目標域名是 www.a-site.com?。
  • 為何如此重要:如果請求中缺失 Host? 頭部,服務器雖然知道請求是發給自己的(通過 IP 地址判斷),但它無法分辨這個請求究竟是針對它上面托管的哪一個網站。這就像一個快遞員只知道包裹要送到某棟大樓,卻不知道具體是哪家公司簽收。服務器此時通常會返回錯誤,或者將請求導向一個預設的默認站點,但這往往不是用戶期望的結果。

三、Nginx 實現虛擬主機的步驟

Nginx 作為一款高性能的 Web 服務器,通過其靈活的配置完美支持虛擬主機。主要涉及兩大步驟:

1. DNS 配置:萬流歸宗

你需要將所有希望托管在這臺 Nginx 服務器上的域名,都通過 DNS 解析指向這臺服務器的同一個 IP 地址。

  • 例如,服務器 IP 為 100.200.10.20?。
  • 在你的 DNS 服務商處,為 www.a-site.com?、www.b-site.org? 以及其他所有相關域名創建 A 記錄,都指向 100.200.10.20?。
  • 結果:無論用戶訪問哪個域名,請求最終都會被發送到 IP 地址為 100.200.10.20? 的這臺 Nginx 服務器。

2. Nginx 服務器配置:精細分發

Nginx 的核心在于其配置文件(通常是 nginx.conf? 以及通過 include? 指令引入的其他配置文件,如 sites-available/? 或 conf.d/? 目錄下的 .conf? 文件)。Nginx 使用 server? 配置塊來為每一個虛擬主機(即每一個網站)定義一套獨立的服務規則。

  • ?server? 塊:每個你想托管的網站都需要一個專屬的 server { ... }? 配置塊。

    # 示例:/etc/nginx/sites-available/a-site.conf
    server {listen 80; # 監聽標準的 HTTP 80 端口# listen 443 ssl; # 如果是 HTTPS,監聽 443 端口server_name www.a-site.com a-site.com; # <--- 核心!指定此 server 塊處理的域名root /var/www/a-site.com/public; # 網站文件的根目錄index index.html index.php;      # 默認的索引文件access_log /var/log/nginx/a-site.com.access.log; # 獨立的訪問日志error_log /var/log/nginx/a-site.com.error.log;   # 獨立的錯誤日志location / { # 處理根路徑及所有未明確匹配的路徑try_files $uri $uri/ =404; # 嘗試查找文件或目錄,否則返回404}# 可以為 a-site.com 添加更多特定的 location 規則、反向代理等# 例如,處理 PHP 文件# location ~ \.php$ {#     include snippets/fastcgi-php.conf;#     fastcgi_pass unix:/run/php/php8.0-fpm.sock;# }
    }# 示例:/etc/nginx/sites-available/b-site.org.conf
    server {listen 80;server_name www.b-site.org b-site.org; # <--- 另一個域名的 server 塊root /var/www/b-site.org/html; # 不同的網站文件根目錄index index.html;access_log /var/log/nginx/b-site.org.access.log;error_log /var/log/nginx/b-site.org.error.log;location /special-app/ {# 為 b-site.org 的某個特定應用做配置# proxy_pass http://localhost:5000;}# ... 其他 b-site.org 的配置
    }
    
  • 關鍵指令解釋:

    • ?listen?:指定 Nginx 在哪個 IP 地址(可選)和哪個端口上監聽請求。對于公共網站,這通常是 80? (HTTP) 和/或 443? (HTTPS)。
    • ?server_name?:這是 Nginx 區分虛擬主機的最關鍵指令。Nginx 會提取客戶端 HTTP 請求中的 Host? 頭部的值,并將其與各個 server? 塊中 server_name? 定義的域名列表進行匹配。匹配成功后,該 server? 塊內的其他指令就會生效。server_name? 可以包含一個或多個域名,支持通配符和正則表達式。
    • ?root?:定義了當前 server? 塊所服務的網站的文檔根目錄(即網頁文件存放的起始位置)。
    • ?index?:指定當用戶請求一個目錄時,Nginx 應嘗試提供的默認文件名。
    • ?access_log?, error_log?:允許為每個虛擬主機配置獨立的日志文件,方便管理和問題排查。
    • ?location? 塊:允許你針對特定的 URL 路徑或模式(如圖片、API 接口、PHP 文件等)定義更細致的處理規則。
  • 啟用配置:通常將寫好的虛擬主機配置文件從 sites-available? 目錄鏈接到 sites-enabled? 目錄,然后測試配置(sudo nginx -t?)并重載 Nginx(sudo systemctl reload nginx?)。

四、工作流程回顧

  1. 用戶在瀏覽器輸入 http://www.a-site.com/contact.html?。
  2. DNS 將 www.a-site.com? 解析到 Nginx 服務器的 IP 地址 (100.200.10.20?)。
  3. 瀏覽器向 100.200.10.20:80? 發送 HTTP 請求,請求頭中包含 Host: www.a-site.com?。
  4. Nginx 收到請求,讀取 Host? 頭部為 www.a-site.com?。
  5. Nginx 遍歷其加載的所有 server? 塊,查找 server_name? 指令中包含 www.a-site.com? (或匹配的通配符/正則) 的那個 server? 塊。
  6. 一旦匹配成功(例如,匹配到 /etc/nginx/sites-available/a-site.conf? 中的 server? 塊),Nginx 就會使用該 server? 塊內的配置來處理請求(例如,從 /var/www/a-site.com/public? 目錄中查找 contact.html? 文件)。
  7. Nginx 將找到的內容作為響應返回給瀏覽器。

如果另一個請求的 Host? 頭部是 www.b-site.org?,Nginx 則會匹配到為 b-site.org? 配置的 server? 塊,并按其規則提供服務。

五、對比:“IP + 不同端口”方案的局限性

你可能會想,為什么不直接用 IP 地址配合不同的端口號來區分不同的網站呢?例如:

  • ?www.a-site.com? -> 100.200.10.20:8080?
  • ?www.b-site.org? -> 100.200.10.20:8081?

技術上這完全可行,Nginx 的 listen? 指令可以直接監聽這些非標準端口。但這種方式對于公共訪問的網站來說,并非理想選擇,主要原因如下:

  1. 用戶體驗差:用戶訪問網站時,必須在瀏覽器地址欄中手動輸入非標準的端口號(如 http://www.a-site.com:8080?)。這非常不方便,也容易出錯。

  2. 瀏覽器默認行為:當用戶只輸入域名(如 www.a-site.com?)或使用標準的 http://? / https://? 前綴時,瀏覽器會自動連接到服務器的標準端口:

    • HTTP: 默認連接端口 80?
    • HTTPS: 默認連接端口 443?
      如果你的網站運行在非標準端口,用戶不顯式指定端口就無法訪問。
  3. DNS 限制:標準的 DNS A 記錄只負責將域名解析到 IP 地址,不包含端口信息。雖然 SRV 記錄可以指定服務端口,但瀏覽器在訪問常規網站時并不依賴它。

結論:Host? 頭部虛擬主機的優越性

基于 Host? 頭部的虛擬主機(通常都監聽在標準的 80 和 443 端口)是托管多個公共網站的行業標準和最佳實踐。它對用戶完全透明,用戶只需輸入域名即可訪問,而服務器則在后端通過 Host? 頭部智能地將請求分發給正確的網站進行處理。這種方式既高效、經濟,又保證了良好的用戶體驗。

“IP + 不同端口”的方案更適用于內部服務、API 接口、或者一些用戶明確知道需要指定端口的特定應用程序。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/80465.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80465.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/80465.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

amass:深入攻擊面映射和資產發現工具!全參數詳細教程!Kali Linux教程!

簡介 OWASP Amass 項目使用開源信息收集和主動偵察技術執行攻擊面網絡映射和外部資產發現。 此軟件包包含一個工具&#xff0c;可幫助信息安全專業人員使用開源信息收集和主動偵察技術執行攻擊面網絡映射并執行外部資產發現。 使用的信息收集技術 技術數據來源APIs&#xf…

Spring Web MVC響應

返回靜態頁面 第一步 創建html時&#xff0c;要注意創建的路徑&#xff0c;要在static下面 第二步 把需要寫的內容寫到body內 第三步 直接訪問路徑就可以 返回數據ResponseBody RestController Controller ResponseBody Controller&#xff1a;返回視圖 ResponseBody&…

?鴻蒙PC正式發布:國產操作系統實現全場景生態突破

鴻蒙PC正式發布&#xff1a;國產操作系統實現全場景生態突破? 2025年5月8日&#xff0c;華為在深圳舉辦發布會&#xff0c;正式推出搭載鴻蒙操作系統的個人電腦&#xff08;PC&#xff09;&#xff0c;標志著國產操作系統在核心技術與生態布局上實現歷史性跨越。此次發布的鴻蒙…

【計算機視覺】OpenCV實戰項目:Text-Extraction-Table-Image:基于OpenCV與OCR的表格圖像文本提取系統深度解析

Text-Extraction-Table-Image&#xff1a;基于OpenCV與OCR的表格圖像文本提取系統深度解析 1. 項目概述2. 技術原理與算法設計2.1 圖像預處理流水線2.2 表格結構檢測算法2.3 OCR優化策略 3. 實戰部署指南3.1 環境配置3.2 核心代碼解析3.3 執行流程示例 4. 常見問題與解決方案4.…

Redis BigKey 問題是什么

BigKey 問題是什么 BigKey 的具體表現是 redis 中的 key 對應的 value 很大&#xff0c;占用的 redis 空間比較大&#xff0c;本質上是大 value 問題。 BigKey怎么找 redis-cli --bigkeysscanBig Key 產生的原因 1.redis數據結構使用不恰當 2.未及時清理垃圾數據 3.對業務預…

go-gin

前置 gin是go的一個web框架&#xff0c;我們簡單介紹一下gin的使用 導入gin &#xff1a;"github.com/gin-gonic/gin" 我們使用import導入gin的包 簡單示例&#xff1a; package mainimport ("github.com/gin-gonic/gin" )func main() {r : gin.Default(…

C# NX二次開發:判斷兩個體是否干涉和獲取系統日志的UFUN函數

大家好&#xff0c;今天要講關于如何判斷兩個體是否干涉和獲取系統日志的UFUN函數。 &#xff08;1&#xff09;UF_MODL_check_interference&#xff1a;這個函數的定義為根據單個目標體檢查每個指定的工具體是否有干擾。 Defined in: uf_modl.h Overview Checks each sp…

如何解決 Linux 系統文件描述符耗盡的問題

在Linux系統中&#xff0c;文件描述符&#xff08;File Descriptor, FD&#xff09;是操作系統管理打開文件、套接字、管道等資源的抽象標識。當進程或系統耗盡文件描述符時&#xff0c;會導致服務崩潰、連接失敗等嚴重問題。以下是詳細的排查和解決方案&#xff1a; --- ###…

LVGL簡易計算器實戰

文章目錄 &#x1f4c1; 文件結構建議&#x1f539; eval.h 表達式求值頭文件&#x1f539; eval.c 表達式求值實現文件&#xff08;帶詳細注釋&#xff09;&#x1f539; ui.h 界面頭文件&#x1f539; ui.c 界面實現文件&#x1f539; main.c 主函數入口? 總結 項目效果&…

使用countDownLatch導致的線程安全問題,線程不安全的List-ArrayList,線程安全的List-CopyOnWriteArrayList

示例代碼 package com.example.demo.service;import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;public class UnSafeCDTest {Executor…

ALLinSSL:一站式SSL證書管理解決方案

引言 在當今互聯網安全日益重要的背景下,SSL證書已成為保護網站安全的必備工具。然而,管理多個SSL證書常常是一項繁瑣且容易出錯的任務。ALLinSSL應運而生,它提供了一個一站式的SSL證書管理解決方案,大大簡化了證書的申請、安裝和更新過程。本文將深入介紹ALLinSSL的特性、…

嵌入式通信協議總覽篇:萬物互聯的基石

嵌入式系統的世界,是靠協議“說話”的世界。 在你設計一個智能設備、構建一個工業控制系統、開發一款 IoT 網關時,一個核心問題始終繞不開:**這些設備之間如何“對話”?**答案就是——通信協議。 本篇作為系列第一章,將帶你全面理解嵌入式通信協議的全貌,為后續深入學習…

【數據結構】紅黑樹(C++)

目錄 一、紅黑樹的概念 二、紅黑樹的性質 三、紅黑樹結點定義 四、紅黑樹的操作 1. 插入操作 1.1 插入過程 1.2 調整過程 1.2.1 叔叔節點存在且為紅色 1.2.2 叔叔節點存在且為黑色 1.2.3 叔叔節點不存在 2. 查找操作 2.1 查找邏輯 2.2 算法流程圖 2.3 使用示例 …

Oracle數據庫DBF文件收縮

這兩天新部署了一套系統&#xff0c;數據庫結構保持不變&#xff0c;牽扯導出表結構還有函數&#xff0c;圖省事就直接新建用戶&#xff0c;還原數據庫了。然后咔咔咔&#xff0c;一頓刪除delete&#xff0c;truncate&#xff0c;發現要不就是表刪了&#xff0c;還有num_rows&a…

【字節擁抱開源】字節豆包團隊開源首發 Seed-Coder 大模型

我們非常高興地向大家介紹 Seed-Coder&#xff0c;它是一個功能強大、透明、參數高效的 8B 級開源代碼模型系列&#xff0c;包括基礎變體、指導變體和推理變體。Seed-Coder 通過以下亮點促進開放代碼模型的發展。 以模型為中心&#xff1a;Seed-Coder主要利用大語言模型&#…

Qt 無邊框窗口,支持貼邊分屏

常規操作, 無法進行窗口的大小縮放和移動貼邊分屏等操作 // 去掉標題欄,去掉工具欄&#xff0c;窗口置頂 setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::WindowStaysOnTopHint);重點介紹 QWindowKit https://github.com/stdware/qwindowkit 跨平臺的支持Windows\…

Qt 樣式表:全面解析與應用指南

在 Qt 開發中,樣式表(Style Sheets)是定義應用程序界面外觀的關鍵工具。它采用文本格式的規則集合,借鑒了 CSS 語法,借助選擇器、屬性和值,能精準把控各類控件的外觀表現,極大提升了界面設計的靈活性與美觀性。 文章目錄 一、樣式可更改的效果?1、顏色相關效果?2、字體…

追蹤大型語言模型的思想(上)(來自針對Claude的分析)

概述 像 Claude 這樣的語言模型并非由人類直接編程&#xff0c;而是通過大量數據進行訓練。在訓練過程中&#xff0c;它們會學習解決問題的策略。這些策略被編碼在模型為每個單詞執行的數十億次計算中。對于我們這些模型開發者來說&#xff0c;這些策略是難以捉摸的。這意…

Python pandas 向excel追加數據,不覆蓋之前的數據

最近突然看了一下pandas向excel追加數據的方法&#xff0c;發現有很多人出了一些餿主意&#xff1b; 比如用concat,append等方法&#xff0c;這種方法的會先將舊數據df_1讀取到內存&#xff0c;再把新數據df_2與舊的合并&#xff0c;形成df_new,再覆蓋寫入&#xff0c;消耗和速…