一、Nginx目錄結構
[root@localhost ~]# tree /usr/local/nginx
/usr/local/nginx
├── client_body_temp # POST 大文件暫存目錄
├── conf # Nginx所有配置文件的目錄
│ ├── fastcgi.conf # fastcgi相關參數的配置文件
│ ├── fastcgi.conf.default # fastcgi.conf的原始備份文件
│ ├── fastcgi_params # fastcgi的參數文件
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types # 媒體類型
│ ├── mime.types.default
│ ├── nginx.conf #這是Nginx默認的主配置文件,日常使用和修改的文件
│ ├── nginx.conf.default
│ ├── scgi_params # scgi相關參數文件
│ ├── scgi_params.default
│ ├── uwsgi_params # uwsgi相關參數文件
│ ├── uwsgi_params.default
│ └── win-utf
├── fastcgi_temp # fastcgi臨時數據目錄
├── html # Nginx默認站點目錄
│ ├── 50x.html # 錯誤頁面優雅替代顯示文件,例如出現502錯誤時會調用此頁面
│ └── index.html # 默認的首頁文件
├── logs # Nginx日志目錄
│ ├── access.log # 訪問日志文件
│ ├── error.log # 錯誤日志文件
│ └── nginx.pid # pid文件,Nginx進程啟動后,會把所有進程的ID號寫到此文件
├── proxy_temp # 臨時目錄
├── sbin # Nginx 可執行文件目錄
│ └── nginx # Nginx 二進制可執行程序
├── scgi_temp # 臨時目錄
└── uwsgi_temp # 臨時目錄
主要的目錄包含conf,html,logs和sbin:
????????① conf目錄用來存放配置文件相關
? ? ? ? ②?html目錄用來存放靜態文件的默認目錄?,如前端包、html、css等
? ? ? ? ③?logs目錄用來存放日志信息
? ? ? ? ④?sbin目錄用于存放可執行文件,可以用 ./nginx啟動nginx:
二、基本運行原理
Nginx 是一種高性能的 HTTP 和反向代理服務器,它采用了經典的「Master-Worker」模型來運行。以下是 Nginx 基本運行原理的介紹:
-
啟動過程:
-
當 Nginx 啟動時,首先會創建一個
Master
進程。 -
Master
進程負責讀取和驗證配置文件(如/conf/nginx.conf
),確保配置的正確性。
-
-
配置文件:
-
配置文件中定義了 Nginx 的各種設置,包括監聽的端口、處理請求的方式等。
-
-
Worker 進程:
-
Master
進程會根據配置文件中的設置,啟動多個Worker
進程。 -
這些
Worker
進程是實際處理客戶端請求的進程。 -
每個
Worker
進程獨立運行,平等地競爭來自客戶端的請求。
-
-
請求處理:
-
客戶端通過瀏覽器或其他方式向 Nginx 發送請求(如訪問
http://192.168.44.101/index.html
)。 -
請求首先到達
Master
進程,然后由Master
進程分發給一個Worker
進程。 -
Worker
進程解析請求,并根據請求內容讀取相應的文件(如/html/index.html
)。 -
Worker
進程處理完請求后,將響應返回給客戶端。
-
-
進程管理:
-
Master
進程負責管理Worker
進程,包括接收外界信號、向Worker
進程發送信號、監控Worker
進程的運行狀態等。 -
如果某個
Worker
進程異常退出,Master
進程會自動重新啟動一個新的Worker
進程,以確保服務的連續性。
-
-
性能優化:
-
通常,
Worker
進程的數量會設置為與機器的 CPU 核心數一致,以充分利用多核 CPU 的性能。 -
Nginx 的事件處理模型(如 epoll)使得
Worker
進程能夠高效地處理大量并發連接。
-
通過這種「Master-Worker」模型,Nginx 能夠實現高性能、高并發的 Web 服務處理。
三、Nginx配置與應用場景
3.1 nginx.conf
剛安裝好的nginx.conf如下:
#user nobody;
worker_processes 1;#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024;
}http {include mime.types;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;#tcp_nopush on;#keepalive_timeout 0;keepalive_timeout 65;#gzip on;server {listen 80;server_name localhost;#charset koi8-r;#access_log logs/host.access.log main;location / {root html;index index.html index.htm;}#error_page 404 /404.html;# redirect server error pages to the static page /50x.html#error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {# proxy_pass http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {# root html;# fastcgi_pass 127.0.0.1:9000;# fastcgi_index index.php;# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;# include fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {# deny all;#}}# another virtual host using mix of IP-, name-, and port-based configuration##server {# listen 8000;# listen somename:8080;# server_name somename alias another.alias;# location / {# root html;# index index.html index.htm;# }#}# HTTPS server##server {# listen 443 ssl;# server_name localhost;# ssl_certificate cert.pem;# ssl_certificate_key cert.key;# ssl_session_cache shared:SSL:1m;# ssl_session_timeout 5m;# ssl_ciphers HIGH:!aNULL:!MD5;# ssl_prefer_server_ciphers on;# location / {# root html;# index index.html index.htm;# }#}}
去掉注釋的簡單版如下:
worker_processes 1; #允許進程數量,建議設置為cpu核心數或者auto自動檢測,
#注意Windows服務器上雖然可以啟動多個processes,但是實際只會用其中一個events {#單個進程最大連接數(最大連接數=連接數*進程數)#根據硬件調整,和前面工作進程配合起來用,盡量大,但是別把cpu跑到100%就行。worker_connections 1024;
}http {#文件擴展名與文件類型映射表(是conf目錄下的一個文件)include mime.types;#默認文件類型,如果mime.types預先定義的類型沒匹配上,默認使用二進制流的方式傳輸default_type application/octet-stream;#sendfile指令指定nginx是否調用sendfile 函數(zero copy 方式)來輸出文件,
#對于普通應用,必須設為on。如果用來進行下載等應用磁盤IO重負載應用,
#可設置為off,以平衡磁盤與網絡IO處理速度。sendfile on;#長連接超時時間,單位是秒keepalive_timeout 65;#虛擬主機的配置server {#監聽端口listen 80;#域名,可以有多個,用空格隔開server_name localhost;#配置根目錄以及默認頁面location / {root html;index index.html index.htm;}#出錯頁面配置error_page 500 502 503 504 /50x.html;#/50x.html文件所在位置location = /50x.html {root html;}}}
配置介紹:
Worker
進程 )。 -
sendfile
可以實現數據的零拷貝(zero-copy),即數據直接從文件系統傳輸到網絡緩沖區,而不需要經過用戶空間的拷貝,從而提高傳輸效率。

