最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Nginx概念、架構、配置與虛擬主機實戰(zhàn)操作指南

 更新時間:2025年11月26日 11:34:06   作者:木童662  
Nginx是一個高性能的HTTP服務器、反向代理服務器、負載均衡器和IMAP/POP3/SMTP代理服務器,它支持高并發(fā)連接,資源占用低,功能全面且靈活,文章介紹Nginx概念、架構、配置與虛擬主機實戰(zhàn)操作指南,感興趣的朋友跟隨小編一起看看吧

Nginx 深度解析:概念、架構、配置與虛擬主機實戰(zhàn)

一、Nginx 的概念

Nginx(發(fā)音 “engine x”)是由俄羅斯開發(fā)者 Igor Sysoev 設計的高性能 HTTP 服務器、反向代理服務器、負載均衡器和 IMAP/POP3/SMTP 代理服務器。其核心設計理念是 “事件驅動、異步非阻塞 I/O 模型”,旨在以極低的資源消耗支撐超高并發(fā)連接,同時提供豐富的擴展功能。

從本質上講,Nginx 是一個 “請求分發(fā)與處理中樞”:

  • 作為 Web 服務器:直接處理靜態(tài)資源(HTML、CSS、JS、圖片等)的請求,無需依賴后端應用;
  • 作為反向代理:接收客戶端請求后,轉發(fā)到后端業(yè)務服務器(Tomcat、Node.js 等),并將響應結果返回給客戶端,隱藏后端服務細節(jié);
  • 作為負載均衡器:將海量客戶端請求均勻分發(fā)到多臺后端服務器,提升系統(tǒng)并發(fā)能力和可用性;
  • 其他角色:支持 SSL 終結、URL 重寫、緩存、限流等附加功能,適配復雜業(yè)務場景。

Nginx 廣泛應用于互聯(lián)網架構的 “接入層”,是目前全球使用最廣泛的 Web 服務器之一(據(jù) W3Techs 統(tǒng)計,全球 Top 1000 網站中約 60% 采用 Nginx)。

二、Nginx 的特點

Nginx 之所以成為行業(yè)主流,核心源于以下六大特點,且每個特點都與底層設計深度綁定:

  1. 高并發(fā)支持:基于事件驅動(epoll/kqueue)和異步非阻塞 I/O 模型,單臺服務器可輕松支撐 10 萬 + 并發(fā)連接(遠高于 Apache 的進程 / 線程模型)。其核心邏輯是 “一個工作進程處理多個連接”,避免了進程 / 線程切換的巨大開銷;
  2. 資源占用極低:空閑狀態(tài)下內存占用僅幾 MB,運行時 CPU 使用率遠低于同類服務器。例如,4 核 8G 服務器部署 Nginx 后,僅占用 10-20MB 內存,可將大部分資源留給業(yè)務服務;
  3. 功能全面且靈活:集靜態(tài)資源服務、反向代理、負載均衡、SSL 配置、URL 重寫、緩存、限流等功能于一體,支持第三方模塊擴展(如 Lua 腳本、圖片處理模塊);
  4. 穩(wěn)定性極強:核心代碼簡潔(約 10 萬行),故障率極低,支持 “熱部署”(nginx -s reload)—— 無需重啟服務即可重載配置,保障業(yè)務不中斷;
  5. 跨平臺兼容:可運行在 Linux、Windows、FreeBSD、Solaris 等多種操作系統(tǒng),主流 Linux 發(fā)行版(CentOS、Ubuntu)默認提供安裝源;
  6. 配置簡單易維護:配置文件采用文本格式,結構清晰(塊級層級),支持主配置 + 子配置拆分,便于批量管理和自動化部署。

三、Nginx 的進程結構(詳細解析)

Nginx 啟動后,會生成多進程架構,核心由 “主進程(Master Process)” 和 “工作進程(Worker Process)” 組成,部分場景會包含 “輔助進程”(緩存加載進程、日志輪轉進程等)。這種架構設計是 Nginx 高并發(fā)、高穩(wěn)定的核心保障,以下分進程詳解:

