Nginx概念、架構(gòu)、配置與虛擬主機實戰(zhàn)操作指南
Nginx 深度解析:概念、架構(gòu)、配置與虛擬主機實戰(zhàn)
一、Nginx 的概念
Nginx(發(fā)音 “engine x”)是由俄羅斯開發(fā)者 Igor Sysoev 設(shè)計的高性能 HTTP 服務(wù)器、反向代理服務(wù)器、負載均衡器和 IMAP/POP3/SMTP 代理服務(wù)器。其核心設(shè)計理念是 “事件驅(qū)動、異步非阻塞 I/O 模型”,旨在以極低的資源消耗支撐超高并發(fā)連接,同時提供豐富的擴展功能。
從本質(zhì)上講,Nginx 是一個 “請求分發(fā)與處理中樞”:
- 作為 Web 服務(wù)器:直接處理靜態(tài)資源(HTML、CSS、JS、圖片等)的請求,無需依賴后端應(yīng)用;
- 作為反向代理:接收客戶端請求后,轉(zhuǎn)發(fā)到后端業(yè)務(wù)服務(wù)器(Tomcat、Node.js 等),并將響應(yīng)結(jié)果返回給客戶端,隱藏后端服務(wù)細節(jié);
- 作為負載均衡器:將海量客戶端請求均勻分發(fā)到多臺后端服務(wù)器,提升系統(tǒng)并發(fā)能力和可用性;
- 其他角色:支持 SSL 終結(jié)、URL 重寫、緩存、限流等附加功能,適配復(fù)雜業(yè)務(wù)場景。
Nginx 廣泛應(yīng)用于互聯(lián)網(wǎng)架構(gòu)的 “接入層”,是目前全球使用最廣泛的 Web 服務(wù)器之一(據(jù) W3Techs 統(tǒng)計,全球 Top 1000 網(wǎng)站中約 60% 采用 Nginx)。
二、Nginx 的特點
Nginx 之所以成為行業(yè)主流,核心源于以下六大特點,且每個特點都與底層設(shè)計深度綁定:
- 高并發(fā)支持:基于事件驅(qū)動(epoll/kqueue)和異步非阻塞 I/O 模型,單臺服務(wù)器可輕松支撐 10 萬 + 并發(fā)連接(遠高于 Apache 的進程 / 線程模型)。其核心邏輯是 “一個工作進程處理多個連接”,避免了進程 / 線程切換的巨大開銷;
- 資源占用極低:空閑狀態(tài)下內(nèi)存占用僅幾 MB,運行時 CPU 使用率遠低于同類服務(wù)器。例如,4 核 8G 服務(wù)器部署 Nginx 后,僅占用 10-20MB 內(nèi)存,可將大部分資源留給業(yè)務(wù)服務(wù);
- 功能全面且靈活:集靜態(tài)資源服務(wù)、反向代理、負載均衡、SSL 配置、URL 重寫、緩存、限流等功能于一體,支持第三方模塊擴展(如 Lua 腳本、圖片處理模塊);
- 穩(wěn)定性極強:核心代碼簡潔(約 10 萬行),故障率極低,支持 “熱部署”(
nginx -s reload)—— 無需重啟服務(wù)即可重載配置,保障業(yè)務(wù)不中斷; - 跨平臺兼容:可運行在 Linux、Windows、FreeBSD、Solaris 等多種操作系統(tǒng),主流 Linux 發(fā)行版(CentOS、Ubuntu)默認提供安裝源;
- 配置簡單易維護:配置文件采用文本格式,結(jié)構(gòu)清晰(塊級層級),支持主配置 + 子配置拆分,便于批量管理和自動化部署。
三、Nginx 的進程結(jié)構(gòu)(詳細解析)
Nginx 啟動后,會生成多進程架構(gòu),核心由 “主進程(Master Process)” 和 “工作進程(Worker Process)” 組成,部分場景會包含 “輔助進程”(緩存加載進程、日志輪轉(zhuǎn)進程等)。這種架構(gòu)設(shè)計是 Nginx 高并發(fā)、高穩(wěn)定的核心保障,以下分進程詳解:
3.1 進程結(jié)構(gòu)總覽
plaintext
# 啟動 Nginx 后,通過 ps 命令查看進程(以 4 核服務(wù)器為例) ps -ef | grep nginx root 1234 1 0 10:00 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx nginx 1235 1234 0 10:00 ? 00:00:02 nginx: worker process nginx 1236 1234 0 10:00 ? 00:00:02 nginx: worker process nginx 1237 1234 0 10:00 ? 00:00:02 nginx: worker process nginx 1238 1234 0 10:00 ? 00:00:02 nginx: worker process
- 1 個主進程(root 用戶運行,權(quán)限高,負責管理);
- 4 個工作進程(nginx 普通用戶運行,權(quán)限低,負責處理請求);
- (可選)緩存加載進程(
cache loader process):啟動時加載磁盤緩存到內(nèi)存,完成后自動退出; - (可選)緩存管理進程(
cache manager process):定期清理過期緩存,維持緩存大小在配置閾值內(nèi)。
3.2 主進程(Master Process)——“管理者”
核心作用:
- 讀取并驗證配置文件:啟動時加載
nginx.conf,檢查語法正確性;支持熱重載(nginx -s reload),重新讀取配置并生效,無需中斷服務(wù); - 創(chuàng)建并管理工作進程:根據(jù)
worker_processes配置(默認與 CPU 核心數(shù)一致),通過fork()系統(tǒng)調(diào)用創(chuàng)建工作進程;監(jiān)控工作進程狀態(tài),若工作進程異常退出,立即自動創(chuàng)建新的工作進程,保障服務(wù)可用性; - 接收并處理信號:響應(yīng)管理員發(fā)送的信號(如啟動、停止、重載、日志切割),例如:
kill -HUP 主進程PID:重載配置;kill -TERM 主進程PID:優(yōu)雅停止服務(wù)(處理完當前請求后退出);
- 管理輔助進程:按需啟動緩存加載 / 管理進程、日志輪轉(zhuǎn)進程等。
運行權(quán)限:
主進程必須以 root 用戶運行,原因是:
- Nginx 需監(jiān)聽 80(HTTP)、443(HTTPS)等特權(quán)端口(Linux 中,非 root 用戶無法綁定 1024 以下端口);
- 主進程需要創(chuàng)建 / 管理工作進程,且工作進程通常以低權(quán)限用戶(如 nginx)運行,避免因工作進程被攻擊導(dǎo)致系統(tǒng)權(quán)限泄露。
3.3 工作進程(Worker Process)——“執(zhí)行者”
核心作用:
處理客戶端的 HTTP 請求,是 Nginx 并發(fā)能力的核心載體,其工作流程如下:
- 競爭接收連接:所有工作進程通過 “共享監(jiān)聽套接字”(主進程創(chuàng)建監(jiān)聽端口后,工作進程繼承該套接字),采用 “驚群效應(yīng)優(yōu)化”(Nginx 1.11+ 已解決)競爭接收客戶端連接;
- 異步非阻塞處理請求:每個工作進程通過 epoll/kqueue 事件模型,同時處理成千上萬個連接(由
worker_connections配置限制),無需為每個連接創(chuàng)建線程 / 進程,資源消耗極低; - 請求處理流程:
- 接收客戶端請求數(shù)據(jù);
- 解析 HTTP 協(xié)議(請求行、請求頭、請求體);
- 匹配
server塊(通過監(jiān)聽端口 +server_name); - 匹配
location塊(通過請求路徑); - 執(zhí)行處理邏輯(返回靜態(tài)資源、反向代理到后端服務(wù)、負載均衡分發(fā)等);
- 構(gòu)建 HTTP 響應(yīng),發(fā)送給客戶端;
- 無狀態(tài)設(shè)計:工作進程之間完全獨立,無共享內(nèi)存,每個工作進程處理的請求互不影響,避免了進程間通信的開銷,也提升了穩(wěn)定性(單個工作進程故障不影響其他進程)。
關(guān)鍵配置與并發(fā)能力:
工作進程的并發(fā)能力由兩個核心配置決定:
worker_processes:工作進程數(shù),推薦設(shè)置為 CPU 核心數(shù)(如 4 核服務(wù)器設(shè)為 4),避免進程切換開銷,充分利用多核 CPU;worker_connections:每個工作進程的最大連接數(shù)(默認 1024),表示單個工作進程可同時處理的客戶端連接數(shù)。
最大并發(fā)連接數(shù)計算公式:最大并發(fā)數(shù) = worker_processes × worker_connections ÷ 2(除以 2 是因為每個 HTTP 連接包含 “客戶端→Nginx” 和 “Nginx→后端服務(wù)” 兩個連接,若僅處理靜態(tài)資源,可無需除以 2)
例如:worker_processes=4,worker_connections=1024,則最大并發(fā)連接數(shù)約為 2048。
運行權(quán)限:
工作進程以低權(quán)限用戶(如 nginx)運行,由主進程在創(chuàng)建時通過 setuid()/setgid() 系統(tǒng)調(diào)用切換用戶,目的是:
- 降低安全風險:若工作進程被惡意攻擊,攻擊者僅能獲取 nginx 用戶權(quán)限,無法操作系統(tǒng)核心資源;
- 限制文件訪問:工作進程僅能訪問 nginx 用戶有權(quán)限的文件(如網(wǎng)站根目錄、日志文件),避免誤操作系統(tǒng)文件。
3.4 進程間通信機制
Nginx 進程間通信主要依賴以下方式:
- 共享內(nèi)存:用于共享配置信息(如
upstream后端服務(wù)器狀態(tài)、緩存元數(shù)據(jù)),避免每個進程重復(fù)加載配置,提升效率; - 信號:主進程通過信號(如
SIGCHLD)監(jiān)控工作進程狀態(tài),工作進程異常退出時,主進程收到信號后創(chuàng)建新的工作進程; - 文件鎖:用于日志寫入、緩存操作等場景,避免多個工作進程同時寫入同一文件導(dǎo)致數(shù)據(jù)錯亂。
四、Nginx 的配置(詳細解析 + 流量流程)
Nginx 的核心配置文件為 /usr/local/nginx/conf/nginx.conf(源碼安裝路徑),采用塊級層級結(jié)構(gòu),從外到內(nèi)依次為:全局塊 → I/O事件塊 → HTTP塊 → Server塊 → Location塊。
配置文件整體結(jié)構(gòu)模板
nginx
# 一、全局配置(全局塊)
worker_processes 4; # 工作進程數(shù),與CPU核心數(shù)一致
error_log logs/error.log warn; # 錯誤日志路徑+日志級別
pid logs/nginx.pid; # PID文件路徑
worker_rlimit_nofile 65535; # 每個工作進程的最大文件描述符限制
# 二、I/O事件配置(events塊)
events {
use epoll; # 使用epoll事件模型(Linux推薦)
worker_connections 10240; # 每個工作進程最大連接數(shù)
multi_accept on; # 允許工作進程一次性接收多個連接
accept_mutex on; # 開啟連接接收互斥鎖,解決驚群效應(yīng)
}
# 三、HTTP配置(http塊)
http {
include mime.types; # 引入MIME類型映射文件
default_type application/octet-stream; # 默認MIME類型(未知文件類型)
# 日志格式定義(main為格式名,可在server/location塊引用)
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; # 訪問日志路徑+使用main格式
# 核心性能優(yōu)化配置
sendfile on; # 啟用高效文件傳輸模式(零拷貝)
tcp_nopush on; # 配合sendfile,減少TCP數(shù)據(jù)包數(shù)量
tcp_nodelay on; # 禁用TCP延遲,提升實時性(適用于短連接)
keepalive_timeout 65; # 長連接超時時間(秒)
keepalive_requests 100; # 每個長連接最多處理100個請求
# 開啟gzip壓縮
gzip on;
gzip_min_length 1k; # 小于1k的文件不壓縮
gzip_types text/plain text/css application/json application/javascript; # 壓縮的文件類型
# 負載均衡集群配置(可選)
upstream backend_servers {
server 192.168.1.101:8080 weight=1; # 后端服務(wù)器1,權(quán)重1
server 192.168.1.102:8080 weight=2; # 后端服務(wù)器2,權(quán)重2(接收更多請求)
}
# 四、Web服務(wù)的監(jiān)聽配置(server塊,虛擬主機核心)
server {
listen 80; # 監(jiān)聽80端口(HTTP默認端口)
listen 192.168.1.100:80; # 綁定特定IP+端口(多IP服務(wù)器時使用)
server_name www.test.com test.com; # 綁定域名(多個域名用空格分隔)
charset utf-8; # 網(wǎng)頁字符編碼
access_log logs/www.test.com.access.log main; # 該虛擬主機的訪問日志
# 五、其他配置(location塊,路徑匹配核心)
# 匹配根路徑(/)
location / {
root /usr/local/nginx/html; # 網(wǎng)站根目錄(靜態(tài)資源存放路徑)
index index.html index.htm; # 默認首頁文件(優(yōu)先級:index.html > index.htm)
try_files $uri $uri/ /index.html; # 嘗試訪問文件→目錄→跳轉(zhuǎn)index.html(SPA應(yīng)用常用)
}
# 匹配靜態(tài)資源路徑(圖片、CSS、JS)
location ~* \.(jpg|jpeg|png|gif|css|js)$ {
root /usr/local/nginx/static; # 靜態(tài)資源獨立存放目錄
expires 7d; # 瀏覽器緩存7天,減少重復(fù)請求
add_header Cache-Control "public"; # 允許緩存
}
# 反向代理配置(匹配/api路徑的請求)
location /api/ {
proxy_pass http://backend_servers; # 轉(zhuǎn)發(fā)到負載均衡集群
proxy_set_header Host $host; # 傳遞客戶端請求的Host頭
proxy_set_header X-Real-IP $remote_addr; # 傳遞客戶端真實IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 傳遞代理鏈IP
proxy_connect_timeout 60; # 代理連接超時時間
}
# 錯誤頁面配置
error_page 404 /404.html; # 404錯誤跳轉(zhuǎn)至404.html
error_page 500 502 503 504 /50x.html; # 5xx錯誤跳轉(zhuǎn)至50x.html
location = /50x.html {
root html; # 錯誤頁面存放目錄
}
}
}4.1 全局配置(全局塊)
核心指令解析
| 指令 | 作用 | 配置建議 |
|---|---|---|
worker_processes | 定義工作進程數(shù),直接影響并發(fā)能力 | 設(shè)為 CPU 核心數(shù)(grep -c "processor" /proc/cpuinfo 查看),如 4 核設(shè)為 4 |
error_log | 定義錯誤日志的路徑和日志級別(debug/info/notice/warn/error/crit) | 生產(chǎn)環(huán)境設(shè)為 warn 或 error,避免日志過大;路徑建議放在 /var/log/nginx/ |
pid | 定義 Nginx 主進程 PID 文件的存放路徑 | 默認在 logs/nginx.pid,無需修改,便于管理進程 |
worker_rlimit_nofile | 限制每個工作進程的最大文件描述符數(shù)(Linux 中,連接、文件都屬于文件描述符) | 設(shè)為 65535(與系統(tǒng)最大文件描述符一致,需先修改系統(tǒng)配置:echo "* soft nofile 65535" >> /etc/security/limits.conf) |
worker_cpu_affinity | 綁定工作進程到指定 CPU 核心,避免進程切換開銷 | 4 核服務(wù)器配置:worker_cpu_affinity 0001 0010 0100 1000(每個進程綁定一個核心) |
流量流程中的作用:
全局配置是 Nginx 啟動時加載的 “基礎(chǔ)配置”,對所有工作進程和服務(wù)全局生效,不直接參與請求的路由,但決定了 Nginx 的整體性能上限(如并發(fā)連接數(shù)、進程資源限制)。
4.2 I/O 事件配置(events 塊)
核心指令解析
| 指令 | 作用 | 配置建議 |
|---|---|---|
use | 指定 I/O 事件模型(epoll/kqueue/poll/select) | Linux 系統(tǒng)優(yōu)先選 epoll(高效處理海量并發(fā)連接);FreeBSD 選 kqueue;Windows 選 select |
worker_connections | 每個工作進程的最大連接數(shù)(包括客戶端連接、后端代理連接) | 1G 內(nèi)存服務(wù)器設(shè)為 10240,2G 設(shè)為 20480,需與 worker_processes 配合調(diào)整最大并發(fā)數(shù) |
multi_accept | 允許工作進程一次性接收多個新連接(默認 off) | 開啟(on),提升連接接收效率,尤其高并發(fā)場景 |
accept_mutex | 開啟連接接收互斥鎖(默認 on),解決 “驚群效應(yīng)”(多個工作進程同時競爭一個連接,導(dǎo)致資源浪費) | 保持開啟,避免驚群效應(yīng)導(dǎo)致的性能損耗 |
worker_aio_requests | 每個工作進程的異步 I/O 請求數(shù)(適用于大文件傳輸) | 設(shè)為 1024,提升大文件(如視頻、安裝包)的傳輸效率 |
流量流程中的作用:
I/O 事件配置決定了工作進程 “如何接收和處理網(wǎng)絡(luò)連接”,是 Nginx 高并發(fā)的核心保障。當客戶端發(fā)起連接時,工作進程通過配置的事件模型(如 epoll)監(jiān)聽連接事件,高效接收并處理連接,避免阻塞。
4.3 HTTP 配置(http 塊)
HTTP 塊是 Nginx 處理 HTTP/HTTPS 請求的 “核心全局配置”,包含所有與 HTTP 協(xié)議相關(guān)的配置,且可嵌套多個 server 塊(虛擬主機)。
核心指令解析
| 指令 | 作用 | 配置建議 |
|---|---|---|
include mime.types | 引入 MIME 類型映射文件(定義文件擴展名與 Content-Type 的對應(yīng)關(guān)系,如 .html → text/html) | 必須配置,否則 Nginx 無法正確返回文件的 Content-Type 頭,導(dǎo)致瀏覽器無法識別文件 |
default_type | 未匹配到 MIME 類型時的默認類型 | 默認為 application/octet-stream(瀏覽器會下載文件),無需修改 |
log_format | 定義訪問日志的格式(可自定義字段,如 IP、時間、請求路徑、狀態(tài)碼) | 生產(chǎn)環(huán)境保留 main 格式,便于日志分析(如統(tǒng)計訪問 IP、錯誤請求) |
access_log | 定義訪問日志的路徑和使用的格式 | 每個虛擬主機可單獨配置,便于區(qū)分不同網(wǎng)站的日志 |
sendfile | 開啟 “零拷貝” 文件傳輸模式(Nginx 直接將文件數(shù)據(jù)從磁盤寫入網(wǎng)絡(luò)套接字,無需經(jīng)過用戶態(tài)緩沖區(qū)) | 開啟(on),大幅提升靜態(tài)資源傳輸效率,減少 CPU 占用 |
tcp_nopush | 配合 sendfile 使用,將多個小數(shù)據(jù)包合并為一個數(shù)據(jù)包發(fā)送,減少 TCP 握手次數(shù) | 開啟(on),提升網(wǎng)絡(luò)傳輸效率 |
tcp_nodelay | 禁用 TCP 延遲(Nagle 算法),立即發(fā)送小數(shù)據(jù)包,提升實時性 | 短連接(如 API 接口)開啟(on),長連接(如文件下載)關(guān)閉(off) |
keepalive_timeout | 長連接(HTTP/1.1)的超時時間,客戶端在超時前可復(fù)用連接發(fā)送多個請求 | 設(shè)為 60 秒,減少連接建立 / 關(guān)閉的開銷,提升并發(fā)能力 |
gzip | 開啟 gzip 壓縮,減少文本類文件(HTML、CSS、JS、JSON)的傳輸體積 | 開啟(on),配合 gzip_types 配置需要壓縮的文件類型 |
upstream | 定義負載均衡集群(后端業(yè)務(wù)服務(wù)器組),用于反向代理時的請求分發(fā) | 后端多服務(wù)器部署時配置,支持輪詢、權(quán)重、IP 哈希等負載策略 |
流量流程中的作用:
客戶端請求到達 Nginx 后,首先進入 HTTP 塊進行 “全局預(yù)處理”:
- 解析 HTTP 協(xié)議,識別請求行(方法、路徑、協(xié)議版本)、請求頭;
- 應(yīng)用 gzip 壓縮配置(若請求頭支持壓縮);
- 記錄訪問日志(按
log_format格式); - 根據(jù)請求的 “監(jiān)聽端口” 和 “Host 頭”,匹配對應(yīng)的
server塊,進入虛擬主機處理流程。
4.4 Web 服務(wù)的監(jiān)聽配置(server 塊)
server 塊是 “虛擬主機” 的核心配置,每個 server 塊對應(yīng)一個獨立的 Web 服務(wù)(可理解為一個網(wǎng)站),通過 listen(監(jiān)聽端口)和 server_name(綁定域名 / IP)區(qū)分不同的虛擬主機。
核心指令解析
| 指令 | 作用 | 配置示例 |
|---|---|---|
listen | 定義虛擬主機的監(jiān)聽端口 / IP + 端口,支持多端口監(jiān)聽 | - 監(jiān)聽所有 IP 的 80 端口:listen 80;- 監(jiān)聽特定 IP 的 80 端口:listen 192.168.1.100:80;- 監(jiān)聽 HTTPS 端口:listen 443 ssl; |
server_name | 定義虛擬主機綁定的域名 / IP,支持精確匹配、泛域名匹配、正則匹配 | - 精確匹配:server_name www.test.com test.com;- 泛域名匹配:server_name *.test.com;(匹配所有子域名)- 正則匹配:server_name ~^www\.(.*)\.com$;(匹配 www.xxx.com 格式域名) |
charset | 定義網(wǎng)頁的字符編碼(如 UTF-8、GBK) | 設(shè)為 utf-8,避免中文亂碼 |
access_log | 定義該虛擬主機的獨立訪問日志 | 路徑建議包含域名,如 logs/www.test.com.access.log,便于日志拆分和分析 |
流量路由邏輯(關(guān)鍵):
Nginx 如何通過 listen 和 server_name 匹配虛擬主機?
- 第一步:匹配
listen端口 —— 客戶端請求的端口必須與server塊的listen配置一致,否則直接拒絕; - 第二步:匹配
server_name—— 根據(jù)客戶端請求頭中的Host字段(如Host: www.test.com),按以下優(yōu)先級匹配:- 精確匹配(如
www.test.com); - 左泛域名匹配(如
*.test.com); - 右泛域名匹配(如
www.*); - 正則匹配(如
~^www\..*\.com$); - 默認匹配(第一個
listen端口一致的server塊,或server_name _;的塊)。
- 精確匹配(如
流量流程中的作用:
經(jīng)過 HTTP 塊預(yù)處理后,請求根據(jù) “端口 + Host” 匹配到對應(yīng)的 server 塊,進入該虛擬主機的專屬處理流程,后續(xù)的 location 塊匹配、請求處理都基于該 server 塊的配置。
4.5 其他配置(location 塊)
location 塊是 server 塊的子配置,用于 “按請求路徑匹配處理邏輯”,是 Nginx 路由配置的核心。一個 server 塊可包含多個 location 塊,按匹配優(yōu)先級執(zhí)行。
核心指令解析
| 指令 | 作用 | 配置示例 | |
|---|---|---|---|
location 匹配規(guī)則 | 定義請求路徑的匹配規(guī)則,支持多種匹配模式(見下文) | - 前綴匹配:location /api/ { ... }- 精確匹配:location = /index.html { ... }- 正則匹配:`location ~* .(jpg | png)$ { ... }` |
root | 定義靜態(tài)資源的根目錄,請求路徑會拼接在 root 后,形成文件的絕對路徑 | location /static/ { root /usr/local/nginx/; } → 訪問 /static/img.jpg 時,實際路徑為 /usr/local/nginx/static/img.jpg | |
alias | 定義路徑別名,直接替換請求路徑,與 root 不同(alias 不拼接路徑) | location /static/ { alias /usr/local/nginx/static/; } → 效果同上,但更靈活(可自定義別名路徑) | |
index | 定義默認首頁文件,當請求路徑為目錄時,自動查找該文件 | index index.html index.htm index.php; | |
try_files | 按順序嘗試訪問文件 / 目錄,若前面的路徑不存在,執(zhí)行最后一個動作(如跳轉(zhuǎn)、返回 404) | try_files $uri $uri/ /index.html; → 嘗試訪問文件→目錄→跳轉(zhuǎn)至 index.html(SPA 應(yīng)用路由配置) | |
proxy_pass | 反向代理指令,將請求轉(zhuǎn)發(fā)到后端服務(wù)(如 Tomcat、負載均衡集群) | proxy_pass http://backend_servers;(轉(zhuǎn)發(fā)到 upstream 集群)或 proxy_pass http://127.0.0.1:8080;(轉(zhuǎn)發(fā)到本地服務(wù)) | |
expires | 配置瀏覽器緩存時間,適用于靜態(tài)資源(圖片、CSS、JS) | expires 7d;(緩存 7 天),減少重復(fù)請求,提升訪問速度 | |
error_page | 配置錯誤頁面跳轉(zhuǎn),當請求返回指定狀態(tài)碼時,跳轉(zhuǎn)至對應(yīng)的頁面或路徑 | error_page 404 /404.html;(404 錯誤跳轉(zhuǎn)至 404.html) |
location 匹配模式與優(yōu)先級(關(guān)鍵)
| 匹配模式 | 語法 | 優(yōu)先級 | 說明 | |
|---|---|---|---|---|
| 精確匹配 | location = /path { ... } | 1(最高) | 完全匹配請求路徑,不包含子路徑,例如 = /index.html 僅匹配 /index.html,不匹配 /index.html?a=1 | |
| 前綴匹配(^~) | location ^~ /path { ... } | 2 | 以 /path 開頭的路徑,匹配成功后不再檢查其他模式 | |
| 正則匹配(~ 區(qū)分大小寫,~* 不區(qū)分大小寫) | `location ~* .(jpg | png)$ { ... }` | 3 | 按正則表達式匹配路徑,優(yōu)先級低于精確匹配和 ^~ 前綴匹配 |
| 普通前綴匹配 | location /path { ... } | 4(最低) | 以 /path 開頭的路徑,匹配成功后仍會檢查更高優(yōu)先級的模式 |
流量流程中的作用:
請求匹配到 server 塊后,進入 location 塊匹配流程:
- 按優(yōu)先級順序匹配所有
location塊的規(guī)則; - 匹配成功后,執(zhí)行該
location塊的處理邏輯:- 若為靜態(tài)資源請求(如圖片、HTML):通過
root/alias找到文件,返回給客戶端(開啟 gzip 壓縮、緩存等); - 若為動態(tài)請求(如
/api):通過proxy_pass轉(zhuǎn)發(fā)到后端服務(wù),接收后端響應(yīng)后返回給客戶端;
- 若為靜態(tài)資源請求(如圖片、HTML):通過
- 若未匹配到任何
location塊,執(zhí)行server塊的默認邏輯(如返回 404)。
五、Nginx 虛擬主機
虛擬主機(Virtual Host)是指在一臺服務(wù)器上通過 Nginx 配置,同時運行多個獨立的 Web 服務(wù)(多個網(wǎng)站),共享服務(wù)器的 IP 和端口資源,通過 server_name、IP、端口區(qū)分不同服務(wù)。
5.1 訪問狀態(tài)統(tǒng)計配置
Nginx 提供 ngx_http_stub_status_module 模塊,用于統(tǒng)計 Nginx 的連接狀態(tài)(如活躍連接數(shù)、請求數(shù)),需在編譯時啟用(--with-http_stub_status_module)。
配置步驟:
- 編輯
nginx.conf的server塊,添加location塊:
nginx
server {
listen 80;
server_name www.test.com;
# 訪問狀態(tài)統(tǒng)計配置
location /nginx_status {
stub_status on; # 開啟狀態(tài)統(tǒng)計
allow 192.168.1.0/24; # 允許訪問的IP網(wǎng)段(內(nèi)網(wǎng))
deny all; # 拒絕其他所有IP訪問,保障安全
}
}- 驗證配置并重載 Nginx:
nginx -t # 檢查配置語法 nginx -s reload # 重載配置
- 訪問測試:在允許的 IP 網(wǎng)段內(nèi),通過瀏覽器或 curl 訪問
http://www.test.com/nginx_status,輸出結(jié)果如下:
plaintext
Active connections: 2 # 當前活躍連接數(shù)(包含等待連接) server accepts handled requests 100 100 200 # 累計接收連接數(shù)、累計處理連接數(shù)、累計請求數(shù) Reading: 0 Writing: 1 Waiting: 1 # 正在讀取請求頭的連接數(shù)、正在寫入響應(yīng)的連接數(shù)、等待請求的連接數(shù)(長連接)
5.2 基于授權(quán)的訪問控制(HTTP 基本認證)
通過用戶名 / 密碼驗證客戶端身份,僅授權(quán)用戶可訪問網(wǎng)站,適用于后臺管理系統(tǒng)、內(nèi)部服務(wù)等場景。
配置步驟:
- 安裝
htpasswd工具(用于生成密碼文件):
yum install -y httpd-tools # CentOS/RHEL apt install -y apache2-utils # Ubuntu/Debian
- 生成密碼文件(用戶名:admin,密碼:123456):
htpasswd -c /usr/local/nginx/conf/.htpasswd admin # 輸入密碼(123456),生成密碼文件 .htpasswd(隱藏文件,避免泄露)
- 編輯 Nginx 配置,添加授權(quán)控制:
server {
listen 80;
server_name admin.test.com;
location / {
root /usr/local/nginx/admin; # 后臺管理系統(tǒng)根目錄
index index.html;
auth_basic "請輸入用戶名密碼"; # 認證提示信息
auth_basic_user_file /usr/local/nginx/conf/.htpasswd; # 密碼文件路徑
}
}- 驗證配置并重載 Nginx:
nginx -t && nginx -s reload
- 訪問測試:訪問
http://admin.test.com,瀏覽器會彈出登錄框,輸入正確的用戶名(admin)和密碼(123456)才能訪問,錯誤則返回 401 Unauthorized。
5.3 基于客戶端的訪問控制(IP 黑白名單)
通過限制客戶端的 IP 地址,允許或拒絕特定 IP / 網(wǎng)段訪問,適用于防止惡意攻擊、僅允許內(nèi)網(wǎng)訪問等場景。Nginx 支持兩種配置方式:allow/deny 指令(簡單)和 ngx_http_limit_req_module 模塊(限流)。
5.3.1 allow/deny 指令(IP 黑白名單)
server {
listen 80;
server_name www.test.com;
location / {
root /usr/local/nginx/html;
index index.html;
# 允許的IP/網(wǎng)段(白名單)
allow 192.168.1.100; # 允許單個IP
allow 192.168.1.0/24; # 允許192.168.1.0網(wǎng)段
allow 127.0.0.1; # 允許本地訪問
deny all; # 拒絕其他所有IP(必須放在最后,順序影響結(jié)果)
}
# 僅拒絕特定IP(黑名單)
location /api/ {
deny 10.0.0.1; # 拒絕10.0.0.1訪問
deny 172.16.0.0/16; # 拒絕172.16.0.0網(wǎng)段
allow all; # 允許其他所有IP
}
}- 規(guī)則:
allow和deny按配置順序執(zhí)行,匹配到第一個規(guī)則后立即生效; - 適用場景:簡單的 IP 限制,如僅允許內(nèi)網(wǎng)訪問后臺服務(wù)。
5.3.2 基于訪問頻率的控制(限流)
通過 ngx_http_limit_req_module 模塊,限制單個客戶端的訪問頻率(如每秒最多 10 個請求),防止惡意請求壓垮服務(wù)器。
nginx
http {
# 定義限流規(guī)則:以客戶端IP為key,緩存區(qū)大小10M,訪問頻率10r/s(每秒10個請求)
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
server {
listen 80;
server_name www.test.com;
location / {
limit_req zone=one burst=5 nodelay; # 應(yīng)用限流規(guī)則
# burst=5:允許突發(fā)5個請求(超過10r/s的部分,最多5個排隊)
# nodelay:突發(fā)請求不排隊,直接返回503(避免客戶端等待)
root /usr/local/nginx/html;
index index.html;
}
}
}- 測試:通過
ab -n 100 -c 10 http://www.test.com/模擬高并發(fā)請求,超過頻率限制的請求會返回 503 Service Temporarily Unavailable。
5.4 基于域名的 Nginx 虛擬主機
核心原理:服務(wù)器綁定多個域名(如 www.test1.com、www.test2.com),所有域名解析到同一服務(wù)器 IP;Nginx 通過 server_name 匹配客戶端請求的 Host 頭,分發(fā)到對應(yīng)的虛擬主機。
配置步驟:
- 服務(wù)器綁定多個域名(需在 DNS 服務(wù)器配置解析,本地測試可修改
/etc/hosts):
# 本地測試:編輯 /etc/hosts,添加域名映射 echo "192.168.1.100 www.test1.com www.test2.com" >> /etc/hosts
- 準備兩個網(wǎng)站的根目錄和測試頁面:
# 網(wǎng)站1:www.test1.com mkdir -p /usr/local/nginx/html/test1 echo "<h1>Test1 Website</h1>" > /usr/local/nginx/html/test1/index.html # 網(wǎng)站2:www.test2.com mkdir -p /usr/local/nginx/html/test2 echo "<h1>Test2 Website</h1>" > /usr/local/nginx/html/test2/index.html
- 編輯 Nginx 配置,添加兩個
server塊:
# 虛擬主機1:www.test1.com
server {
listen 80;
server_name www.test1.com;
location / {
root /usr/local/nginx/html/test1;
index index.html;
}
}
# 虛擬主機2:www.test2.com
server {
listen 80;
server_name www.test2.com;
location / {
root /usr/local/nginx/html/test2;
index index.html;
}
}- 驗證配置并重載 Nginx:
nginx -t && nginx -s reload
- 訪問測試:
- 訪問
http://www.test1.com,顯示Test1 Website; - 訪問
http://www.test2.com,顯示Test2 Website。
5.5 基于 IP 的 Nginx 虛擬主機
核心原理:服務(wù)器配置多個 IP 地址(如 192.168.1.100、192.168.1.101);Nginx 通過 listen 指令綁定不同的 IP,客戶端訪問不同的 IP 時,匹配到對應(yīng)的虛擬主機。
配置步驟:
- 給服務(wù)器添加多個 IP(以 CentOS 7 為例):
# 臨時添加IP(重啟網(wǎng)絡(luò)失效) ifconfig ens33:1 192.168.1.101 netmask 255.255.255.0 up # 永久添加IP:編輯網(wǎng)卡配置文件 cat > /etc/sysconfig/network-scripts/ifcfg-ens33:1 << EOF TYPE=Ethernet BOOTPROTO=static IPADDR=192.168.1.101 NETMASK=255.255.255.0 DEVICE=ens33:1 ONBOOT=yes EOF # 重啟網(wǎng)絡(luò) systemctl restart network
- 準備兩個網(wǎng)站的根目錄(同 5.4 步驟 2);
- 編輯 Nginx 配置,
listen綁定不同 IP:
nginx
# 虛擬主機1:綁定192.168.1.100
server {
listen 192.168.1.100:80; # 綁定IP+端口
server_name 192.168.1.100;
location / {
root /usr/local/nginx/html/test1;
index index.html;
}
}
# 虛擬主機2:綁定192.168.1.101
server {
listen 192.168.1.101:80;
server_name 192.168.1.101;
location / {
root /usr/local/nginx/html/test2;
index index.html;
}
}- 驗證配置并重載 Nginx;
- 訪問測試:
- 訪問
http://192.168.1.100,顯示Test1 Website; - 訪問
http://192.168.1.101,顯示Test2 Website。
5.6 基于端口的 Nginx 虛擬主機
核心原理:Nginx 的不同 server 塊監(jiān)聽不同的端口(如 80、8080、8888);客戶端通過 “IP + 端口” 訪問,Nginx 根據(jù)端口匹配對應(yīng)的虛擬主機,是最簡單的虛擬主機配置方式。
配置步驟:
- 準備兩個網(wǎng)站的根目錄(同 5.4 步驟 2);
- 編輯 Nginx 配置,
listen綁定不同端口:
nginx
# 虛擬主機1:監(jiān)聽80端口
server {
listen 80;
server_name 192.168.1.100;
location / {
root /usr/local/nginx/html/test1;
index index.html;
}
}
# 虛擬主機2:監(jiān)聽8080端口
server {
listen 8080;
server_name 192.168.1.100;
location / {
root /usr/local/nginx/html/test2;
index index.html;
}
}- 開放端口(若防火墻開啟):
firewall-cmd --add-port=8080/tcp --permanent firewall-cmd --reload
- 驗證配置并重載 Nginx;
- 訪問測試:
- 訪問
http://192.168.1.100:80,顯示Test1 Website; - 訪問
http://192.168.1.100:8080,顯示Test2 Website。
三種虛擬主機對比
| 類型 | 核心區(qū)分依據(jù) | 適用場景 | 優(yōu)點 | 缺點 |
|---|---|---|---|---|
| 基于域名 | server_name(域名) | 多網(wǎng)站共享同一 IP + 端口(如共享 80/443),互聯(lián)網(wǎng)場景最常用 | 用戶友好(無需記端口),節(jié)省 IP 資源 | 需配置 DNS 解析,本地測試需修改 hosts |
| 基于 IP | listen(綁定 IP) | 服務(wù)器有多個 IP,需區(qū)分不同 IP 對應(yīng)的服務(wù)(如內(nèi)網(wǎng) / 外網(wǎng)服務(wù)分離) | 配置簡單,無需依賴 DNS | 浪費 IP 資源,IP 數(shù)量有限 |
| 基于端口 | listen(端口) | 測試環(huán)境、內(nèi)部服務(wù)(如后臺管理系統(tǒng)),無需域名解析 | 配置最簡單,無需額外資源 | 用戶需記端口(如 8080),不適合互聯(lián)網(wǎng)場 |
到此這篇關(guān)于Nginx概念、架構(gòu)、配置與虛擬主機實戰(zhàn)操作指南的文章就介紹到這了,更多相關(guān)nginx架構(gòu)與虛擬主機內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx 實現(xiàn) TCP/DUP流量按 IP 動態(tài)轉(zhuǎn)發(fā)操作方法
為優(yōu)化網(wǎng)絡(luò)性能和提升服務(wù)可用性,通過Nginx配置stream模塊根據(jù)客戶端IP地址動態(tài)轉(zhuǎn)發(fā)TCP請求至不同后端服務(wù)器節(jié)點,適用于數(shù)據(jù)庫代理、TCP服務(wù)負載均衡及地域或來源IP分流的流量調(diào)度等場景,本文給大家介紹Nginx 實現(xiàn) TCP/DUP流量按 IP 動態(tài)轉(zhuǎn)發(fā)的操作2024-10-10