開啟sendfile:
⑥keepalive_timeout 65;
keepalive_timeout
是 Nginx 配置中的一個指令,它用于設置保持連接打開狀態的時間,也就是長連接的超時時間。
-
time
:可以是指定的秒數,也可以是小數點表示的秒數(例如,65、65.5)。
3.2?server_name匹配規則
3.2.1完整匹配
可以配置多個域名,例如:
server_name test81.xzj520520.cn test82.xzj520520.cn;
3.2.2通配符匹配
使用通配符的方式如下
①通配符開始匹配:
server_name *.xzj520520.cn;
②通配符結束匹配:
server_name www.xzj520520.*;
需要注意的是精確匹配的優先級大于通配符匹配和正則匹配。
3.2.3正則匹配
采用正則的匹配方式如下:
server_name ~^[0-9]+\.mmban\.com$;
正則匹配格式,必須以~開頭,比如:server_name ~^www\d+\.example\.net$;。如果開頭沒有~,則nginx認為是精確匹配。在邏輯上,需要添加^和$錨定符號。注意,正則匹配格式中.為正則元字符,如果需要匹配.,則需要反斜線轉義。如果正則匹配中含有{和}則需要雙引號引用起來,避免nginx報錯,如果沒有加雙引號,則nginx會報如下錯誤:directive "server_name" is not terminated by ";" in ...。
3.2.4 匹配順序
-
精確匹配:
? ?Nginx 首先查找是否有完全匹配的域名。例如,如果配置了server_name example.com;
,則該服務器塊會匹配直接請求example.com
的請求。 -
最長通配符匹配(以 * 開頭):
? ?如果沒有精確匹配,Nginx 會查找以星號(*)開頭的最長通配符匹配。例如,server_name *.example.com;
會匹配任何以.example.com
結尾的域名,如sub.example.com
。 -
最長通配符匹配(以 * 結尾):
? ?如果沒有找到以 * 開頭的通配符匹配,Nginx 會查找以星號(*)結尾的最長通配符匹配。例如,server_name example.*;
會匹配任何以example.
開頭的域名,如example.sub
。 -
正則表達式匹配:
? ?如果上述匹配都未找到,Nginx 會查找正則表達式匹配。正則表達式必須以~
開頭(區分大小寫)或~*
開頭(不區分大小寫)。例如,server_name ~^www\.example\.com$;
會匹配www.example.com
。 -
特殊匹配:
?server_name "";
用于匹配 Host 請求頭不存在的情況。 -
默認服務器塊:
? ? 如果以上所有匹配都未找到,Nginx 會使用沒有server_name
指令的服務器塊(如果有的話)作為默認服務器塊來處理請求。
3.3反向代理
在 Nginx 中配置反向代理時,proxy_pass
指令用于指定客戶端請求將被轉發到的目標服務器地址。
-
假設我們要將域名
example.com
的請求代理到后端服務器192.168.1.100
的8080
端口。
server {listen 80; // 監聽 80 端口server_name example.com; // 指定域名location / {proxy_pass http://192.168.1.100:8080; // 將請求轉發到后端服務器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; // 添加 X - Forwarded - For 頭部,用于記錄請求經過的代理服務器proxy_set_header X-Forwarded-Proto $scheme; // 傳遞原始請求的協議(如 HTTP 或 HTTPS)}
}
-
在這個配置中,
proxy_pass
指令是核心,它指定了后端服務器的地址和端口。proxy_set_header
指令用于設置轉發請求時添加的頭部信息,這對于后端服務器正確處理請求很重要。例如,X - Real - IP
頭部可以讓后端服務器知道客戶端的真實 IP 地址,而不是 Nginx 服務器的 IP 地址。
3.4負載均衡
3.4.1 如何配置負載均衡
可以通過upstream
模塊定義一組后端服務器,然后在proxy_pass
中引用這個upstream來實現負載均衡。
upstream backend {server 192.168.1.100:8080;server 192.168.1.101:8080;server 192.168.1.102:8080;
}server {listen 80;server_name example.com;location / {proxy_pass http://backend; // 引用 upstream 中定義的服務器組proxy_set_header Host $host;proxy_set_header X - Real - IP $remote_addr;proxy_set_header X - Forwarded - For $proxy_add_x_forwarded_for;proxy_set_header X - Forwarded - Proto $scheme;}
}
默認情況下,Nginx 使用輪詢的方式將請求分發到upstream
中的服務器。也可以通過least_conn
(最少連接)或ip_hash
(基于 IP 哈希)等指令來指定其他負載均衡策略
3.4.2?負載均衡策略
1. 輪詢(默認策略)
-
工作原理:默認情況下,Nginx 使用輪詢策略,按照順序依次將請求分配給后端服務器。
-
適用場景:適用于后端服務器性能相近且請求量相對均勻的場景。
-
配置示例:
upstream backend {server 127.0.0.1:8050;server 127.0.0.1:8060;server 127.0.0.1:8070; }
2. 權重(Weight)
-
工作原理:通過
weight
指令為每臺服務器分配權重。權重越高,分配到的請求越多。權重默認為1。 -
適用場景:適用于后端服務器性能不均的情況,高性能服務器可以分配更高的權重。
-
配置示例:
upstream backend {server 127.0.0.1:8050 weight=10; # 高性能服務器server 127.0.0.1:8060 weight=1; # 低性能服務器server 127.0.0.1:8070 weight=5; # 中等性能服務器
}
3. 禁用服務器(Down)
-
工作原理:使用
down
指令可以將某臺服務器標記為暫時不參與負載均衡。 -
適用場景:當某臺服務器需要維護或出現故障時,可以將其標記為
down
。 -
配置示例:
upstream backend {server 127.0.0.1:8050;server 127.0.0.1:8060 down; # 暫時禁用這臺服務器server 127.0.0.1:8070; }
4. 備用服務器(Backup)
-
工作原理:使用
backup
指令可以將某臺服務器標記為備用服務器。只有當其他所有非備用服務器都不可用(如宕機或繁忙)時,才會將請求轉發到備用服務器。 -
適用場景:用于提高系統的可用性,確保在部分服務器故障時仍然可以提供服務。
-
配置示例:
upstream backend {server 127.0.0.1:8050;server 127.0.0.1:8060;server 127.0.0.1:8070 backup; # 備用服務器
}
5. IP 哈希(IP Hash)
-
工作原理:根據客戶端的IP地址進行哈希計算,將請求分配到特定的服務器。同一個客戶端的請求總是被分配到同一臺服務器。
-
適用場景:適用于需要會話保持的應用場景,例如在線購物車系統。
-
配置示例:
upstream backend {ip_hash;server 127.0.0.1:8050;server 127.0.0.1:8060;
}
6. 最少連接(Least Conn)
-
工作原理:將新的請求分配給當前連接數最少的服務器。
-
適用場景:適用于請求量波動較大且服務器性能相近的場景。
-
配置示例:
upstream backend {least_conn;server 127.0.0.1:8050;server 127.0.0.1:8060;
}
7. URL 哈希(URL Hash)
-
工作原理:根據請求的URL進行哈希計算,將請求分配到特定的服務器。適用于靜態資源的負載均衡。
-
適用場景:適用于靜態資源的分配,例如圖片、CSS 文件等。
-
配置示例:
upstream backend {hash $request_uri consistent; # 使用請求的 URI 進行哈希server 127.0.0.1:8050;server 127.0.0.1:8060;
}
8. 響應時間(Fair)
-
工作原理:根據后端服務器的響應時間來分配請求。響應時間越短的服務器,分配到的請求越多。
-
適用場景:適用于對響應時間敏感的應用場景。
-
配置示例:
upstream backend {fair;server 127.0.0.1:8050;server 127.0.0.1:8060;
}
3.4.3 綜合配置示例
以下是一個綜合了多種策略的配置示例:
upstream backend {ip_hash; # 保持會話least_conn; # 最少連接server 127.0.0.1:8050 weight=10;server 127.0.0.1:8060 weight=5;server 127.0.0.1:8070 weight=1 backup; # 備用服務器server 127.0.0.1:8080 down; # 禁用服務器
}server {listen 80;server_name example.com;location / {proxy_pass http://backend;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}
}
3.4.3 總結
-
輪詢:適用于服務器性能相近的場景。
-
權重:適用于服務器性能不均的場景。
-
最少連接:適用于請求量波動較大的場景。
-
IP 哈希:適用于需要會話保持的場景。
-
URL 哈希:適用于靜態資源的負載均衡。
-
響應時間:適用于對響應時間敏感的場景。
-
備用服務器:用于提高系統的可用性。
-
禁用服務器:用于維護或故障處理。
根據實際需求選擇合適的策略和配置,可以有效提升系統的性能和可用性。
?