3.1 進程結構總覽

plaintext

# 啟動 Nginx 后,通過 ps 命令查看進程(以 4 核服務器為例)
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 用戶運行,權限高,負責管理);
  • 4 個工作進程(nginx 普通用戶運行,權限低,負責處理請求);
  • (可選)緩存加載進程(cache loader process):啟動時加載磁盤緩存到內存,完成后自動退出;
  • (可選)緩存管理進程(cache manager process):定期清理過期緩存,維持緩存大小在配置閾值內。

3.2 主進程(Master Process)——“管理者”

核心作用:
  1. 讀取并驗證配置文件:啟動時加載 nginx.conf,檢查語法正確性;支持熱重載(nginx -s reload),重新讀取配置并生效,無需中斷服務;
  2. 創(chuàng)建并管理工作進程:根據(jù) worker_processes 配置(默認與 CPU 核心數(shù)一致),通過 fork() 系統(tǒng)調用創(chuàng)建工作進程;監(jiān)控工作進程狀態(tài),若工作進程異常退出,立即自動創(chuàng)建新的工作進程,保障服務可用性;
  3. 接收并處理信號:響應管理員發(fā)送的信號(如啟動、停止、重載、日志切割),例如:
    • kill -HUP 主進程PID:重載配置;
    • kill -TERM 主進程PID:優(yōu)雅停止服務(處理完當前請求后退出);
  4. 管理輔助進程:按需啟動緩存加載 / 管理進程、日志輪轉進程等。
運行權限:

主進程必須以 root 用戶運行,原因是:

  • Nginx 需監(jiān)聽 80(HTTP)、443(HTTPS)等特權端口(Linux 中,非 root 用戶無法綁定 1024 以下端口);
  • 主進程需要創(chuàng)建 / 管理工作進程,且工作進程通常以低權限用戶(如 nginx)運行,避免因工作進程被攻擊導致系統(tǒng)權限泄露。

3.3 工作進程(Worker Process)——“執(zhí)行者”

核心作用:

處理客戶端的 HTTP 請求,是 Nginx 并發(fā)能力的核心載體,其工作流程如下:

  1. 競爭接收連接:所有工作進程通過 “共享監(jiān)聽套接字”(主進程創(chuàng)建監(jiān)聽端口后,工作進程繼承該套接字),采用 “驚群效應優(yōu)化”(Nginx 1.11+ 已解決)競爭接收客戶端連接;
  2. 異步非阻塞處理請求:每個工作進程通過 epoll/kqueue 事件模型,同時處理成千上萬個連接(由 worker_connections 配置限制),無需為每個連接創(chuàng)建線程 / 進程,資源消耗極低;
  3. 請求處理流程
    • 接收客戶端請求數(shù)據(jù);
    • 解析 HTTP 協(xié)議(請求行、請求頭、請求體);
    • 匹配 server 塊(通過監(jiān)聽端口 +server_name);
    • 匹配 location 塊(通過請求路徑);
    • 執(zhí)行處理邏輯(返回靜態(tài)資源、反向代理到后端服務、負載均衡分發(fā)等);
    • 構建 HTTP 響應,發(fā)送給客戶端;
  4. 無狀態(tài)設計:工作進程之間完全獨立,無共享內存,每個工作進程處理的請求互不影響,避免了進程間通信的開銷,也提升了穩(wěn)定性(單個工作進程故障不影響其他進程)。
關鍵配置與并發(fā)能力:

工作進程的并發(fā)能力由兩個核心配置決定:

  • worker_processes:工作進程數(shù),推薦設置為 CPU 核心數(shù)(如 4 核服務器設為 4),避免進程切換開銷,充分利用多核 CPU;
  • worker_connections:每個工作進程的最大連接數(shù)(默認 1024),表示單個工作進程可同時處理的客戶端連接數(shù)。

