web服務基礎介紹
一、Web服務核心流程
二、互聯網發展里程碑
關鍵事件時間軸:
三、Web服務器演進
Apache工作模式對比:
模式 | 并發處理方式 | 優點 | 缺點 | 適用場景 |
---|---|---|---|---|
Prefork | 多進程(select) | 穩定可靠 | 高內存消耗 | 低并發場景 |
Worker | 多進程+多線程 | 內存占用少 | Keepalive資源浪費 | 中等并發 |
Event | 事件驅動(epoll) | 高并發性能 | 無線程安全控制 | 高并發長連接場景 |
Nginx核心優勢:
# Nginx典型應用架構示例
http {upstream app_servers {server 10.0.0.101:8080 weight=5;server 10.0.0.102:8080;}server {listen 80;server_name example.com;# 靜態資源直返location ~* \.(jpg|css|js)$ {root /data/static;expires 30d;}# 動態請求代理location /api {proxy_pass http://app_servers;proxy_set_header X-Real-IP $remote_addr;}}
}
四、用戶體驗關鍵指標
性能影響研究數據:
- 8秒定律:頁面加載>8秒 → 30%用戶放棄
- 亞馬遜:延遲100ms → 1%交易損失
- Google:延遲500ms → 20%流量下降
- 79%用戶不會再次訪問慢速網站
- 40%用戶在3秒延遲后離開
性能影響因素矩陣:
五、服務端I/O深度解析
磁盤I/O性能計算:
# 機械磁盤IOPS計算公式
def calculate_iops(rpm):seek_time = 9 # 7200RPM尋址時間(ms)rotational_latency = 60000 / rpm / 2 # 旋轉延遲total_latency = seek_time + rotational_latencyreturn 1000 / total_latencyprint(f"7200RPM磁盤IOPS: {calculate_iops(7200):.1f}") # 75.9
print(f"15000RPM磁盤IOPS: {calculate_iops(15000):.1f}") # 166.6
網絡I/O處理流程:
- 請求接收:TCP三次握手建立連接
- 數據處理:
- 內核空間 → 用戶空間數據拷貝
- 應用層請求處理
- 響應返回:
- 用戶空間 → 內核空間拷貝
- 內核 → 網卡傳輸
六、I/O模型演進
五種I/O模型對比:
Epoll核心優勢代碼解析:
// Epoll高效實現原理
int epoll_create(int size); // 創建epoll實例struct epoll_event {uint32_t events; // EPOLLIN/EPOLLOUT等epoll_data_t data; // 用戶數據
};// 注冊監控事件
epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &event);// 等待事件就緒
int n = epoll_wait(epfd, events, MAX_EVENTS, timeout);
for (int i = 0; i < n; i++) {process_event(events[i]); // 僅處理活躍連接
}
七、零拷貝技術
傳統vs零拷貝對比:
sendfile實現原理:
http {sendfile on; # 啟用零拷貝tcp_nopush on; # 優化包傳輸server {location /largefile {# 直接內核空間到網卡傳輸sendfile_max_chunk 1m; # 分塊傳輸}}
}
八、關鍵性能公式
-
并發連接計算:
最大并發 = worker_processes × worker_connections
-
文件描述符限制:
# 系統級限制檢查 cat /proc/sys/fs/file-max# 進程級限制設置 worker_rlimit_nofile 65535;
-
Keepalive優化:
http {keepalive_timeout 65 60; # 服務器超時65s,客戶端60skeepalive_requests 1000; # 單連接最大請求數 }
二:Nginx架構和安裝
2.1 Nginx概述
-
Nginx介紹
- Nginx(engine X)由俄羅斯開發者Igor Sysoev于2002年創建,分為社區版和商業版(Nginx Plus)。
- 2019年被F5 Networks以6.7億美元收購。
- 核心功能:高性能HTTP/HTTPS反向代理服務器、郵件代理服務器、TCP/UDP代理服務器,解決C10K問題(單機10萬并發連接)。
- 官網:http://nginx.org
-
二次發行版
- Tengine:淘寶基于Nginx開發的增強版,支持大流量場景(如淘寶、天貓)。
- 官網:http://tengine.taobao.org
- OpenResty:集成Lua腳本的高性能Web平臺(章亦春團隊開發)。
- 官網:http://openresty.org/cn
- Tengine:淘寶基于Nginx開發的增強版,支持大流量場景(如淘寶、天貓)。
-
功能介紹
- 靜態資源服務器(HTML/圖片/JS/CSS)。
- HTTP/HTTPS反向代理。
- 動態資源代理(FastCGI/uWSGI/SCGI)。
- TCP/UDP請求轉發。
- IMAP4/POP3郵件代理。
-
基礎特性
- 模塊化設計,高擴展性。
- 高可靠性,支持熱部署(不停機更新配置/版本)。
- 低內存消耗:1萬keep-alive連接僅需2.5MB內存。
- 事件驅動模型(epoll)、異步I/O、零拷貝(sendfile)。
-
Web服務功能
- 虛擬主機(
server
塊)。 - 支持keep-alive和管道連接復用。
- 訪問日志定制、URL重寫、路徑別名。
- IP/用戶訪問控制、速率/并發限制。
- 虛擬主機(
2.2 Nginx架構和進程
-
進程結構
- Master進程:
- 管理Worker進程,加載配置、綁定端口、平滑升級。
- 接收外部信號(如
reload
/stop
),監控Worker狀態(異常時自動重啟)。
- Worker進程:
- 實際處理請求(平等、獨立),數量建議等于CPU核心數。
- 功能:接收請求、I/O調用、緩存查詢、響應結果。
- Master進程:
-
進程間通信
- Master與Worker:通過單向管道傳遞指令(如進程ID、文件描述符)。
- Worker之間:依賴Master中轉信息,或通過共享內存(如
upstream zone
)通信。
-
HTTP連接建立
- Master初始化監聽Socket → fork多個Worker → Worker競爭接受新連接(避免驚群)。
- 與傳統多進程/多線程模型對比:
- 傳統:每連接獨占線程,資源消耗大。
- Nginx:單線程處理多連接(事件驅動),高效復用資源。
-
HTTP處理流程
1. 接收請求 → 解析請求行/頭 → 匹配Server塊 2. URL重寫 → IP訪問控制 → 生成響應 3. 內容處理 → 日志記錄 → 返回數據
2.3 Nginx模塊介紹
- 核心模塊:進程管理、錯誤日志、配置文件解析(
ngx_core_module
)。 - 標準HTTP模塊:端口配置、編碼設置、響應頭控制(
ngx_http_core_module
)。 - 可選HTTP模塊:SSL支持、壓縮、GeoIP解析(需編譯時啟用)。
- 郵件模塊:POP3/IMAP/SMTP協議支持(
ngx_mail_module
)。 - Stream模塊:TCP/UDP反向代理(
ngx_stream_module
)。 - 第三方模塊:JSON/Lua擴展(如OpenResty)。
模塊分類圖:
核心模塊 → HTTP模塊 → 郵件模塊 → Stream模塊 → 第三方模塊
2.4 Nginx安裝
-
版本選擇
- Mainline:開發版(奇數版本,如1.19)。
- Stable:穩定版(偶數版本,如1.20)。
- Legacy:舊穩定版(如1.18)。
-
編譯安裝步驟
# 1. 安裝依賴 dnf install gcc pcre-devel zlib-devel openssl-devel -y useradd -s /sbin/nologin -M nginx# 2. 解壓并編譯 tar zxf nginx-1.24.0.tar.gz cd nginx-1.24.0 ./configure \--prefix=/usr/local/nginx \--user=nginx --group=nginx \--with-http_ssl_module \ # 啟用HTTPS--with-http_v2_module \ # HTTP/2支持--with-http_realip_module \ # 客戶端真實IP透傳--with-stream \ # TCP/UDP代理--with-pcre # 正則支持# 3. 安裝 make && make install
-
目錄結構
conf/
:配置文件(核心:nginx.conf
)。html/
:默認Web資源(可更改路徑)。logs/
:日志(訪問日志/錯誤日志/PID文件)。sbin/
:可執行文件(nginx
命令)。
-
驗證與命令
# 查看版本 /usr/local/nginx/sbin/nginx -v# 測試配置 nginx -t# 啟停命令 nginx -s reload # 重載配置 nginx -s quit # 優雅停止
-
Systemd服務文件
[Unit] Description=The NGINX HTTP Server After=network.target[Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/bin/kill -s QUIT $MAINPID[Install] WantedBy=multi-user.target
systemctl daemon-reload systemctl start nginx
2.5 平滑升級與回滾
-
升級流程
-
操作示例
# 1. 備份舊二進制文件 cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old# 2. 編譯新版本(僅make不install) cd nginx-1.26.1 ./configure [參數同舊版] make# 3. 替換二進制文件 cp -f objs/nginx /usr/local/nginx/sbin/# 4. 觸發升級 kill -USR2 舊Master_PID # 啟動新Master kill -WINCH 舊Master_PID # 關閉舊Worker# 5. 驗證后清理舊Master kill -QUIT 舊Master_PID
-
回滾步驟
# 1. 恢復舊二進制文件 mv /usr/local/nginx/sbin/nginx.old /usr/local/nginx/sbin/nginx# 2. 重啟舊Worker kill -HUP 舊Master_PID# 3. 關閉新Master kill -WINCH 新Master_PID kill -QUIT 新Master_PID
關鍵點:
- 升級時新舊進程并存,舊進程處理存量請求。
- 回滾需確保舊配置兼容性。
Nginx 核心配置詳解
3.1 配置文件結構與說明
核心組成
- 主配置文件:
nginx.conf
- 子配置文件:通過
include conf.d/*.conf
加載 - MIME類型文件:
mime.types
(定義文件擴展名與類型的映射) - 其他協議配置:如
fastcgi_params
(FastCGI參數)
配置文件格式規則
- 指令以分號
;
結尾,指令與值間用空格分隔。 - 指令塊用
{}
組織,可嵌套(如http
、server
、location
)。 - 使用
#
添加注釋,$
引用變量。 - 支持正則表達式(如
location
匹配)。
主配置文件結構
# 全局配置段(main block)
user nginx nginx; # 運行用戶和組
worker_processes auto; # 工作進程數(推薦 = CPU核心數)
error_log /var/log/nginx/error.log; # 錯誤日志路徑
pid /run/nginx.pid; # PID文件路徑# 事件驅動配置(event block)
events {worker_connections 1024; # 單個工作進程最大并發連接數use epoll; # 事件驅動模型(Linux推薦epoll)
}# HTTP協議配置(http block)
http {include mime.types; # 導入MIME類型文件default_type application/octet-stream; # 默認MIME類型sendfile on; # 啟用零拷貝傳輸keepalive_timeout 65; # 長連接超時時間# 虛擬主機配置(server block)server {listen 80; # 監聽端口server_name example.com; # 域名root /var/www/html; # 網站根目錄# URL路徑匹配(location block)location / {index index.html; # 默認首頁}}# 可擴展配置:mail、stream等
}
3.2 全局配置詳解
關鍵指令
指令 | 作用 | 示例 |
---|---|---|
worker_processes | 工作進程數(推薦設為CPU核心數) | worker_processes 4; |
worker_cpu_affinity | 綁定進程到CPU核心(減少上下文切換) | worker_cpu_affinity 0001 0010; |
error_log | 錯誤日志路徑和級別 | error_log logs/error.log warn; |
worker_rlimit_nofile | 進程最大打開文件數 | worker_rlimit_nofile 65535; |
events.use | 事件驅動模型(Linux用epoll ) | use epoll; |
優化配置示例
user nginx nginx;
worker_processes auto;
worker_cpu_affinity auto;
error_log /var/log/nginx/error.log error;
pid /run/nginx.pid;
worker_rlimit_nofile 100000;events {worker_connections 65535;use epoll;multi_accept on; # 一次接受多個連接
}
3.3 HTTP塊核心配置
基礎指令
指令 | 作用 | 示例 |
---|---|---|
include | 導入其他配置文件 | include conf.d/*.conf; |
default_type | 默認MIME類型(未知文件類型) | default_type text/plain; |
sendfile | 啟用零拷貝傳輸(提升靜態文件性能) | sendfile on; |
keepalive_timeout | 長連接超時時間 | keepalive_timeout 30s; |
虛擬主機配置(Server Block)
server {listen 80; # 監聽端口server_name www.example.com; # 域名(支持通配符)root /data/web/html; # 網站根目錄access_log /var/log/nginx/access.log; # 訪問日志路徑# 錯誤頁面定制error_page 404 /404.html;error_page 500 502 503 504 /50x.html;
}
3.4 Location塊深度解析
匹配規則與優先級
符號 | 匹配規則 | 優先級 | 示例 |
---|---|---|---|
= | 精確匹配 | 最高 | location = /logo.png { ... } |
^~ | 前綴匹配(不檢查正則) | 高 | location ^~ /static/ { ... } |
~ | 正則匹配(區分大小寫) | 中 | location ~ \.php$ { ... } |
~* | 正則匹配(不區分大小寫) | 中 | `location ~* .(jpg |
無符號 | 通用前綴匹配 | 低 | location / { ... } |
root vs alias
root
:路徑 =root
+location
location /images/ {root /data/web; # 文件路徑:/data/web/images/logo.png }
alias
:路徑 =alias
替換location
location /static/ {alias /data/files/; # 訪問/static/1.txt → /data/files/1.txt }
3.5 高級配置實戰
1. 賬戶認證
location /admin {auth_basic "Admin Area"; # 認證提示文字auth_basic_user_file /etc/nginx/.htpasswd; # 密碼文件路徑
}
生成密碼文件:
htpasswd -c /etc/nginx/.htpasswd admin
2. 自定義錯誤頁面
error_page 404 /404.html;
location = /404.html {root /data/web/errors;internal; # 禁止直接訪問
}
3. 文件下載服務
location /download {autoindex on; # 啟用目錄列表autoindex_localtime on; # 顯示服務器本地時間limit_rate 1024k; # 限速 1MB/s
}
4. 長連接優化
http {keepalive_timeout 30s; # 長連接超時keepalive_requests 1000; # 單連接最大請求數
}
5. 防盜鏈配置
location ~* \.(jpg|png)$ {valid_referers none blocked *.example.com;if ($invalid_referer) {return 403; # 非法引用返回403}
}
3.6 配置調試技巧
- 語法檢查:
nginx -t
- 熱重載配置:
nginx -s reload
- 查看版本與編譯參數:
nginx -V
關鍵提示:
- 修改配置后務必用
nginx -t
測試語法。- 生產環境建議使用
include
拆分配置(如conf.d/*.conf
)。- 避免在
location
中使用if
進行復雜判斷(影響性能)。
nginx的高級配置
4.1 Nginx 狀態頁
- 功能:監控服務器全局狀態(非虛擬主機)。
- 依賴模塊:
ngx_http_stub_status_module
(編譯時需添加--with-http_stub_status_module
)。 - 配置示例:
location /nginx_status {stub_status; # 啟用狀態頁auth_basic "Auth Login"; # 基礎認證auth_basic_user_file /usr/local/nginx/conf/.htpasswd;allow 192.168.0.0/16; # 訪問控制allow 127.0.0.1;deny all; }
- 輸出指標解析:
Active connections
:當前活動連接數(含Reading
+Writing
+Waiting
)。accepts
:Nginx 啟動后接受的客戶端請求總數。handled
:已處理的請求數(通常等于accepts
)。requests
:客戶端發送的總請求數。Reading
:正在讀取請求頭的連接數(值高可能需優化性能)。Writing
:正在發送響應的連接數(反映并發壓力)。Waiting
:空閑連接數(開啟keep-alive
時有效)。
4.2 Nginx 壓縮功能
- 功能:減少傳輸體積,提升加載速度(消耗 CPU 資源)。
- 依賴模塊:
ngx_http_gzip_module
(默認內置)。 - 關鍵配置指令:
gzip on; # 啟用壓縮 gzip_comp_level 4; # 壓縮級別(1-9,建議4-5) gzip_min_length 1k; # 最小壓縮文件大小 gzip_types text/css application/xml text/javascript; # 壓縮文件類型 gzip_vary on; # 響應頭添加 `Vary: Accept-Encoding`
- 適用場景:文本文件(HTML/CSS/JS/XML),圖片視頻類文件效果有限。
4.3 Nginx 版本隱藏
- 安全優化:避免暴露版本信息被利用。
- 修改方法:
- 編輯 Nginx 源碼文件
src/core/nginx.h
:#define NGINX_VERSION "1.0" // 自定義版本號 #define NGINX_VER "HAHA/" NGINX_VERSION // 自定義服務器標識
- 重新編譯安裝 Nginx。
- 編輯 Nginx 源碼文件
4.4 Nginx 變量使用
- 內置變量:直接調用
$remote_addr
:客戶端 IP$request_uri
:原始請求 URI(含參數)$scheme
:請求協議(HTTP/HTTPS)
- 自定義變量:
location /test {set $name "timinglee"; # 定義變量echo $name; # 輸出變量值 }
五、Nginx Rewrite 相關功能
5.1 ngx_http_rewrite_module 模塊指令
-
if
指令- 作用:條件匹配,根據結果執行不同配置。
- 語法:
if (條件) { ... }
- 匹配規則:
=
/!=
:字符串相等/不等~
/~*
:正則匹配(區分/不區分大小寫)!-e
/!-f
:文件或目錄不存在
- 示例:
location /test {if (!-e $request_filename) {return 404 "File not found";} }
-
set
指令- 作用:定義變量。
- 示例:
set $name "timinglee"; echo $name; # 輸出 "timinglee"
-
break
指令- 作用:終止當前作用域內后續的
rewrite
指令。 - 示例:
location /break {set $name lee;break; # 后續 set 指令不執行set $port 80; # 被跳過 }
- 作用:終止當前作用域內后續的
-
return
指令- 作用:直接返回響應碼或重定向。
- 示例:
location /return {return 301 https://$host$request_uri; # 永久重定向到 HTTPS }
5.2 rewrite 指令
- 語法:
rewrite regex replacement [flag];
- 常用 Flags:
Flag 作用 適用場景 last
重寫后重新匹配 location 多次重寫 break
終止當前重寫,繼續非 rewrite
指令單次重寫 redirect
臨時重定向(302) 測試環境 permanent
永久重定向(301) 生產環境域名變更
實戰案例
-
HTTPS 自動跳轉:
server {listen 80;if ($scheme = http) {rewrite ^ https://$host$request_uri permanent; } }
-
舊域名重定向:
rewrite ^/old-url(.*)$ http://new.timinglee.org$1 permanent;
-
動靜分離資源重寫:
location ~* \.(jpg|css)$ {rewrite ^/static/(.*) /resources/$1 break; # 重寫靜態資源路徑 }
六、高級功能
6.1 防盜鏈配置
- 原理:校驗
Referer
頭,阻止非授權站點資源盜用。 - 配置示例:
location ~* \.(jpg|png)$ {valid_referers none blocked *.timinglee.org;if ($invalid_referer) {return 403 "Access Forbidden";} }
6.2 緩存加速
-
Proxy Cache 配置:
proxy_cache_path /data/cache levels=1:2 keys_zone=mycache:10m max_size=10g; server {location / {proxy_cache mycache;proxy_cache_valid 200 302 10m; # 緩存200/302響應10分鐘proxy_pass http://backend;} }
-
效果對比:
- 未啟用緩存:請求處理耗時 0.514s
- 啟用 Memcached:耗時降至 0.452s
- 啟用
srcache
+ Memcached:進一步降至 0.255s
七、Nginx 二次開發版本
7.1 OpenResty
- 核心價值:通過 Lua 腳本擴展 Nginx,實現動態邏輯(如 API 網關、自定義認證)。
- 安裝步驟:
./configure --prefix=/apps/openresty --with-http_ssl_module make && make install
- 基礎示例(Lua 輸出):
location /hello {content_by_lua_block {ngx.say("Hello, OpenResty!")} }