這是一個關于 ??Web 服務器基本工作流程?? 的全面解釋。
我們以最經典的 ??客戶端-服務器-后端?? 三層架構為例,并結合你之前遇到的 Nginx 場景進行說明。
??核心角色??
- ??客戶端 (Client)??: 通常是 ??Web 瀏覽器?? (Chrome, Firefox) 或 ??API 調用程序?? (curl, Postman, 手機App)。
- ??Web 服務器 (Web Server)??: 如 ??Nginx??、Apache。負責接收請求、處理靜態資源或轉發請求。
- ??應用服務器 (Application Server)??: 運行業務邏輯的后端程序,如 ??PHP-FPM??、Node.js、Python (Django/Flask)、Java (Tomcat) 等。
- ??數據層 (Data Layer)??: 數據庫 (MySQL, PostgreSQL)、緩存 (Redis)、外部 API 等。
??Web 服務器基本工作流程(七步曲)??
整個流程可以概括為以下七個核心步驟,下圖清晰地展示了請求的生命周期:
sequenceDiagramparticipant C as 客戶端 (瀏覽器)participant N as Web 服務器 (Nginx)participant A as 應用服務器 (PHP/Node)participant D as 數據庫/緩存Note over C, D: 1. 建立連接 & 接收請求C->>N: TCP 三次握手<br>發送 HTTP 請求 (GET /index.html)Note over C, D: 2. 解析請求N->>N: 解析請求行、頭、體<br>確定 server_name, locationNote over C, D: 3. 匹配并處理請求alt 請求靜態資源 (如 .html, .css, .js)N->>N: 從 root 指令指定的路徑讀取文件else 請求動態資源 (如 .php, /api/)N->>A: 代理轉發 (proxy_pass/fastcgi_pass)A->>D: 執行代碼、查詢數據庫D-->>A: 返回數據A-->>N: 生成內容返回endNote over C, D: 4. 生成并返回響應N->>N: 構造 HTTP 響應頭/體<br>狀態碼、Content-Type等N->>C: 發送 HTTP 響應Note over C, D: 5. 記錄日志N->>N: 寫入 access.log<br>(可選)寫入 error.logNote over C, D: 6. 關閉或保持連接alt 連接保持 (HTTP/1.1 Keep-Alive)Note over C, N: 連接復用,等待下一個請求else 連接關閉N->>C: TCP 四次揮手endNote over C, D: 7. 客戶端處理C->>C: 接收響應<br>解析 HTML、加載靜態資源<br>渲染頁面
下面我們來詳細分解圖中的每一步。
??第 1 步:建立連接 & 接收請求 (Connection & Request Acceptance)??
- ??工作原理??:
- 客戶端(瀏覽器)向服務器的 ??知名端口??(如 HTTP-80, HTTPS-443)發起 ??TCP 三次握手??,建立連接。
- 連接建立后,客戶端通過該連接發送 ??HTTP 請求報文??。
- Web 服務器(Nginx)的 ??監聽套接字?? 接收到這個連接和請求數據。
- ??相關概念??: TCP/IP 協議棧、Socket。
??第 2 步:解析請求 (Request Parsing)??
- ??工作原理??:
- Web 服務器解析收到的原始 HTTP 請求數據,將其轉換為結構化的、程序易于處理的信息。
- ??解析內容包括??:
- ??請求行??:
GET /index.html HTTP/1.1
(方法、路徑、協議版本)。 - ??請求頭??:
Host: example.com
,User-Agent
,Cookie
,Content-Type
等。 - ??請求體??(如有): POST 提交的表單數據、JSON 等。
- ??請求行??:
- ??你的案例??: Nginx 解析出
GET /sc/backend/info?... HTTP/1.1
和Host: app-solitairedash-ios.bingodash.club
。
??第 3 步:匹配并處理請求 (Request Processing)??
這是 ??最核心的一步??。服務器根據解析出的信息,決定如何響應這個請求。
- ??工作原理??:
- Nginx 根據
server_name
指令匹配到處理該請求的 ??虛擬主機 (Server Block)??。 - 再根據請求路徑(如
/sc/backend/info
)匹配到對應的 ??location 塊??。 - 根據
location
塊中的指令采取行動,主要有兩種方式:- ??直接處理??: 如果請求的是靜態資源(如
.html
,.css
,.js
, 圖片)。- Nginx 根據
root
或alias
指令找到文件,直接讀取其內容。
- Nginx 根據
- ??代理轉發??: 如果請求的是動態資源(如
.php
,/api/
路徑)。- Nginx 作為 ??反向代理??,將請求轉發給后端的應用服務器(如 PHP-FPM, Tomcat, Node.js)。
- 使用
proxy_pass
(轉發給 HTTP 服務)或fastcgi_pass
(轉發給 FastCGI 服務如 PHP-FPM)。 - ??應用服務器執行業務邏輯??(查詢數據庫、處理業務),生成內容,返回給 Nginx。
- ??直接處理??: 如果請求的是靜態資源(如
- Nginx 根據
??第 4 步:生成并返回響應 (Response Construction & Delivery)??
- ??工作原理??:
- Web 服務器將處理結果組裝成一個格式正確的 ??HTTP 響應報文??。
- ??響應包括??:
- ??狀態行??:
HTTP/1.1 200 OK
或HTTP/1.1 404 Not Found
或HTTP/1.1 301 Moved Permanently
。 - ??響應頭??:
Content-Type
,Content-Length
,Set-Cookie
,Location
(用于重定向)等。 - ??響應體??: 請求的實際內容(HTML、JSON、圖片數據等)。
- ??狀態行??:
- 服務器通過建立的 TCP 連接將響應報文發送回客戶端。
??第 5 步:記錄日志 (Logging)??
- ??工作原理??:
- 請求處理完畢后,Web 服務器會將本次請求的詳細信息記錄到 ??訪問日志 (access.log)?? 中。
- 如果處理過程中發生錯誤(如文件未找到、權限不足、后端服務掛掉),會將錯誤信息記錄到 ??錯誤日志 (error.log)?? 中。
- ??你的案例??: 你看到的
301
狀態碼就記錄在access.log
中。
??第 6 步:關閉或保持連接 (Connection Management)??
- ??工作原理??:
- ??HTTP/1.1 默認開啟 Keep-Alive??: TCP 連接不會立即關閉,可以用于后續的多個請求-響應循環,減少重復建立連接的開銷,提升性能。
- ??連接空閑一段時間或完成后??: 最終會由一方發起 ??TCP 四次揮手?? 來關閉連接。
??第 7 步:客戶端處理 (Client Processing)??
- ??工作原理??:
- 客戶端(瀏覽器)接收到 HTTP 響應。
- 根據狀態碼和
Content-Type
決定如何處理響應體(如渲染 HTML、執行 JavaScript、保存文件)。 - 瀏覽器引擎開始工作(解析、布局、渲染),最終將頁面呈現給用戶。
??總結??
Web 服務器就像一個 ??高效的調度中心??:
- ??接收?? 來自各方的請求。
- ??解析?? 請求內容,搞清楚對方要什么。
- ??路由?? 請求,決定是自己處理還是轉交給其他專家(應用服務器)。
- ??打包?? 處理結果,并 ??返回?? 給請求方。
- ??記錄?? 下所有工作流水賬(日志),以備查閱。
你之前遇到的 301
狀態碼,正是在 ??第 4 步(生成響應)?? 中,由 Nginx 根據 ??第 3 步(location 匹配)?? 的規則 (return 301
或 rewrite ... permanent
) 生成的,目的是告訴瀏覽器:“你要的資源永久地搬到了新地址,請去那里找”。