最大并發(fā)連接數(shù)計算公式最大并發(fā)數(shù) = worker_processes × worker_connections ÷ 2(除以 2 是因為每個 HTTP 連接包含 “客戶端→Nginx” 和 “Nginx→后端服務” 兩個連接,若僅處理靜態(tài)資源,可無需除以 2)

例如:worker_processes=4worker_connections=1024,則最大并發(fā)連接數(shù)約為 2048。

運行權限:

工作進程以低權限用戶(如 nginx)運行,由主進程在創(chuàng)建時通過 setuid()/setgid() 系統(tǒng)調用切換用戶,目的是:

  • 降低安全風險:若工作進程被惡意攻擊,攻擊者僅能獲取 nginx 用戶權限,無法操作系統(tǒng)核心資源;
  • 限制文件訪問:工作進程僅能訪問 nginx 用戶有權限的文件(如網站根目錄、日志文件),避免誤操作系統(tǒng)文件。

3.4 進程間通信機制

Nginx 進程間通信主要依賴以下方式:

  1. 共享內存:用于共享配置信息(如 upstream 后端服務器狀態(tài)、緩存元數(shù)據(jù)),避免每個進程重復加載配置,提升效率;
  2. 信號:主進程通過信號(如 SIGCHLD)監(jiān)控工作進程狀態(tài),工作進程異常退出時,主進程收到信號后創(chuàng)建新的工作進程;
  3. 文件鎖:用于日志寫入、緩存操作等場景,避免多個工作進程同時寫入同一文件導致數(shù)據(jù)錯亂。

四、Nginx 的配置(詳細解析 + 流量流程)

Nginx 的核心配置文件為 /usr/local/nginx/conf/nginx.conf(源碼安裝路徑),采用塊級層級結構,從外到內依次為:全局塊 → I/O事件塊 → HTTP塊 → Server塊 → Location塊。

配置文件整體結構模板

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;                   # 開啟連接接收互斥鎖,解決驚群效應
}
# 三、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; # 后端服務器1,權重1
        server 192.168.1.102:8080 weight=2; # 后端服務器2,權重2(接收更多請求)
    }
    # 四、Web服務的監(jiān)聽配置(server塊,虛擬主機核心)
    server {
        listen       80;               # 監(jiān)聽80端口(HTTP默認端口)
        listen       192.168.1.100:80; # 綁定特定IP+端口(多IP服務器時使用)
        server_name  www.test.com test.com; # 綁定域名(多個域名用空格分隔)
        charset utf-8;                 # 網頁字符編碼
        access_log  logs/www.test.com.access.log  main; # 該虛擬主機的訪問日志
        # 五、其他配置(location塊,路徑匹配核心)
        # 匹配根路徑(/)
        location / {
            root   /usr/local/nginx/html; # 網站根目錄(靜態(tài)資源存放路徑)
            index  index.html index.htm;  # 默認首頁文件(優(yōu)先級:index.html > index.htm)
            try_files $uri $uri/ /index.html; # 嘗試訪問文件→目錄→跳轉index.html(SPA應用常用)
        }
        # 匹配靜態(tài)資源路徑(圖片、CSS、JS)
        location ~* \.(jpg|jpeg|png|gif|css|js)$ {
            root   /usr/local/nginx/static; # 靜態(tài)資源獨立存放目錄
            expires 7d;                    # 瀏覽器緩存7天,減少重復請求
            add_header Cache-Control "public"; # 允許緩存
        }
        # 反向代理配置(匹配/api路徑的請求)
        location /api/ {
            proxy_pass http://backend_servers; # 轉發(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錯誤跳轉至404.html
        error_page   500 502 503 504  /50x.html; # 5xx錯誤跳轉至50x.html
        location = /50x.html {
            root   html; # 錯誤頁面存放目錄
        }
    }
}

4.1 全局配置(全局塊)

