文章目錄
- 前言
- 一、Web 概念
- 1.1 Web 的基本概念
- 1.1.1 Web的特點
- 1.2 B/S 架構模型
- 1.3 Web 請求與響應過程(重點)
- 1.4 靜態資源與動態資源
- 1.5 Web 的發展階段
- 1.6 案例:搭建最小 Web 服務
- 1.6.1 目標
- 1.6.2 搭建步驟
- 1.7 小結
- 二、HTTP 與 HTTPS 協議
- 2.1 HTTP與HTTPS區別
- 2.2 HTTPS 握手流程
- 2.3 HTTP狀態碼(重點)
- 2.3.1 HTTP 狀態碼概覽
- 2.3.2 常用狀態碼詳解
- 2.3.2.1 2xx 成功
- 2.3.2.2 3xx 重定向
- 2.3.2.3 4xx 客戶端錯誤(重點)
- 2.3.2.4 5xx 服務器錯誤(重點)
- 2.3.3 生活中的 HTTP 狀態碼類比
- 三、Nginx 概念
- 3.1 Nginx 介紹
- 3.1.1 Nginx 官網
- 3.2 Nginx與Apache的差異
- 3.3 Nginx 進程結構
- 四、Nginx安裝
- 4.1 關閉防火墻,將安裝nginx所需軟件包傳到/opt目錄下
- 4.2 安裝依賴包
- 4.3 創建運行用戶、組
- 4.4 編譯安裝Nginx
- 4.5 檢查、啟動、重啟、停止 nginx服務
- 4.6 添加 Nginx 系統服務
- 4.6.1 方法一
- 4.6.2 方法二
- 總結
前言
在互聯網技術體系中,Web
作為連接用戶與信息的核心載體,其底層邏輯與關鍵技術是每一位技術學習者、運維工程師及開發人員必須掌握的基礎。從用戶在瀏覽器輸入 URL 到頁面最終呈現,背后涉及 Web 架構模型、請求響應流程、協議交互等一系列復雜機制;而 Nginx
作為當前主流的高性能 Web 服務器,更是支撐海量并發訪問、保障服務穩定運行的關鍵工具。
為幫助讀者系統性梳理 Web 技術體系,逐步掌握從理論到實踐的完整技能鏈,特推出《Nginx 實戰系列》文章。本系列將以 “概念解析 - 原理深挖 - 實戰操作” 為核心邏輯,從基礎到進階,層層遞進地講解 Web 技術棧與 Nginx 的核心能力。
作為系列的第一篇,本文將聚焦 Web
的核心概念、HTTP/HTTPS
協議的關鍵機制,以及 Nginx
的安裝配置,為后續深入學習反向代理、負載均衡、性能優化等內容打下堅實基礎,無論是零基礎入門還是技術復盤,都能從中獲取清晰的知識框架與可落地的操作指南。
一、Web 概念
1.1 Web 的基本概念
Web(World Wide Web,萬維網)是運行在互聯網之上的一個超文本信息系統,它依賴于 HTTP/HTTPS 協議 實現瀏覽器與服務器之間的交互。
DNS解析:
生效順序:1、host文件 2、網卡配置 3、/etc/resolv.conf
1.1.1 Web的特點
- 分布式:資源分布在世界各地的服務器上。
- 跨平臺:只要有瀏覽器,就能訪問資源。
- 無狀態:每次 HTTP 請求都是獨立的,服務器不會記住客戶端狀態(除非使用 Cookie/Session)。
1.2 B/S 架構模型
Web 采用 B/S 架構(Browser/Server):
- Browser(瀏覽器):用戶的入口,發送請求、渲染頁面。
- Server(服務器):接收請求,返回所需資源或動態內容。
圖 1-1:B/S 架構示意圖
用戶瀏覽器 ──> Web服務器(Nginx/Apache)│└─> 應用服務器(PHP/Python/Java)│└─> 數據庫(MySQL/Redis)
1.3 Web 請求與響應過程(重點)
一次完整的 Web 訪問過程包括以下步驟:
- 輸入 URL:用戶在瀏覽器輸入
http://www.example.com
。 - DNS 解析:瀏覽器將域名解析為 IP 地址。
- 建立連接:瀏覽器與 Web 服務器建立 TCP 連接(3 次握手)。
- 發送請求:瀏覽器發起 HTTP 請求(GET/POST)。
- 服務器處理:
- Web 服務器處理靜態資源請求
- 動態請求轉發到應用服務器(如 Tomcat、Django)
- 應用服務器可能再查詢數據庫
- 返回響應:Web 服務器將結果打包成 HTTP 響應報文返回瀏覽器。
- 渲染頁面:瀏覽器解析 HTML、加載 CSS/JS、渲染最終頁面。
圖 1-2:Web 請求-響應流程
瀏覽器 ----> Web服務器 ----> 應用服務器 ----> 數據庫<---- <---- <----
1.4 靜態資源與動態資源
-
靜態資源:不需要服務器額外處理,直接返回即可。
- HTML、CSS、圖片、視頻、JS 文件
- 優點:速度快,壓力小
-
動態資源:需要服務器端代碼計算生成,再返回客戶端。
-
PHP 腳本、Python Flask/Django、Java Servlet、Ruby
-
優點:個性化內容,支持交互
-
圖 1-3 靜態與動態資源對比圖
靜態資源:用戶請求 → Web服務器直接返回
動態資源:用戶請求 → Web服務器 → 應用服務器運行代碼 → 返回結果
1.5 Web 的發展階段
- Web 1.0(只讀):以靜態網頁為主,用戶僅能被動瀏覽內容
- Web 2.0(交互式):支持用戶生成內容,AJAX等前端技術廣泛應用
- Web 3.0(智能化):引入語義網、區塊鏈技術,推動去中心化網絡發展
1.6 案例:搭建最小 Web 服務
注意后面安裝nginx之后再創建一個靜態頁面
1.6.1 目標
體驗一次最簡單的 Web 請求與響應過程 Wireshark 并且抓包。
三次握手與四次揮手:
1.6.2 搭建步驟
創建一個靜態頁面:
<!-- index.html -->
<html>
<head><title>My First Web</title></head>
<body>
<h1>Hello Web!</h1>
<p>This is my first web page.</p>
</body>
</html>HTML 文檔結構
<!-- index.html -->
<html(標簽)>
<head(頭部)><title>My First Web</title></head>
<body(主體)>
<h1(一級標題)>Hello Web!</h1>
<p(段落標簽)>This is my first web page.</p>
</body>
</html>
1.7 小結
- Web 是基于 B/S 架構 的信息交互方式。
- 核心是 請求-響應模型,通過 HTTP/HTTPS 協議傳輸數據。
- Web 可提供 靜態資源 和 動態資源。
二、HTTP 與 HTTPS 協議
2.1 HTTP與HTTPS區別
- HTTP:明文傳輸,不安全。
- HTTPS:在 HTTP 上加入 SSL/TLS 加密,防止中間人攻擊。
2.2 HTTPS 握手流程
TLS 握手過程:客戶端發起請求 → 服務端返回證書 → 雙方協商加密算法 → 建立安全通道。
客戶端 Hello → 服務端 Hello + 證書 → 客戶端驗證 → 加密通信
TLS 握手過程(建立安全通道)
流程:
-
客戶端 Hello
- 瀏覽器發起請求,告訴服務器自己支持哪些加密算法。
-
服務端 Hello + 證書
- 網站返回 SSL 證書(證明身份),選擇一種加密算法。
-
客戶端驗證證書
- 瀏覽器檢查證書是否可信(CA 頒發、沒過期、域名匹配)。
-
協商密鑰
- 雙方生成一個臨時密鑰,用于對稱加密后續通信。
-
加密通信開始
- 后續 HTTP 數據都通過加密通道傳輸。
2.3 HTTP狀態碼(重點)
2.3.1 HTTP 狀態碼概覽
HTTP 狀態碼都是 三位數字,按首位分為五類:
類型 | 范圍 | 含義 | 大白話理解 |
---|---|---|---|
1xx | 100–199 | 信息性狀態碼 | “我收到了請求,還在處理中” |
2xx | 200–299 | 成功 | “請求成功,服務器給你東西了” |
3xx | 300–399 | 重定向 | “你要的東西搬家了,去新地址找” |
4xx | 400–499 | 客戶端錯誤 | “你請求有問題(URL錯、權限不夠)” |
5xx | 500–599 | 服務器錯誤 | “服務器出問題,暫時拿不到東西” |
2.3.2 常用狀態碼詳解
2.3.2.1 2xx 成功
狀態碼 | 含義 | 類比 |
---|---|---|
200 OK | 請求成功 | “東西拿到了” |
201 Created | 創建成功 | “你提交的表單/資源已創建” |
204 No Content | 成功,但沒有內容 | “操作成功,但沒有額外東西返回” |
2.3.2.2 3xx 重定向
狀態碼 | 含義 | 類比 |
---|---|---|
301 Moved Permanently | 永久搬家 | “這個頁面永久換地址了” |
302 Found | 臨時搬家 | “暫時換地址,下一次還用舊地址” |
304 Not Modified | 內容未改 | “東西沒變,你可以用緩存” |
2.3.2.3 4xx 客戶端錯誤(重點)
狀態碼 | 含義 | 類比 |
---|---|---|
400 Bad Request | 請求格式錯 | “你寫的請求我看不懂” |
401 Unauthorized | 未認證 | “先登錄,再訪問” |
403 Forbidden | 禁止訪問 | “你沒權限” |
404 Not Found | 找不到頁面 | “東西搬走或根本沒這東西” |
2.3.2.4 5xx 服務器錯誤(重點)
狀態碼 | 含義 | 類比 |
---|---|---|
500 Internal Server Error | 服務器內部出錯 | “服務器崩了” |
502 Bad Gateway | 網關錯誤 | “我去找別的服務器,結果那邊掛了” |
503 Service Unavailable | 服務不可用 | “服務器忙不過來了,稍后再試” |
504 Gateway Timeout | 網關超時 | “找別的服務器太慢,超時了” |
2.3.3 生活中的 HTTP 狀態碼類比
場景 | 狀態碼 | 對應情況 |
---|---|---|
打開網頁正常 | 200 | 成功拿到網頁 |
點鏈接頁面搬家 | 301/302 | 瀏覽器自動跳到新地址 |
輸入錯網址 | 404 | “沒找到這個頁面” |
登錄需要權限 | 401 | “先登錄才能看” |
網站掛了 | 500 | “服務器出問題了” |
HTTP 狀態碼就是服務器對你請求的“回話信息”,告訴你請求成功沒、東西搬沒搬、你有沒有權限、或者服務器出問題了。
三、Nginx 概念
3.1 Nginx 介紹
Nginx (“engine x”) 是一個高性能的 HTTP 和反向代理服務器。Nginx 是由 Igor Sysoev 為俄羅斯訪問量第二的 Rambler.ru 站點開發的,第一個公開版本 0.1.0 發布于 2004 年 10 月 4 日。其將源代碼以類 BSD 許可證的形式發布,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。2011 年 6 月 1 日,Nginx 1.0.4 發布。企業中一般使用1.20
版本。
Nginx 是一款輕量級的 Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,單臺物理服務器可支持30 000~50 000個并發請求。并在一個 BSD-like 協議下發行。由俄羅斯的程序設計師 Igor Sysoev 所開發,供俄國大型的入口網站及搜索引擎 Rambler(俄文:Рамблер)使用。其特點是占有內存少,并發能力強,事實上 Nginx 的并發能力確實在同類型的網頁服務器中表現較好,中國大陸使用 Nginx 網站用戶有:百度 BWS、新浪、網易、騰訊等。
Nginx 是一個 高性能 Web 服務器,它可以做很多事情:
- 靜態資源服務:可以直接把網頁、圖片、視頻這些文件發給用戶。
- 反向代理:用戶訪問你的服務器,Nginx 可以幫你把請求轉發到后端真正處理請求的服務器。
- 負載均衡:Nginx 能夠智能地將訪問流量分配到多臺后端服務器,確保每臺服務器都能均衡處理請求,避免過載情況發生。
- 高并發處理:用事件驅動的方式處理請求,能同時處理成千上萬的用戶請求,而不會占用太多資源。
優勢:
- 輕量級,占用內存小
- 支持百萬級并發訪問
- 穩定可靠,開源且社區活躍
3.1.1 Nginx 官網
RamBler:http://www.rambler.ru/
nginx: http://nginx.org/Mainline version 主線版本
Stable version 穩定版本
Legacy versions 老版本,遺產版本舊版本下載:http://mirrors.sohu.com/nginx/
Nginx 中文參考地址: http://www.nginx.cn/doc/
3.2 Nginx與Apache的差異
- Nginx是一個基于事件的Web服務器,Apache是一個基于流程的服務器;
- Nginx避免子進程的概念,Apache是基于子進程的;
- Nginx在內存消耗和連接方面更好,Apache在內存消耗和連接方面一般;
- Nginx的性能和可伸縮性不依賴于硬件,Apache依賴于CPU和內存等硬件;
- Nginx支持熱部署,Apache不支持熱部署;
- Nginx對于靜態文件處理具有更高效率,Apache相對一般;
- Nginx在反向代理場景具有明顯優勢,Apache相對一般。
3.3 Nginx 進程結構
Web請求處理機制:
- 多進程方式:服務器每接收到一個客戶端請求就有服務器的主進程生成一個子進程響應客戶端,直到用戶關閉連接,這樣的優勢是處理速度快,子進程之間相互獨立,但是如果訪問過大會導致服務器資源耗盡而無法提供請求。
- 多線程方式:與多進程方式類似,但是每收到一個客戶端請求會有服務進程派生出一個線程來個客戶方進行交互,一個線程的開銷遠遠小于一個進程,因此多線程方式在很大程度減輕了web服務器對系統資源的要求,但是多線程也有自己的缺點,即當多個線程位于同一個進程內工作的時候,可以相互訪問同樣的內存地址空間,所以他們相互影響,一旦主進程掛掉則所有子線程都不能工作了,IIS服務器使用了多線程的方式,需要間隔一段時間就重啟一次才能穩定。
工作進程(worker process)的功能:
所有 Worker 進程都是平等的
實際處理:網絡請求,由 Worker 進程處理
Worker進程數量:一般設置為核心數,充分利用CPU資源,同時避免進程數量過多,導致進程競爭CPU資源,增加上下文切換的損耗
接受處理客戶的請求
將請求依次送入各個功能模塊進行處理
I/O調用,獲取響應數據
與后端服務器通信,接收后端服務器的處理結果
緩存數據,訪問緩存索引,查詢和調用緩存數據
發送請求結果,響應客戶的請求
接收主程序指令,比如重啟、升級和退出等
四、Nginx安裝
4.1 關閉防火墻,將安裝nginx所需軟件包傳到/opt目錄下
cd /opt
wget https://nginx.org/download/nginx-1.20.2.tar.gz
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
4.2 安裝依賴包
nginx的配置及運行需要pcre、zlib等軟件包的支持,因此需要安裝這些軟件的開發包,以便提供相應的庫和頭文件。
yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel
4.3 創建運行用戶、組
Nginx 服務程序默認以 nobody 身份運行,建議為其創建專門的用戶賬號,以便更準確地控制其訪問權限
#-M:不創建用戶的主目錄
#-s /sbin/nologin:將用戶的登錄shell設置為/sbin/nologin,禁止交互式登錄
useradd -M -s /sbin/nologin nginx
4.4 編譯安裝Nginx
cd /opt
tar zxvf nginx-1.20.2.tar.gz -C /opt/
cd nginx-1.20.2/
./configure \
--prefix=/usr/local/nginx \ #指定nginx的安裝路徑
--user=nginx \ #指定用戶名
--group=nginx \ #指定組名
--with-http_stub_status_module #啟用 http_stub_status_module 模塊以支持狀態統計
--with-http_ssl_module # 啟用 HTTPS 模塊
執行以下代碼:
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ #讓系統識別nginx的操作命令
企業中常用的模塊:
./configure
–prefix=/usr/local/nginx \ # 安裝目錄
–user=nginx \ # 運行用戶(后續會創建)
–group=nginx \ # 運行用戶組
–with-http_ssl_module \ # 啟用 HTTPS 模塊
–with-http_v2_module \ # 啟用 HTTP/2 協議(提升性能)
–with-http_gzip_static_module \ # 啟用靜態 gzip 壓縮
–with-http_stub_status_module \ # 啟用狀態監控模塊
–with-pcre \ # 啟用 PCRE 正則支持(rewrite 依賴)
–with-stream \ # 啟用 TCP 代理模塊(如反向代理數據庫)
–with-stream_ssl_module \ # 啟用 TCP 代理的 SSL 支持
–http-log-path=/var/log/nginx/access.log \ # 訪問日志路徑
–error-log-path=/var/log/nginx/error.log \ # 錯誤日志路徑
–pid-path=/var/run/nginx/nginx.pid \ # PID 文件路徑
–lock-path=/var/lock/nginx.lock # 鎖文件路徑
注意:
可根據需求增減模塊(如 --without-xxx 禁用不需要的模塊)
企業若需特殊模塊(如第三方緩存模塊),可通過 --add-module 引入
4.5 檢查、啟動、重啟、停止 nginx服務
#檢查配置文件是否配置正確
nginx -t
#啟動
nginx
nginx拓展
#停止
cat /usr/local/nginx/logs/nginx.pid #先查看nginx的PID號
kill -3 <PID號>
kill -s QUIT <PID號>
killall -3 nginx
killall -s QUIT nginx
#重載
kill -1 <PID號>
kill -s HUP <PID號>
killall -1 nginx
killall -s HUP nginx
#日志分割,重新打開日志文件
kill -USR1 <PID號>
#平滑升級
kill -USR2 <PID號>
信號編號 | 信號名 | 含義 |
---|---|---|
0 | EXIT | 程序退出時收到該信息。 |
1 | HUP | 掛掉電話線或終端連接的掛起信號,這個信號也會造成某些進程在沒有終止的情況下重新初始化。 |
2 | INT | 表示結束進程,但并不是強制性的,常用的 “Ctrl+C” 組合鍵發出就是一個 kill -2 的信號。 |
3 | QUIT | 退出。 |
9 | KILL | 殺死進程,即強制結束進程。 |
11 | SEGV | 段錯誤。 |
15 | TERM | 正常結束進程,是 kill 命令的默認信號 |
4.6 添加 Nginx 系統服務
4.6.1 方法一
vim /etc/init.d/nginx
#!/bin/bash
#chkconfig: 35 99 20 // 這是固定格式,2345表示運行級別,之后為開機執行順序和關機執行順序
#description:Nginx Service Control Script //這也是必須的
COM="/usr/local/nginx/sbin/nginx"
PID="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)$COM
;;stop)kill -s QUIT $(cat $PID)
;;restart)$0 stop$0 start
;;reload)kill -s HUP $(cat $PID)
;;*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1esac
exit 0
chmod +x /etc/init.d/nginx
chkconfig --add nginx #添加為系統服務
systemctl stop nginx
systemctl start nginx
4.6.2 方法二
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
[Unit]:服務的說明
Description:描述服務
After:依賴,當依賴的服務啟動之后再啟動自定義的服務[Service]服務運行參數的設置
Type=forking是后臺運行的形式,使用此啟動類型應同時指定
PIDFile以便systemd能夠跟蹤服務的主進程。
ExecStart為服務的具體運行命令
ExecReload為重啟命令
ExecStop為停止命令
PrivateTmp=True表示給服務分配獨立的臨時空間
注意:啟動、重啟、停止命令全部要求使用絕對路徑[Install]服務安裝的相關設置,可設置為多用戶
chmod 754 /lib/systemd/system/nginx.servicesystemctl start nginx.service
systemctl enable nginx.service
總結
本文作為《Nginx 實戰系列》的開篇,圍繞 Web 技術體系的 “基礎層” 與 “工具層” 展開,完成了從理論到實踐的初步銜接。在 Web 概念部分,我們明確了 Web 作為超文本信息系統的本質,梳理了 B/S 架構的組成、一次完整 Web 請求 - 響應的 7 個關鍵步驟,并區分了靜態資源與動態資源的差異,同時回顧了 Web 從 1.0 到 3.0 的發展脈絡,幫助讀者建立對 Web 技術的整體認知。
在 HTTP/HTTPS
協議部分,重點對比了兩者的安全性差異,拆解了 TLS 握手的 5 個核心流程,并系統梳理了 HTTP 狀態碼的分類與常用場景 —— 尤其是 4xx 客戶端錯誤與 5xx 服務器錯誤的典型狀態碼,為后續問題排查提供了關鍵依據。
在 Nginx
實戰部分,我們從環境準備、依賴安裝、用戶創建,到編譯配置、服務啟停與系統服務注冊,完整呈現了 Nginx 1.20 版本的安裝流程,同時補充了 Nginx 的進程結構、核心功能(靜態資源服務、反向代理等)及與 Apache 的差異,讓讀者不僅能完成安裝操作,更能理解背后的設計邏輯。
后續系列文章將在此基礎上,進一步深入 Nginx
的核心配置(如反向代理、負載均衡)、性能優化、日志分析與故障排查等內容,持續完善 Web 技術與 Nginx
實戰的知識體系,助力讀者將理論轉化為實際應用能力。