文章目錄
- 前言
- 一、Web 概念
- 1.1 Web 的基本概念
- 1.1.1 特點
- 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 常用狀態碼詳解
- 三、Nginx 概念
- 3.1 Nginx 介紹
- 3.1.1 主要功能
- 3.1.2 優勢
- 3.1.3 官網與版本
- 3.2 Nginx 與 Apache 的差異
- 3.3 Nginx 進程結構
- 四、Nginx 安裝
- 五、Nginx 配置
- 5.1 全局配置
- 5.2 I/O 事件配置
- 5.3 HTTP 配置
- 5.4 Web 服務監聽配置
- 5.5 其他配置
- 5.5.1 日志格式
- 5.5.2 別名配置
- 六、Nginx 虛擬主機
- 6.1 訪問狀態統計配置
- 6.1.1 查看已安裝模塊
- 6.1.2 修改 nginx.conf 配置文件
- 6.1.3 重載服務并測試
- 6.2 基于授權的訪問控制
- 6.2.1 生成密碼文件
- 6.2.2 配置認證
- 6.2.3 重載服務并測試
- 6.3 基于客戶端的訪問控制
- 6.4 基于域名的虛擬主機
- 6.4.1 域名解析
- 6.4.2 準備網頁文檔
- 6.4.3 配置 Nginx
- 6.5 基于 IP 的虛擬主機
- 6.5.1 配置多 IP
- 6.5.2 配置 Nginx
- 6.6 基于端口的虛擬主機
- 6.6.1 配置不同端口
- 總結
前言
在當今互聯網時代,Web 服務已成為信息傳遞與交互的重要載體。無論是靜態網頁還是動態應用,背后都離不開穩定、高效的服務器支持。Nginx 作為一款高性能的 Web 服務器和反向代理工具,因其出色的并發處理能力和靈活的配置方式,被廣泛應用于各類網站架構中。本文將從 Web 的基本概念出發,逐步介紹 HTTP/HTTPS 協議、Nginx 的核心特性及其安裝與配置方法,幫助讀者系統理解 Web 服務的工作原理與 Nginx 的實際應用。
一、Web 概念
1.1 Web 的基本概念
Web(World Wide Web,萬維網)是運行在互聯網之上的一個超文本信息系統,它依賴于 HTTP/HTTPS 協議 實現瀏覽器與服務器之間的交互。
1.1.1 特點
- 分布式:資源分布在世界各地的服務器上。
- 跨平臺:只要有瀏覽器,就能訪問資源。
- 無狀態:每次 HTTP 請求都是獨立的,服務器不會記住客戶端狀態(除非使用
Cookie
/Session
)。
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
。瀏覽器會判斷輸入的內容是否符合超文本連接協議,判斷是否要進行下一步。
會將輸入的URL解析為四部分
- 協議:
http://
- 域名:
www.example.com
- 端口:
:80
- 路徑:
/index
- DNS 解析:瀏覽器將域名解析為 IP 地址。
DNS解析會逐層解析:
- 先解析主機(檢查host文件)
- 然后解析網卡配置
- 再解析/etc/resolv.conf
- 建立連接:瀏覽器與 Web 服務器建立 TCP 連接(3 次握手)。
- 發送請求:瀏覽器發起 HTTP 請求(GET/POST)。
請求報文內包含:請求行、請求頭、請求體 - 服務器處理:
- 解析請求報文
- Web 服務器處理靜態資源請求
- 路由處理,動態請求轉發到應用服務器(如 Tomcat、Django)
- 業務處理,應用服務器可能再查詢數據庫
- 返回響應:Web 服務器將結果打包成 HTTP 響應報文返回瀏覽器。
響應報文內包含、狀態行、響應頭、響應體 - 渲染頁面:瀏覽器解析 HTML、加載 CSS/JS、渲染最終頁面。
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 服務
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>
在訪問網頁的同時開啟Wireshark 進行抓包:
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 狀態碼概覽
類型 | 范圍 | 含義 | 大白話理解 |
---|---|---|---|
1xx | 100–199 | 信息性狀態碼 | “我收到了請求,還在處理中” |
2xx | 200–299 | 成功 | “請求成功,服務器給你東西了” |
3xx | 300–399 | 重定向 | “你要的東西搬家了,去新地址找” |
4xx | 400–499 | 客戶端錯誤 | “你請求有問題(URL錯、權限不夠)” |
5xx | 500–599 | 服務器錯誤 | “服務器出問題,暫時拿不到東西” |
2.3.2 常用狀態碼詳解
-
2xx 成功
- 200 OK:請求成功
- 201 Created:創建成功
- 204 No Content:成功,但沒有內容
-
3xx 重定向
- 301 Moved Permanently:永久搬家
- 302 Found:臨時搬家
- 304 Not Modified:內容未改
-
4xx 客戶端錯誤
- 400 Bad Request:請求格式錯
- 401 Unauthorized:未認證
- 403 Forbidden:禁止訪問
- 404 Not Found:找不到頁面
-
5xx 服務器錯誤
- 500 Internal Server Error:服務器內部出錯
- 502 Bad Gateway:網關錯誤
- 503 Service Unavailable:服務不可用
- 504 Gateway Timeout:網關超時
三、Nginx 概念
3.1 Nginx 介紹
- Nginx 簡介
Nginx(“engine x”)是一款高性能的 HTTP 服務器和反向代理服務器,同時支持 IMAP/POP3 電子郵件代理功能。由俄羅斯程序員 Igor Sysoev 開發,最初用于服務俄羅斯第二大訪問量的網站 Rambler.ru。
- 發展歷程
Nginx 的首個公開版本 0.1.0 發布于 2004 年 10 月 4 日。2011 年 6 月 1 日發布了穩定版本 1.0.4。目前企業環境中多采用 1.20 版本。
- 技術特性
采用類 BSD 許可證開源發布,具有以下顯著優勢:- 出色的穩定性
- 豐富的功能集
- 詳實的示例配置文件
- 極低的系統資源消耗
作為輕量級服務器解決方案,單臺物理服務器可處理 30,000~50,000 個并發請求,在同類型產品中展現出卓越的并發處理能力。
-
應用場景
廣泛應用于全球各大網站,中國大陸采用 Nginx 的知名企業包括:- 百度 BWS
- 新浪
- 網易
- 騰訊
-
架構優勢
其內存占用少、并發能力強的特點使其成為高流量網站的首選解決方案,在同類網頁服務器中表現尤為突出。
3.1.1 主要功能
- 靜態資源服務:可以直接把網頁、圖片、視頻這些文件發給用戶。
- 反向代理:用戶訪問你的服務器,Nginx 可以幫你把請求轉發到后端真正處理請求的服務器。
- 負載均衡:當有很多后端服務器時,Nginx 可以智能分配流量,讓每臺服務器都不忙不過來。
- 高并發處理:用事件驅動的方式處理請求,能同時處理成千上萬的用戶請求,而不會占用太多資源。
3.1.2 優勢
- 輕量級,占用內存小
- 支持百萬級并發訪問
- 穩定可靠,開源且社區活躍
3.1.3 官網與版本
- 官網:http://nginx.org/
- 版本類型:Mainline(主線)、Stable(穩定)、Legacy(舊版)
3.2 Nginx 與 Apache 的差異
- Nginx 基于事件驅動,Apache 基于進程
- Nginx 更節省內存,支持更高并發
- Nginx 支持熱部署,Apache 不支持
- Nginx 在靜態文件和反向代理場景下更具優勢
3.3 Nginx 進程結構
Nginx 采用多進程模型:
- 主進程:管理 worker 進程
- Worker 進程:實際處理請求,數量通常與 CPU 核心數相同
Worker 進程功能:
- 接受并處理客戶請求
- I/O 調用,獲取響應數據
- 與后端服務器通信
- 緩存數據
- 響應客戶請求
四、Nginx 安裝
可使用腳本快速安裝 Nginx,方便復制粘貼執行。詳情看另一篇博客😉😉😉
五、Nginx 配置
vim /usr/local/nginx/conf/nginx.conf
#修改前一定要進行備份
- Nginx配置文件大致構造圖
5.1 全局配置
user nobody; #運行用戶,若編譯時未指定則默認為 nobody
worker_processes 4; #工作進程數量,可配置成服務器內核數 * 2,如果網站訪問量不大,一般設為1就夠用了
error_log logs/error.log; #錯誤日志文件的位置
pid logs/nginx.pid; #PID 文件的位置
5.2 I/O 事件配置
events {use epoll; # 使用 epoll 模型,2.6及以上版本的系統內核,建議使用epoll模型以提高性能worker_connections 4096; # 每個進程處理 4096 個連接
}
如提高每個進程的連接數還需執行ulimit -n 65535
命令臨時修改本地每個進程可以同時打開的最大文件數。
在Linux平臺上,在進行高并發TCP連接處理時,最高的并發數量都要受到系統對用戶單一進程同時可打開文件數量的限制(這是因為系統為每個TCP連接都要創建一個socket句柄,每個socket句柄同時也是一個文件句柄)。
可使用ulimit -a
命令查看系統允許當前用戶進程打開的文件數限制。修改/etc/security/limits.conf
可永久修改限制。
epoll是Linux內核為處理大批句柄而作改進的poll,是Linux下多路復用IO接口select/poll的增強版本,它能顯著的減少程序在大量并發連接中只有少量活躍的情況下的系統CPU利用率。
若工作進程數為 8,每個進程處理 4096 個連接,則允許 Nginx 正常提供服務的連接數已超過 3 萬個(4096×8=32768),當然具體還要看服務器硬件、網絡帶寬等物理條件的性能表現。
在配置工作進程數和工作進程處理數量時需要保證如下條件:
工作進程數(worker_processes) * 工作進程處理數量(worker_processes)> 系統內設置的每個進程允許同時打開的最大文件數(ulimit -n)
當僅改變了工作進程數、工作進程處理數量而未改變系統內設置的每個進程允許同時打開的最大文件數時,會導致設置不起作用。
5.3 HTTP 配置
http {#引入文件擴展名和文件映射表include mime.types;#為無法通過 MIME 類型映射識別的文件設置默認類型default_type application/octet-stream; #下面三行為配置日志格式,生產環境中多為非注釋狀態,通過獲取用戶信息傳至后端做操作#log_format main '$remote_addr - $remote_user [$time_local] "$request" '# '$status $body_bytes_sent "$http_referer" '# '"$http_user_agent" "$http_x_forwarded_for"';#設置日志路徑#access_log logs/access.log main;#支持文件發送(下載)sendfile on; ##此選項允許或禁止使用socket的TCP_CORK的選項(發送數據包前先緩存數據),此選項僅在使用sendfile的時候使用#tcp_nopush on;#設置連接保持時間,單位秒#keepalive_timeout 0;keepalive_timeout 65;#支持gzip壓縮#gzip on;...
5.4 Web 服務監聽配置
server {#設置監聽端口listen 80;#設置匹配域名,可以有多個,空格隔開server_name localhost;#設置網頁的默認字符集charset utf-8;#根目錄配置location / {# root配置網站根目錄位置#root目錄在/usr/local/nginx/html下root html;#index指定默認首頁名index index.html index.htm;}#內部錯誤反饋頁面error_page 500 502 503 504 /50x.html;#錯誤頁面配置location = /50x.html {root html;}}
5.5 其他配置
5.5.1 日志格式
- $remote_addr與$http_x_forwarded_for用以記錄客戶端的ip地址;
- $remote_user:用來記錄客戶端用戶名稱;
- $time_local: 用來記錄訪問時間與時區;
- $request: 用來記錄請求的url與http協議;
- $status: 用來記錄請求狀態;成功是200,
- $body_bytes_sent :記錄發送給客戶端文件主體內容大小;
- $http_referer:用來記錄從哪個頁面鏈接訪問過來的;
- $http_user_agent:記錄客戶瀏覽器的相關信息;
通常web服務器放在反向代理的后面,這樣就不能獲取到客戶的IP地址了,通過$remote_addr
拿到的IP地址是反向代理服務器的iP地址。反向代理服務器在轉發請求的http頭信息中,可以增加x_forwarded_for
信息,用以記錄原有客戶端的IP地址和原來客戶端的請求的服務器地址。
5.5.2 別名配置
可以在配置文件中進行別名設置,不同于root
會在設置的路徑后追加查詢的路徑,alias
會直接替換匹配到的內容,達成路徑替換,并且alias
可以訪問到不在nginxroot
路徑下的文件夾
特性 | alias | root |
---|---|---|
功能 | 路徑替換 | 路徑追加 |
語法 | alias /path/to/dir/; | root /path/to/dir/; |
結尾斜線 | 強烈建議匹配和別名路徑都加 / | 建議加 / |
正則匹配 | 必須使用捕獲組(如 $1 ) | 不需要 |
適用場景 | 將請求映射到與 root 無關的完全不同的目錄 | 請求路徑與文件系統路徑結構基本一致時 |
六、Nginx 虛擬主機
6.1 訪問狀態統計配置
6.1.1 查看已安裝模塊
當設置了軟鏈接將nginx引入了$PATH中的路徑時,可以直接使用nginx命令。nginx -v
用來確認--with-http_stub_status_module
模塊已安裝
也可以使用
cat /opt/nginx-1.20.2/auto/options | grep YES
查看 nginx 已安裝的所有模塊
/usr/local/nginx/sbin/nginx -V
6.1.2 修改 nginx.conf 配置文件
修改 nginx.conf
配置文件,指定訪問位置并添加 stub_status
配置。
location /status {stub_status on;access_log off;
}
6.1.3 重載服務并測試
可以 curl -s http://192.168.10.21/status 結合 awk與if 語句進行性能監控。
systemctl reload nginx
curl http://192.168.10.123/status
#或瀏覽器訪問 http://192.168.10.21/status
-
Active connections :表示當前的活動連接數
-
Accepts(接受連接數)
- 含義: 自Nginx啟動以來,已經接受的客戶端連接總數。
- 詳細解釋: 這個數字表示客戶端與Nginx服務器成功建立 TCP 連接 的次數。每當一個客戶端(如瀏覽器、移動應用等)嘗試連接到Nginx服務器并且TCP握手成功,這個計數器就會增加1。
- 注意: 它只計算連接的數量,而不是請求的數量。一個連接上可以通過HTTP Keep-Alive特性發送多個請求。
-
Handled(處理連接數)
- 含義: 自Nginx啟動以來,已經成功處理的操作連接總數。
- 詳細解釋: 這是最關鍵的指標。一個連接被“Accept”后,Nginx會繼續處理它。絕大多數情況下,連接都會被成功處理。但如果Nginx在accept之后遇到錯誤(例如,客戶端在發送任何請求之前就斷開了連接,或者分配工作進程時出現問題),就可能出現 Accepts > Handled 的情況。
- 正常情況下: Accepts 和 Handled 的值應該是非常接近的。如果兩者差距很大,通常表明網絡不穩定或客戶端行為異常(大量瞬間斷開)。
-
Requests(請求數)
- 含義: 自Nginx啟動以來,已經處理的客戶端請求總數。
詳細解釋: 這是三個指標中最大的數字。它計算的是在所有這些已建立的連接(Handled)上,Nginx總共處理了多少個 HTTP 請求。 - 關鍵區別:
- Accepts 和 Handled 統計的是 連接(Connections)。
- Requests 統計的是 請求(Requests)。
- 含義: 自Nginx啟動以來,已經處理的客戶端請求總數。
由于HTTP Keep-Alive的作用,一個TCP連接可以發送多個HTTP請求。因此,Requests 的數量總是會遠大于 Handled 的數量。例如,一個瀏覽器打開一個網頁,它與服務器建立1個TCP連接(Accepts+1, Handled+1),然后通過這個連接請求了HTML、CSS、JS、圖片等共20個資源(Requests+20)。
stub_status
這個配置曾常被用于統計網頁訪問數,現在版本的nginx中可以使用更詳細、更直觀的VST
進行訪問次數的查詢。
6.2 基于授權的訪問控制
6.2.1 生成密碼文件
yum install -y httpd-tools
htpasswd -c /usr/local/nginx/passwd.db lisi
chown nginx /usr/local/nginx/passwd.db
chmod 400 /usr/local/nginx/passwd.db
6.2.2 配置認證
vim /usr/local/nginx/conf/nginx.conf
......server {location / {...auth_basic "plase inser sercet";auth_basic_user_file /usr/local/nginx/passwd.db;}
6.2.3 重載服務并測試
nginx -t
systemctl reload nginx瀏覽器訪問 http://192.168.10.123
輸入網址后提示登錄,輸入剛剛配置的lisi用戶名及密碼后正常登錄。
6.3 基于客戶端的訪問控制
訪問控制規則如下:
- deny IP/IP 段:拒絕某個 IP 或 IP 段的客戶端訪問。
- allow IP/IP 段:允許某個 IP 或 IP 段的客戶端訪問。
- 規則從上往下執行,如匹配則停止,不再往下匹配。
vim /usr/local/nginx/conf/nginx.conf
......server {location / {...#添加控制規則allow 192.168.10.120; #允許訪問的客戶端 IPdeny all; #拒絕其它IP客戶端訪問}}
6.4 基于域名的虛擬主機
6.4.1 域名解析
echo "192.168.10.21 www.acb.com www.look.com" >> /etc/hosts
6.4.2 準備網頁文檔
mkdir -p /usr/local/nginx/html/{abc,look}
echo "<h1>www.abc.com</h1>" > /usr/local/nginx/html/abc/index.html
echo "<h1>www.look.com</h1>" > /usr/local/nginx/html/look/index.html
6.4.3 配置 Nginx
server {listen 80;server_name www.look.com;charset utf-8;access_log logs/www.look.access.log;location / {root /usr/local/nginx/html/look;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = 50x.html{root html;}}server {listen 80;server_name www.abc.com;charset utf-8;access_log logs/www.abc.access.log;location / {root /usr/local/nginx/html/abc;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = 50x.html{root html;}}
6.5 基于 IP 的虛擬主機
6.5.1 配置多 IP
ifconfig ens36 192.168.10.40 netmask 255.255.255.0
6.5.2 配置 Nginx
server {listen 192.168.10.123:81;server_name www.look.com;charset utf-8;access_log logs/www.look.access.log;location / {root /usr/local/nginx/html/look;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = 50x.html{root html;}}server {listen 192.168.10.140:81;server_name www.abc.com;charset utf-8;access_log logs/www.abc.access.log;location / {root /usr/local/nginx/html/abc;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = 50x.html{root html;}}
6.6 基于端口的虛擬主機
6.6.1 配置不同端口
server {listen 8080;server_name www.look.com;charset utf-8;access_log logs/www.look.access.log;location / {root /usr/local/nginx/html/look;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = 50x.html{root html;}}server {listen 8081;server_name www.abc.com;charset utf-8;access_log logs/www.abc.access.log;location / {root /usr/local/nginx/html/abc;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = 50x.html{root html;}}
總結
本文系統介紹了 Web 服務的基本概念、HTTP/HTTPS 協議、Nginx 的核心特性及其配置方法。通過理解 B/S 架構、請求響應流程、靜態與動態資源的區別,以及 Nginx 的高并發處理機制,讀者可以更好地構建和優化 Web 服務。Nginx 的靈活配置與高性能使其成為現代 Web 架構中不可或缺的重要組成部分。掌握其虛擬主機、訪問控制、狀態監控等高級功能,將有助于提升網站的安全性、可用性和可維護性。