核心指令解析
指令作用配置建議
worker_processes定義工作進程數(shù),直接影響并發(fā)能力設為 CPU 核心數(shù)(grep -c "processor" /proc/cpuinfo 查看),如 4 核設為 4
error_log定義錯誤日志的路徑和日志級別(debug/info/notice/warn/error/crit)生產環(huán)境設為 warn 或 error,避免日志過大;路徑建議放在 /var/log/nginx/
pid定義 Nginx 主進程 PID 文件的存放路徑默認在 logs/nginx.pid,無需修改,便于管理進程
worker_rlimit_nofile限制每個工作進程的最大文件描述符數(shù)(Linux 中,連接、文件都屬于文件描述符)設為 65535(與系統(tǒng)最大文件描述符一致,需先修改系統(tǒng)配置:echo "* soft nofile 65535" >> /etc/security/limits.conf
worker_cpu_affinity綁定工作進程到指定 CPU 核心,避免進程切換開銷4 核服務器配置:worker_cpu_affinity 0001 0010 0100 1000(每個進程綁定一個核心)
流量流程中的作用:

全局配置是 Nginx 啟動時加載的 “基礎配置”,對所有工作進程和服務全局生效,不直接參與請求的路由,但決定了 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 內存服務器設為 10240,2G 設為 20480,需與 worker_processes 配合調整最大并發(fā)數(shù)
multi_accept允許工作進程一次性接收多個新連接(默認 off)開啟(on),提升連接接收效率,尤其高并發(fā)場景
accept_mutex開啟連接接收互斥鎖(默認 on),解決 “驚群效應”(多個工作進程同時競爭一個連接,導致資源浪費)保持開啟,避免驚群效應導致的性能損耗
worker_aio_requests每個工作進程的異步 I/O 請求數(shù)(適用于大文件傳輸)設為 1024,提升大文件(如視頻、安裝包)的傳輸效率
流量流程中的作用:

I/O 事件配置決定了工作進程 “如何接收和處理網絡連接”,是 Nginx 高并發(fā)的核心保障。當客戶端發(fā)起連接時,工作進程通過配置的事件模型(如 epoll)監(jiān)聽連接事件,高效接收并處理連接,避免阻塞。

4.3 HTTP 配置(http 塊)

HTTP 塊是 Nginx 處理 HTTP/HTTPS 請求的 “核心全局配置”,包含所有與 HTTP 協(xié)議相關的配置,且可嵌套多個 server 塊(虛擬主機)。

核心指令解析
指令作用配置建議
include mime.types引入 MIME 類型映射文件(定義文件擴展名與 Content-Type 的對應關系,如 .html → text/html)必須配置,否則 Nginx 無法正確返回文件的 Content-Type 頭,導致瀏覽器無法識別文件
default_type未匹配到 MIME 類型時的默認類型默認為 application/octet-stream(瀏覽器會下載文件),無需修改
log_format定義訪問日志的格式(可自定義字段,如 IP、時間、請求路徑、狀態(tài)碼)生產環(huán)境保留 main 格式,便于日志分析(如統(tǒng)計訪問 IP、錯誤請求)
access_log定義訪問日志的路徑和使用的格式每個虛擬主機可單獨配置,便于區(qū)分不同網站的日志
sendfile開啟 “零拷貝” 文件傳輸模式(Nginx 直接將文件數(shù)據(jù)從磁盤寫入網絡套接字,無需經過用戶態(tài)緩沖區(qū))開啟(on),大幅提升靜態(tài)資源傳輸效率,減少 CPU 占用
tcp_nopush配合 sendfile 使用,將多個小數(shù)據(jù)包合并為一個數(shù)據(jù)包發(fā)送,減少 TCP 握手次數(shù)開啟(on),提升網絡傳輸效率
tcp_nodelay禁用 TCP 延遲(Nagle 算法),立即發(fā)送小數(shù)據(jù)包,提升實時性短連接(如 API 接口)開啟(on),長連接(如文件下載)關閉(off
keepalive_timeout長連接(HTTP/1.1)的超時時間,客戶端在超時前可復用連接發(fā)送多個請求設為 60 秒,減少連接建立 / 關閉的開銷,提升并發(fā)能力
gzip開啟 gzip 壓縮,減少文本類文件(HTML、CSS、JS、JSON)的傳輸體積開啟(on),配合 gzip_types 配置需要壓縮的文件類型
upstream定義負載均衡集群(后端業(yè)務服務器組),用于反向代理時的請求分發(fā)后端多服務器部署時配置,支持輪詢、權重、IP 哈希等負載策略
流量流程中的作用:

客戶端請求到達 Nginx 后,首先進入 HTTP 塊進行 “全局預處理”:

  1. 解析 HTTP 協(xié)議,識別請求行(方法、路徑、協(xié)議版本)、請求頭;
  2. 應用 gzip 壓縮配置(若請求頭支持壓縮);
  3. 記錄訪問日志(按 log_format 格式);
  4. 根據(jù)請求的 “監(jiān)聽端口” 和 “Host 頭”,匹配對應的 server 塊,進入虛擬主機處理流程。

4.4 Web 服務的監(jiān)聽配置(server 塊)

server 塊是 “虛擬主機” 的核心配置,每個 server 塊對應一個獨立的 Web 服務(可理解為一個網站),通過 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定義網頁的字符編碼(如 UTF-8、GBK)設為 utf-8,避免中文亂碼
access_log定義該虛擬主機的獨立訪問日志路徑建議包含域名,如 logs/www.test.com.access.log,便于日志拆分和分析
流量路由邏輯(關鍵):

Nginx 如何通過 listen 和 server_name 匹配虛擬主機?

  1. 第一步:匹配 listen 端口 —— 客戶端請求的端口必須與 server 塊的 listen 配置一致,否則直接拒絕;
  2. 第二步:匹配 server_name—— 根據(jù)客戶端請求頭中的 Host 字段(如 Host: www.test.com),按以下優(yōu)先級匹配:
    • 精確匹配(如 www.test.com);
    • 左泛域名匹配(如 *.test.com);
    • 右泛域名匹配(如 www.*);
    • 正則匹配(如 ~^www\..*\.com$);
    • 默認匹配(第一個 listen 端口一致的 server 塊,或 server_name _; 的塊)。
流量流程中的作用:

經過 HTTP 塊預處理后,請求根據(jù) “端口 + Host” 匹配到對應的 server 塊,進入該虛擬主機的專屬處理流程,后續(xù)的 location 塊匹配、請求處理都基于該 server 塊的配置。

4.5 其他配置(location 塊)

location 塊是 server 塊的子配置,用于 “按請求路徑匹配處理邏輯”,是 Nginx 路由配置的核心。一個 server 塊可包含多個 location 塊,按匹配優(yōu)先級執(zhí)行。

核心指令解析
指令作用配置示例
location 匹配規(guī)則定義請求路徑的匹配規(guī)則,支持多種匹配模式(見下文)- 前綴匹配:location /api/ { ... }- 精確匹配:location = /index.html { ... }- 正則匹配:`location ~* .(jpgpng)$ { ... }`
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í)行最后一個動作(如跳轉、返回 404)try_files $uri $uri/ /index.html; → 嘗試訪問文件→目錄→跳轉至 index.html(SPA 應用路由配置)
proxy_pass反向代理指令,將請求轉發(fā)到后端服務(如 Tomcat、負載均衡集群)proxy_pass http://backend_servers;(轉發(fā)到 upstream 集群)或 proxy_pass http://127.0.0.1:8080;(轉發(fā)到本地服務)
expires配置瀏覽器緩存時間,適用于靜態(tài)資源(圖片、CSS、JS)expires 7d;(緩存 7 天),減少重復請求,提升訪問速度
error_page配置錯誤頁面跳轉,當請求返回指定狀態(tài)碼時,跳轉至對應的頁面或路徑error_page 404 /404.html;(404 錯誤跳轉至 404.html)
location 匹配模式與優(yōu)先級(關鍵)
匹配模式語法優(yōu)先級說明
精確匹配location = /path { ... }1(最高)完全匹配請求路徑,不包含子路徑,例如 = /index.html 僅匹配 /index.html,不匹配 /index.html?a=1
前綴匹配(^~)location ^~ /path { ... }2以 /path 開頭的路徑,匹配成功后不再檢查其他模式
正則匹配(~ 區(qū)分大小寫,~* 不區(qū)分大小寫)`location ~* .(jpgpng)$ { ... }`3按正則表達式匹配路徑,優(yōu)先級低于精確匹配和 ^~ 前綴匹配
普通前綴匹配location /path { ... }4(最低)以 /path 開頭的路徑,匹配成功后仍會檢查更高優(yōu)先級的模式
流量流程中的作用:

請求匹配到 server 塊后,進入 location 塊匹配流程:

  1. 按優(yōu)先級順序匹配所有 location 塊的規(guī)則;
  2. 匹配成功后,執(zhí)行該 location 塊的處理邏輯:
    • 若為靜態(tài)資源請求(如圖片、HTML):通過 root/alias 找到文件,返回給客戶端(開啟 gzip 壓縮、緩存等);
    • 若為動態(tài)請求(如 /api):通過 proxy_pass 轉發(fā)到后端服務,接收后端響應后返回給客戶端;
  3. 若未匹配到任何 location 塊,執(zhí)行 server 塊的默認邏輯(如返回 404)。

五、Nginx 虛擬主機

虛擬主機(Virtual Host)是指在一臺服務器上通過 Nginx 配置,同時運行多個獨立的 Web 服務(多個網站),共享服務器的 IP 和端口資源,通過 server_name、IP、端口區(qū)分不同服務。

5.1 訪問狀態(tài)統(tǒng)計配置

Nginx 提供 ngx_http_stub_status_module 模塊,用于統(tǒng)計 Nginx 的連接狀態(tài)(如活躍連接數(shù)、請求數(shù)),需在編譯時啟用(--with-http_stub_status_module)。

配置步驟:
  1. 編輯 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網段(內網)
        deny all;                     # 拒絕其他所有IP訪問,保障安全
    }
}
  1. 驗證配置并重載 Nginx:
