文章目錄
- Nginx概述
- Nginx作用
- 正向代理
- 反向代理
- 負載均衡
- 動靜分離
- Nginx的安裝 -->Docker
- 3.1 安裝Nginx
- 3.2 Nginx的配置文件
- 3.3 修改docker-compose文件
- Nginx源碼安裝
- nginx常用命令
- nginx配置文件
- 配置文件位置
- 配置文件結構詳情
- Nginx的反向代理【`重點`】
- 基于Nginx實現反向代理
- 4.3 關于Nginx的location路徑映射
- Nginx負載均衡【`重點`】
- 5.1 輪詢
- 5.2 權重
- 5.3 ip_hash
- fair
- upstream模塊中的常用參數
- Nginx動靜分離【`重點`】
- 6.1 動態資源代理
- 6.2 靜態資源代理
- root 和alias指令區
- 權限項目部署
- Nginx高可用
- 什么是高可用
- 雙機熱備+自動故障轉移
- Nginx如何解決高可用的
- Keepalived是什么
- Keepalived實現Nginx高可用
- Keepalived實現自動故障轉移
- Nginx的進程模型
- Master進程
- work進程
Nginx概述
http://nginx.org/en/download.html
Nginx是由俄羅斯人研發的,應對Rambler的網站,并且2004年發布的第一個版本。
Nginx是lgor Sysoev為俄羅斯訪問量第二的rambler.ru站點設計開發的。從2004年發布至今,憑借開源的力量,已經接近成熟與完善。
Nginx功能豐富,可作為HTTP服務器,也可作為反向代理服務器,郵件服務器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。并且支持很多第三方的模塊擴展。
Nginx的穩定性、功能集、示例配置文件和低系統資源的消耗讓他后來居上,在全球活躍的網站中有12.18%的使用比率,大約為2220萬個網站。
Nginx的特點:
- 穩定性極強。 7*24小時不間斷運行。
- Nginx提供了非常豐富的配置實例。
- 占用內存小,并發能力強(官方給的數據是5w)
- 負載均衡策略
- 動靜態分離
- 擅長處理靜態資源,tomcat擅長處理動態資源
Nginx作用
正向代理
正向代理是給客戶端做代理,客戶端清楚要訪問的目標服務器。
正向代理服務器作用如下
- 訪問原來無法訪問的資源
- 用作緩存,加速訪問速度
- 對客戶端訪問授權,上網進行認證
- 代理可以記錄用戶訪問記錄(上網行為管理),對外隱藏用戶信息
反向代理
反向代理給服務端做代理,客戶但不知道要訪問那臺服務器。
反向代理服務器作用如下:
- 保護內網安全
- 負載均衡
- 緩存,減少服務器的壓力
負載均衡
將多個請求均勻的分配到多臺服務器上,減輕每臺服務器的壓力,提高服務的吞吐量。
Nginx提供的負載均衡策略有2種:
內置策略:輪詢,權重,Ip hash。
擴展策略:fair(會根據后端服務器的響應時間來分配請求,以實現更加均衡的負載分配。fair策略會優先將請求發送到響應時間較短的服務器上,從而提高整體性能和穩定性。)
Ip hash算法:對客戶端請求的ip進行hash操作,然后根據hash結果將同一個客戶端ip的請求分發給同一臺服務器進行處理,可以解決session不共享的問題
動靜分離
? 動靜分離是指在web服務器架構中,將靜態頁面與動態頁面或者靜態內容接口和動態內容接口分開不同系統訪問的架構設計方法,進而提升整個服務訪問性能和可維護性。
1、代理服務器和靜態服務器即為一臺服務器上,這里只是為了明顯區分動靜分離所處服務器的不同;
2、靜態服務器中,存放的資源主要是源代碼文件、圖片、屬性、樣式以及其它所有非動態的資源文件;
3、調度規則,即為代理服務器,這里是Nginx的服務器調度規則;
4、動態服務器,其種類比較繁多,可以是Apache、Tomcat、IIS以及其它Web服務器,它們一般分別隸屬于一臺服務器;
Nginx的安裝 -->Docker
3.1 安裝Nginx
使用Docker-Compose安裝
version: '3.1'
services:nginx:restart: alwaysimage: daocloud.io/library/nginx:latestcontainer_name: nginxports:- 80:80
3.2 Nginx的配置文件
關于Nginx的核心配置文件nginx.conf
worker_processes 1;
error_log /var/log/nginx/error.log warn;
# 以上統稱為全局塊,
# worker_processes他的數值越大,Nginx的并發能力就越強
# error_log 代表Nginx的錯誤日志存放的位置events {worker_connections 1024;
}
# events塊
# worker_connections他的數值越大,Nignx并發能力越強http {include /etc/nginx/mime.types;default_type application/octet-stream;server {listen 80;server_name localhost;location / {root /usr/share/nginx/html;index index.html index.htm;}# location塊# root:將接收到的請求根據/usr/share/nginx/html去查找靜態資源# index: 默認去上述的路徑中找到index.html或者index.htm}# server塊# listen: 代表Nginx監聽的端口號# localhost:代表Nginx接收請求的ip
}
# http塊
# include代表引入一個外部的文件 -> /mime.types中放著大量的媒體類型
# include /etc/nginx/conf.d/*.conf; -> 引入了conf.d目錄下的以.conf為結尾的配置文件
3.3 修改docker-compose文件
為了方便修改Nginx配置,修改yml文件
version: '3.1'
services:nginx:restart: alwaysimage: daocloud.io/library/nginx:latestcontainer_name: nginxports:- 80:80volumes:- /opt/docker_nginx/conf.d/:/etc/nginx/conf.d
Nginx源碼安裝
1、下載nginx源碼包
wget http://nginx.org/download/nginx-1.20.1.tar.gz
2、解壓
tar -zxf nginx-1.20.1.tar.gz
3、安裝c/c++的編譯器
yum install gcc
yum install gcc-c++
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
因為下載的包是源碼包,需要編譯,安裝后才能使用。而nginx是c寫的,因此需要安裝c/c++的編譯器
? 如上,gcc已經安裝完畢,下面來安裝nginx
4、安裝nginx
1、進入nginx目錄
2、 ./configure
3、make install
5、安裝成功后的位置
nginx默認會按照在/usr/local/nginx中
nginx常用命令
./nginx 啟動
./nginx -s stop 停止
./nginx -s reload 重啟(重新加載nginx配置文件)
./nginx -v 查看nginx版本號
nginx配置文件
配置文件位置
配置文件結構詳情
########### 每個指令必須有分號結束。#################
#user administrator administrators; #配置用戶或者組,默認為nobody nobody。
worker_processes 1; #允許生成的進程數,默認為1
#pid /nginx/pid/nginx.pid; #指定nginx進程運行文件存放地址
error_log log/error.log debug; #制定日志路徑,級別。這個設置可以放入全局塊,http塊,server塊,級別以此為:debug|info|notice|warn|error|crit|alert|emergevents {accept_mutex on; #設置網路連接序列化,防止驚群現象發生,默認為onmulti_accept on; #設置一個進程是否同時接受多個網絡連接,默認為off#use epoll; #事件驅動模型,select|poll|kqueue|epoll|resig|/dev/poll|eventportworker_connections 1024; #最大連接數,默認為512
}http {include mime.types; #文件擴展名與文件類型映射表default_type application/octet-stream; #默認文件類型,默認為text/plain#access_log off; #取消服務日志 log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定義格式access_log log/access.log myFormat; #combined為日志格式的默認值sendfile on; #允許sendfile方式傳輸文件,默認為off,可以在http塊,server塊,location塊。sendfile_max_chunk 100k; #每個進程每次調用傳輸數量不能大于設定的值,默認為0,即不設上限。keepalive_timeout 65; #連接超時時間,默認為75s,可以在http,server,location塊。upstream mysvr { server 127.0.0.1:7878;server 192.168.10.121:3333 backup; #熱備}error_page 404 https://www.baidu.com; #錯誤頁error_page 500 https://www.jd.com; #錯誤頁server {keepalive_requests 120; #單連接請求上限次數。listen 4545; #監聽端口server_name 127.0.0.1; #監聽地址 location ~*^.+$ { #請求的url過濾,正則匹配,~為區分大小寫,~*為不區分大小寫。#root path; #根目錄#index vv.txt; #設置默認頁proxy_pass http://mysvr; #請求轉向mysvr 定義的服務器列表deny 127.0.0.1; #拒絕的ipallow 172.18.5.54; #允許的ip } }
}
1、全局塊
2、events塊
3、http塊a)server塊1)location塊
- 全局塊:配置影響nginx全局的指令。一般有運行nginx服務器的用戶組,nginx進程pid存放路徑,日志存放路徑,配置文件引入,允許生成worker process數等。
- events塊:配置影響nginx服務器或與用戶的網絡連接。有每個進程的最大連接數,選取哪種事件驅動模型處理連接請求,是否允許同時接受多個網路連接,開啟多個網絡連接序列化等。
- http塊:可以嵌套多個server,配置代理,緩存,日志定義等絕大多數功能和第三方模塊的配置。如文件引入,mime-type定義,日志自定義,是否使用sendfile傳輸文件,連接超時時間,單連接請求數等。
- server塊:配置虛擬主機的相關參數,一個http中可以有多個server。
- location塊:配置請求的路由,以及各種頁面的處理情況。
Nginx的反向代理【重點
】
基于Nginx實現反向代理
準備一個目標服務器。
啟動了之前的tomcat服務器。
編寫default.conf配置文件,通過Nginx訪問到tomcat服務器。
# 監聽80端口
server{listen 80;server_name localhost;# 基于反向代理訪問到Tomcat服務器location / {proxy_pass http://192.168.199.109:8081/;}
}
4.3 關于Nginx的location路徑映射
優先級關系如下:
(location=) > (location /aa/bb/cc) > (location ~)
# 1. 精確匹配
location = / {# 精準匹配,主機名后面不能帶任何的字符串,等號決定匹配的內容,比如:http://baidu.com
}
# 案例
# 用戶訪問# http:192.168.193.88/abc nginx
#會自動代理到 http://192.168.193.88:8080/
location =/abc { proxy_pass http://192.168.193.88:8080/;
}# 2. 通用匹配
location /xxx {# 匹配所有以/xxx開頭的路徑,比如:http://baidu.com/xxx
}# 案例
# 用戶訪問訪問 http://192.168.193.88/qfjava/webdemo/index.jsp
#會自動代理到 http://192.168.193.88:8080/webdemo/index.jsplocation /qfjava {proxy_pass http://192.168.193.88:8080/;}# 3. 正則匹配
location ~ /xxx {# 匹配所有以/xxx開頭的路徑
}# 4. 匹配開頭路徑
location ^~ /images/ {# 匹配所有以/images開頭的路徑
}# 5. 匹配后綴
location ~* \.(gif|jpg|png)$ {# 匹配以gif或者jpg或者png為結尾的路徑
}# 6. 全部通配
location / {# 匹配全部路徑
}
Nginx負載均衡【重點
】
Nginx為我們默認提供了三種負載均衡的策略:
- 輪詢:將客戶端發起的請求,平均的分配給每一臺服務器
- 權重:會將客戶端的請求,根據服務器的權重值不同,分配不同的數量。
- ip_hash:基于發起請求的客戶端的ip地址不同,他始終會將請求發送到指定的服務器上。
5.1 輪詢
想實現Nginx輪詢負載均衡機制只需要在配置文件中添加以下內容
upstream 名字 { # 給空格server ip:port; # 給分號 server 192.168.193.66:8080server ip:port;...
}
server {listen 80;server_name localhost;location / {proxy_pass http://upstream的名字/; # 給分號}
}
5.2 權重
實現權重的方式
# 名字中不要出現下換線
upstream 名字 { server ip:port weight=權重比例; # server 192.168.193.66:8080 weight=8;server ip:port weight=權重比例; # server 192.168.193.66:8080 weight=2;...
}
server {listen 80;server_name localhost;location / {proxy_pass http://upstream的名字/;}
}
5.3 ip_hash
ip_hash實現
upstream 名字 {ip_hash;server ip:port;server ip:port;...
}
server {listen 80;server_name localhost;location / {proxy_pass http://upstream的名字/;}
}
fair
fair 模塊(第三方)來實現負載均衡,fair 采用的不是內建的算法,而是可以根據頁面大小、響應時間智能的進行負載均衡。因為是第三方所以需要單獨安裝,安裝方式參考下面文檔
https://blog.csdn.net/cxy35/article/details/104855031
upstream 名字 {server ip:port;server ip:port;fair;
}
server {listen 80;server_name localhost;location / {proxy_pass http://upstream的名字/;}
}
upstream模塊中的常用參數
upstream linuxe_backend {server 192.168.1.110 down; #該節點不可用server 192.168.1.120 backup; #其他節點掛了后該節點自動上線server 192.168.1.130 max_failes=1 fail_timeout=10s weight=5;server backend1.linuxe.cn 8080 weight=3 max_conns=10;
}
server:負載均衡后端服務器的IP或域名,不寫端口的話默認是80。高并發場景用域名,再通過DNS進行負載均衡
weight:后端服務器權重,默認為1,權重越大接收的請求越多。例:weight=5
max_fails:檢查節點的健康狀態并允許請求失敗的次數,達到該次數就將節點下線。默認為1,0表示禁止失敗嘗試。例:max_fails=2
fail_timeout:max_fails失敗次數達到限制后暫停該節點服務的時間,默認是10秒。例:fail_timeout=10s
backup:熱備配置,當服務池中所有服務器均出現問題后會自動上線backup服務器
down:標志服務器不可用,不參與負載均衡。這個參數通常配合IP_HASH使用
max_conns:限制最大連接數,通常對后端服務器硬件不一致的情況進行配置
Nginx動靜分離【重點
】
? 動靜分離是指在web服務器架構中,將靜態頁面與動態頁面或者靜態內容接口和動態內容接口分開不同系統訪問的架構設計方法,進而提升整個服務訪問性能和可維護性。
動:必須依賴服務器返回,比如Controller,數據庫相關操作。
靜:不需要依賴容器的比如css/js/html或者圖片等文件
Nginx的并發能力公式:
? worker_processes * worker_connections / 4 | 2 = Nginx最終的并發能力
動態資源需要/4,靜態資源需要/2.
Nginx通過動靜分離,來提升Nginx的并發能力,更快的給用戶響應。
6.1 動態資源代理
使用proxy_pass動態代理
# 配置如下
location / {proxy_pass 服務器的路徑;
}
6.2 靜態資源代理
使用root或者alias靜態代理
server{listen 80;server_name localhost;location /html {root data; // 在data/html下面找文件index a.html; # 配置默認頁面}location /images {root data; // 在data/images下面找文件autoindex on; # 地址欄訪問 http://192.168.193.88/images/}
}
root 和alias指令區
location /img/ {alias /var/www/image/;
}
? 若按照上述配置的話,則訪問/img/目錄里面的文件時,ningx會自動去/var/www/image/目錄找文件
location /img/ {root /var/www/image;
}
? 若按照這種配置的話,則訪問/img/目錄下的文件時,nginx會去/var/www/image/img/目錄下找文件
alias是一個目錄別名的定義,root則是最上層目錄的定義。
還有一個重要的區別是alias后面必須要用“/”結束,否則會找不到文件的。。。而root則可有可無
權限項目部署
# 權限服務器集群
upstream rbac {server 172.30.77.207:8082;server 172.30.77.207:8083;
}server {listen 80;server_name localhost;location / { # 反向代理到后端服務器proxy_pass http://rbac;}location /rbac { # 權限項目前端相關靜態頁面root data;index index.html;}
}
前端頁面訪問:http://www.2105.com/rbac/login.html
后臺接口訪問:http://www.2105.com/user/page
后臺接口取消上下文路徑,多個應用可以根據端口號或者location來區分。
Nginx高可用
什么是高可用
? 高可用HA(High Availability)是分布式系統架構設計中必須考慮的因素之一,它通常是指,通過設計減少系統不能提供服務的時間。
假設系統一直能夠提供服務,我們說系統的可用性是100%。
如果系統每運行100個時間單位,會有1個時間單位無法提供服務,我們說系統的可用性是99%。很多公司的高可用目標是4個9,也就是99.99%,這就意味著,系統的年停機時間為8.76個小時。
在生產環境上很多時候是以
Nginx
做反向代理對外提供服務,但是一天Nginx難免遇見故障,如:服務器宕機。當Nginx
宕機那么所有對外提供的接口都將導致無法訪問。
雙機熱備+自動故障轉移
? 這種方案是國內企業中最為普遍的一種高可用方案,雙機熱備其實就是指一臺服務器在提供服務,另一臺為某服務的備用狀態,當一臺服務器不可用另外一臺就會頂替上去。
有了雙機熱備方案之后,還不夠,每次出現故障需要人工介入恢復勢必會增加系統的不可服務實踐。所以,又往往是通過自動故障轉移來實現系統的高可用。
Nginx如何解決高可用的
Nginx解決高可用需要準備兩臺nginx,一個是主(Master)服務器,一個是備(backup)服務器,使用keepalived基于主和備可以創建出一臺虛擬服務器供客戶端調用。虛擬服務器接收到請求會先把請求交給主服務器處理,如果主服務器宕機就把請求交給備服務器處理。
Keepalived是什么
Keepalived
軟件起初是專為LVS
(Linux Virtual Server,Linux虛擬服務器)負載均衡軟件設計的,用來管理并監控LVS集群系統中各個服務節點的狀態,后來又加入了可以實現高可用的VRRP (Virtual Router Redundancy Protocol ,虛擬路由器冗余協議)
功能。因此,Keepalived
除了能夠管理LVS軟件外,還可以作為其他服務(例如:Nginx、Haproxy、MySQL等)
的高可用解決方案軟件
Keepalived實現Nginx高可用
安裝前需要準備好兩臺虛擬器,兩臺都需要安裝nginx和keepalived。
192.168.147.10(主)
192.168.147.11(備)
1、安裝keepalived
yum -y install keepalived # 配置文件在/etc/keepalived/keepalived.conf
2、修改主服務器keepalived.conf
# 檢測腳本
vrrp_script chk_http_port {script "/usr/local/src/check_nginx_pid.sh" #心跳執行的腳本,檢測nginx是否啟動interval 2 #(檢測腳本執行的間隔,單位是秒)weight 2 #權重
}
#vrrp 實例定義部分
vrrp_instance VI_1 {state MASTER # 指定keepalived的角色,MASTER為主,BACKUP為備interface ens33 # 當前進行vrrp通訊的網絡接口卡(當前centos的網卡) 用ifconfig查看你具體的網卡virtual_router_id 66 # 虛擬路由編號,主從要一直priority 100 # 優先級,數值越大,獲取處理請求的優先級越高advert_int 1 # 檢查間隔,默認為1s(vrrp組播周期秒數)track_script {chk_http_port #(調用檢測腳本)}virtual_ipaddress {192.168.147.88 # 定義虛擬ip(VIP),可多設,每行一個}
}
virtual_ipaddress 里面可以配置vip,在線上通過vip來訪問服務。
interface需要根據服務器網卡進行設置通常查看方式ip addr
3、修改備服務器配置文件
檢測腳本
vrrp_script chk_http_port {script "/usr/local/src/check_nginx_pid.sh" #心跳執行的腳本,檢測nginx是否啟動interval 2 #(檢測腳本執行的間隔)weight 2 #權重
}
#vrrp 實例定義部分
vrrp_instance VI_1 {state BACKUP # 指定keepalived的角色,MASTER為主,BACKUP為備interface ens33 # 當前進行vrrp通訊的網絡接口卡(當前centos的網卡) 用ifconfig查看你具體的網卡virtual_router_id 66 # 虛擬路由編號,主從要一直priority 99 # 優先級,數值越大,獲取處理請求的優先級越高advert_int 1 # 檢查間隔,默認為1s(vrrp組播周期秒數)track_script {chk_http_port #(調用檢測腳本)}virtual_ipaddress {192.168.147.88 # 定義虛擬ip(VIP),可多設,每行一個}
}
4、檢測腳本
/usr/local/src/check_nginx_pid.sh
#檢測nginx是否啟動了
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then #如果nginx沒有啟動就啟動nginx systemctl start nginx #重啟nginxif [ `ps -C nginx --no-header |wc -l` -eq 0 ];then #nginx重啟失敗,則停掉keepalived服務,進行VIP轉移killall keepalived fi
fi
5、腳本授權
chmod 700 check_nginx_pid.sh # 腳本必須通過授權,不然沒權限訪問
6、啟動keepalived
systemctl start keepalived
搭建高可用需要注意一下幾點
1、keepalived啟動先ngixn必須是啟動成功的,否則keepalived啟動不了
2、nginx停止后keepalived也會停止
3、主宕機后啟動順序是先啟動nginx,在啟動keepalived
7、測試順序
1、主備都啟動時訪問速虛擬主機請求會交給主處理
2、把主中的nginx關閉后,請求會交給備服務器處理
Keepalived實現自動故障轉移
Keepalived
高可用服務之間的故障切換轉移,是通過VRRP
來實現的。
在Keepalived
服務正常工作時,主Master
節點會不斷地向備節點發送(多播的方式)心跳消息,用以告訴備Backup
節點自己還活著,當主Master
節點發生故障時,就無法發送心跳消息,備節點也就因此無法繼續檢測到來自主Master
節點的心跳了,于是調用自身的接管程序,接管主Master節點的 IP資源及服務。而當主 Master節點恢復時,備Backup節點又會釋放主節點故障時自身接管的IP資源及服務,恢復到原來的備用角色。
Nginx的進程模型
Nginx啟動成功默認會有兩個進程,master和work。
Master進程
master進程主要用來管理worker進程,具體包括如下4個主要功能:
1、接收來自外界的信號。
2、向各worker進程發送信號。
3、監控woker進程的運行狀態。
4、當woker進程退出后(異常情況下),會自動重新啟動新的woker進程
5、熱加載ngixn配置文件
? master進程充當整個進程組與用戶的交互接口,同時對進程進行監護。它不需要處理網絡事件,不負責業務的執行,只會通過管理worker進程來實現重啟服務、平滑升級、更換日志文件、配置文件實時生效等功能。
? 我們要控制nginx,只需要通過kill向master進程發送信號就行了。比如kill -HUP pid,則是告訴nginx,從容地重啟nginx,我們一般用這個信號來重啟nginx,或重新加載配置,因為是從容地重啟,因此服務是不中斷的。
? kill -HUP 是用來向指定進程發送一個HUP信號,許多程序在收到HUP信號時,會重新讀取配置文件
master進程在接收到HUP信號后是怎么做的呢?
1)首先master進程在接到信號后,會先重新加載配置文件,然后再啟動新的worker進程,并向所有老的worker進程發送信號,告訴他們可以光榮退休了。
2)新的worker在啟動后,就開始接收新的請求,而老的worker在收到來自master的信號后,就不再接收新的請求,并且在當前進程中的所有未處理完的請求處理完成后,再退出。
work進程
? work進程主要用來處理網絡請求,像網絡事件,則是放在worker進程中來處理了。多個worker進程之間是對等的,他們同等競爭來自客戶端的請求,各進程互相之間是獨立的。一個請求,只可能在一個worker進程中處理,一個worker進程,不可能處理其它進程的請求。worker進程的個數是可以設置的(默認是1),一般我們會設置與機器cpu核數一致,這里面的原因與nginx的進程模型以及事件處理模型是分不開的。
? worker進程之間是平等的,每個進程,處理請求的機會也是一樣的
? 當我們提供80端口的http服務時,一個連接請求過來,每個work進程都有可能處理這個連接,怎么做到的呢?
Nginx采用異步非阻塞的方式來處理網絡事件,類似于Libevent,具體過程如下:
1)接收請求:首先,每個worker進程都是從master進程fork過來,在master進程建立好需要listen的socket(listenfd)之后,然后再fork出多個worker進程。所有worker進程的listenfd會在新連接到來時變得可讀,每個work進程都可以去accept這個socket(listenfd)。當一個client連接到來時,所有accept的work進程都會受到通知,但只有一個進程可以accept成功,其它的則會accept失敗。為保證只有一個進程處理該連接,Nginx提供了一把共享鎖accept_mutex來保證同一時刻只有一個work進程在accept連接。所有worker進程在注冊listenfd讀事件前搶accept_mutex,搶到互斥鎖的那個進程注冊listenfd讀事件,在讀事件里調用accept接受該連接。
2)處理請求:當一個worker進程在accept這個連接之后,就開始讀取請求,解析請求,處理請求,產生數據后,再返回給客戶端,最后才斷開連接,這樣一個完整的請求就是這樣的了。
? 我們可以看到,一個請求,完全由worker進程來處理,而且只在一個worker進程中處理。worker進程之間是平等的,每個進程,處理請求的機會也是一樣的。
后記
👉👉💕💕美好的一天,到此結束,下次繼續努力!欲知后續,請看下回分解,寫作不易,感謝大家的支持!! 🌹🌹🌹