nginx -t  # 檢查配置語法
nginx -s reload  # 重載配置
  1. 訪問測試:在允許的 IP 網段內,通過瀏覽器或 curl 訪問 http://www.test.com/nginx_status,輸出結果如下:

plaintext

Active connections: 2  # 當前活躍連接數(shù)(包含等待連接)
server accepts handled requests
 100 100 200  # 累計接收連接數(shù)、累計處理連接數(shù)、累計請求數(shù)
Reading: 0 Writing: 1 Waiting: 1  # 正在讀取請求頭的連接數(shù)、正在寫入響應的連接數(shù)、等待請求的連接數(shù)(長連接)

5.2 基于授權的訪問控制(HTTP 基本認證)

通過用戶名 / 密碼驗證客戶端身份,僅授權用戶可訪問網站,適用于后臺管理系統(tǒng)、內部服務等場景。

配置步驟:
  1. 安裝 htpasswd 工具(用于生成密碼文件):
yum install -y httpd-tools  # CentOS/RHEL
apt install -y apache2-utils  # Ubuntu/Debian
  1. 生成密碼文件(用戶名:admin,密碼:123456):
htpasswd -c /usr/local/nginx/conf/.htpasswd admin
# 輸入密碼(123456),生成密碼文件 .htpasswd(隱藏文件,避免泄露)
  1. 編輯 Nginx 配置,添加授權控制:
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;  # 密碼文件路徑
    }
}
  1. 驗證配置并重載 Nginx:
nginx -t && nginx -s reload
  1. 訪問測試:訪問 http://admin.test.com,瀏覽器會彈出登錄框,輸入正確的用戶名(admin)和密碼(123456)才能訪問,錯誤則返回 401 Unauthorized。

5.3 基于客戶端的訪問控制(IP 黑白名單)

通過限制客戶端的 IP 地址,允許或拒絕特定 IP / 網段訪問,適用于防止惡意攻擊、僅允許內網訪問等場景。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/網段(白名單)
        allow 192.168.1.100;  # 允許單個IP
        allow 192.168.1.0/24;  # 允許192.168.1.0網段
        allow 127.0.0.1;  # 允許本地訪問
        deny all;  # 拒絕其他所有IP(必須放在最后,順序影響結果)
    }
    # 僅拒絕特定IP(黑名單)
    location /api/ {
        deny 10.0.0.1;  # 拒絕10.0.0.1訪問
        deny 172.16.0.0/16;  # 拒絕172.16.0.0網段
        allow all;  # 允許其他所有IP
    }
}
  • 規(guī)則:allow 和 deny 按配置順序執(zhí)行,匹配到第一個規(guī)則后立即生效;
  • 適用場景:簡單的 IP 限制,如僅允許內網訪問后臺服務。
5.3.2 基于訪問頻率的控制(限流)

通過 ngx_http_limit_req_module 模塊,限制單個客戶端的訪問頻率(如每秒最多 10 個請求),防止惡意請求壓垮服務器。

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;  # 應用限流規(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 虛擬主機

核心原理:服務器綁定多個域名(如 www.test1.comwww.test2.com),所有域名解析到同一服務器 IP;Nginx 通過 server_name 匹配客戶端請求的 Host 頭,分發(fā)到對應的虛擬主機。

配置步驟:
  1. 服務器綁定多個域名(需在 DNS 服務器配置解析,本地測試可修改 /etc/hosts):
# 本地測試:編輯 /etc/hosts,添加域名映射
echo "192.168.1.100 www.test1.com www.test2.com" >> /etc/hosts
  1. 準備兩個網站的根目錄和測試頁面:
# 網站1:www.test1.com
mkdir -p /usr/local/nginx/html/test1
echo "<h1>Test1 Website</h1>" > /usr/local/nginx/html/test1/index.html
# 網站2:www.test2.com
mkdir -p /usr/local/nginx/html/test2
echo "<h1>Test2 Website</h1>" > /usr/local/nginx/html/test2/index.html
  1. 編輯 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;
    }
}
  1. 驗證配置并重載 Nginx:
nginx -t && nginx -s reload
  1. 訪問測試:
  • 訪問 http://www.test1.com,顯示 Test1 Website
  • 訪問 http://www.test2.com,顯示 Test2 Website。

5.5 基于 IP 的 Nginx 虛擬主機

核心原理:服務器配置多個 IP 地址(如 192.168.1.100、192.168.1.101);Nginx 通過 listen 指令綁定不同的 IP,客戶端訪問不同的 IP 時,匹配到對應的虛擬主機。

配置步驟:
  1. 給服務器添加多個 IP(以 CentOS 7 為例):
# 臨時添加IP(重啟網絡失效)
ifconfig ens33:1 192.168.1.101 netmask 255.255.255.0 up
# 永久添加IP:編輯網卡配置文件
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
# 重啟網絡
systemctl restart network
  1. 準備兩個網站的根目錄(同 5.4 步驟 2);
  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;
    }
}
  1. 驗證配置并重載 Nginx;
  2. 訪問測試:
  • 訪問 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ù)端口匹配對應的虛擬主機,是最簡單的虛擬主機配置方式。

配置步驟:
  1. 準備兩個網站的根目錄(同 5.4 步驟 2);
  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;
    }
}
  1. 開放端口(若防火墻開啟):
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload
  1. 驗證配置并重載 Nginx;
  2. 訪問測試:
  • 訪問 http://192.168.1.100:80,顯示 Test1 Website
  • 訪問 http://192.168.1.100:8080,顯示 Test2 Website。

三種虛擬主機對比

類型核心區(qū)分依據(jù)適用場景優(yōu)點缺點
基于域名server_name(域名)多網站共享同一 IP + 端口(如共享 80/443),互聯(lián)網場景最常用用戶友好(無需記端口),節(jié)省 IP 資源需配置 DNS 解析,本地測試需修改 hosts
基于 IPlisten(綁定 IP)服務器有多個 IP,需區(qū)分不同 IP 對應的服務(如內網 / 外網服務分離)配置簡單,無需依賴 DNS浪費 IP 資源,IP 數(shù)量有限
基于端口listen(端口)測試環(huán)境、內部服務(如后臺管理系統(tǒng)),無需域名解析配置最簡單,無需額外資源用戶需記端口(如 8080),不適合互聯(lián)網場

到此這篇關于Nginx概念、架構、配置與虛擬主機實戰(zhàn)操作指南的文章就介紹到這了,更多相關nginx架構與虛擬主機內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Nginx安裝時編譯不通過解決辦法

    Nginx安裝時編譯不通過解決辦法

    本文主要介紹了Nginx安裝時編譯不通過解決辦法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-03-03
  • Nginx解決跨域訪問的完整實例

    Nginx解決跨域訪問的完整實例

    本文介紹了使用Nginx解決Web開發(fā)中的跨域問題,并通過一個實例說明了配置和測試過程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-10-10
  • nginx 虛擬主機設置實例(多網站配置)

    nginx 虛擬主機設置實例(多網站配置)

    Nginx 虛擬主機設置一例,主要是針對虛擬主機的設置,多網站配置方法,需要的朋友可以參考下
    2013-02-02
  • nginx反向代理配置去除前綴

    nginx反向代理配置去除前綴

    這篇文章主要介紹了nginx反向代理配置去除前綴的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • Nginx+Tomcat搭建高性能負載均衡集群的實現(xiàn)方法

    Nginx+Tomcat搭建高性能負載均衡集群的實現(xiàn)方法

    這篇文章主要介紹了Nginx+Tomcat搭建高性能負載均衡集群的實現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • Nginx服務器進程數(shù)設置和利用多核CPU的方法

    Nginx服務器進程數(shù)設置和利用多核CPU的方法

    這篇文章主要介紹了Nginx服務器進程數(shù)設置和利用多核CPU的方法,這樣便可以更大限度地提高Nginx運行效率,需要的朋友可以參考下
    2015-08-08
  • Nginx部署HTTP/3的實現(xiàn)步驟

    Nginx部署HTTP/3的實現(xiàn)步驟

    本文介紹了在Nginx中部署HTTP/3的詳細步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-09-09
  • 利用njs模塊在nginx配置中引入js腳本

    利用njs模塊在nginx配置中引入js腳本

    這篇文章主要給大家介紹了關于利用njs模塊在nginx配置中引入js腳本的相關資料,通過這個腳本實現(xiàn)一些更復雜的?nginx?配置功能,需要的朋友可以參考下
    2021-12-12
  • nginx網站服務如何配置防盜鏈(推薦)

    nginx網站服務如何配置防盜鏈(推薦)

    這篇文章主要介紹了nginx網站服務如何配置防盜鏈,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Nginx部署Vue3項目完整指南

    Nginx部署Vue3項目完整指南

    本文檔介紹了使用Nginx部署Vue3單頁應用,包括本地開發(fā)環(huán)境和服務端生產環(huán)境的配置差異, 文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-03-03

最新評論

乐亭县| 吴江市| 肥西县| 宜君县| 香港 | 启东市| 乐都县| 长汀县| 新兴县| 启东市| 洪泽县| 纳雍县| 满城县| 梁山县| 邯郸市| 平谷区| 上饶市| 蒲江县| 柳林县| 龙泉市| 汉源县| 扶风县| 兴文县| 和静县| 新闻| 辽中县| 齐齐哈尔市| 南开区| 库尔勒市| 永吉县| 金湖县| 定结县| 惠东县| 隆尧县| 钟祥市| 长汀县| 辽宁省| 舞阳县| 达日县| 汕头市| 嵩明县|