Nginx高級技巧:實現負載均衡和反向代理

文章目錄

      • 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作用

正向代理

在這里插入圖片描述

正向代理是給客戶端做代理,客戶端清楚要訪問的目標服務器。

正向代理服務器作用如下

  1. 訪問原來無法訪問的資源
  2. 用作緩存,加速訪問速度
  3. 對客戶端訪問授權,上網進行認證
  4. 代理可以記錄用戶訪問記錄(上網行為管理),對外隱藏用戶信息
反向代理

在這里插入圖片描述

反向代理給服務端做代理,客戶但不知道要訪問那臺服務器。

反向代理服務器作用如下:

  1. 保護內網安全
  2. 負載均衡
  3. 緩存,減少服務器的壓力
負載均衡

將多個請求均勻的分配到多臺服務器上,減輕每臺服務器的壓力,提高服務的吞吐量。

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進程之間是平等的,每個進程,處理請求的機會也是一樣的。

后記
👉👉💕💕美好的一天,到此結束,下次繼續努力!欲知后續,請看下回分解,寫作不易,感謝大家的支持!! 🌹🌹🌹

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716496.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716496.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716496.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言冒泡排序(高級版)

目錄: 冒泡排序的原理 主函數 "冒泡排序函數" 比較函數 交換函數 最終輸出 完整代碼 冒泡排序的原理: 冒泡排序的原理是:從左到右,相鄰元素進行比較。每次比較一輪,就會找到序列中最大的一個或最小的一個。這個數就會從序列的最右…

Windows上構建一個和Linux類似的Terminal

preview 目的是在Windows上構建一個和Linux類似的Terminal,讓Windows煉丹和Linux一樣舒適,同是讓Terminal取代Xshell完成遠程鏈接。 預覽如下圖 在Linux下我們使用zsh和oh-my-zsh結合,Windows下我們使用powershell7和oh-my-posh結合。 前提…

Vue 前端開發 v-for和v-if兩個指令不能混合使用

原由: 在進行項目開發的時候因為在一個標簽上同時使用了v-for和v-if兩個指令導致的報錯。 提示錯誤:The undefined variable inside v-for directive should be replaced with a computed property that returns filtered array instead. You should no…

nginx------------緩存功能 ip透傳 負載均衡 (六)

一、http 協議反向代理 (一)反向代理示例:緩存功能 緩存功能可以加速訪問,如果沒有緩存關閉后端服務器后,圖片將無法訪問,緩存功能默認關閉,需要開啟。 ? proxy_cache zone_name | off; 默認off #指明調…

基于Springboot純凈水配送和商城系統設計與實現 開題報告參考

博主介紹:黃菊華老師《Vue.js入門與商城開發實戰》《微信小程序商城開發》圖書作者,CSDN博客專家,在線教育專家,CSDN鉆石講師;專注大學生畢業設計教育和輔導。 所有項目都配有從入門到精通的基礎知識視頻課程&#xff…

2023 版王道單科書勘誤匯總(3.30)

注:因2023版對題目編號做了優化“歷年真題全部放最后、且按年份排序”,以方便大家根據需要保留某些年份的真題作為最后的模擬。所以造成了一些題目和解析的編號錯誤。 數據結構: P11 P20 P56 P278 P326 “2.”中第 3 行”題 5改成”9”,第6行”題 8”改成…

css3詳解

一.什么是CSS3 CSS3是Cascading Style Sheets的第三個版本,是一種用于描述文檔樣式的語言(CSS3是CSS(層疊樣式表)技術的升級版本)。它是前端開發中用于控制網頁布局和樣式的技術之一。CSS3引入了許多新的特性和功能&a…

Linux常用操作命令大全

Linux常用操作命令大全 Linux,作為一款開源的操作系統,深受全世界開發者和系統管理員的喜愛。在Linux環境下,用戶通過命令行界面可以執行各種操作,從而實現對系統的全面控制。本文將詳細介紹Linux中常用的操作命令,幫助讀者更好地理解和運用這些命令。 一、文件操作命令…

hexo圖片顯示不出且圖片路徑錯誤/.com//

參考博客: hexo 圖片顯示問題及使用typora設置圖片路徑-CSDN博客 javascript - hexo 圖片路徑錯誤/.com// - SegmentFault 思否 先說如何讓hexo圖片成功地顯示出來 Step1: 修改config設置 將 _config.yml 設置文件中的 post_asset_folder 修改為 true 這一步的作…

平衡二叉樹,二叉樹的路徑,左葉子之和

第六章 二叉樹part04 今日內容: 110.平衡二叉樹 257. 二叉樹的所有路徑 404.左葉子之和 110.平衡二叉樹 (優先掌握遞歸) 給定一個二叉樹,判斷它是否是高度平衡的二叉樹。 本題中,一棵高度平衡二叉樹定義為&am…

【不可不知的考研復試秘籍 1】

----------------------------------------------------------------------------------------------------- 考研復試科研背景提升班 教你快速深入了解掌握考研復試面試中的常見問題以及注意事項,系統的教你如何在短期內快速提升自己的專業知識水平和編程以及英語…

windows下安裝cnpm

cnpm是淘寶團隊開發的一個針對中國用戶的npm鏡像源,它是npm的一個定制版本。由于國外的npm源在國內訪問速度較慢,所以cnpm鏡像源可以提供更快的下載速度。cnpm的使用方式與npm基本相同,只需將npm替換為cnpm即可。 要想使用cnpm等先安裝node.…

反序列化逃逸 [安洵杯 2019]easy_serialize_php1

打開題目 題目源碼&#xff1a; <?php$function $_GET[f];function filter($img){$filter_arr array(php,flag,php5,php4,fl1g);$filter /.implode(|,$filter_arr)./i;return preg_replace($filter,,$img); }if($_SESSION){unset($_SESSION); }$_SESSION["user&qu…

每日一題 KY148還是暢通工程

某省調查鄉村交通狀況&#xff0c;得到的統計表中列出了任意兩村莊間的距離。省政府“暢通工程”的目標是使全省任何兩個村莊間都可以實現公路交通&#xff08;但不一定有直接的公路相連&#xff0c;只要能間接通過公路可達即可&#xff09;&#xff0c;并要求鋪設的公路總長度…

PostgreSQL對已有表增加自增序列

對已有表增加自增序列&#xff1a; 1、在PostgreSQL當中&#xff0c;我們要實現對已有表的ID字段自增。 首先需創建一個關聯序列&#xff0c;以下sql語句是創建一個序列&#xff1a; CREATE SEQUENCE menu_id_seq START 6000001; 序列名稱是menu_id_seq&#xff0c;起始…

sizeof 和 strlen的區別

sizeof sizeof是單目操作符,sizeof計算變量所棧內存空間大小,單位是字節,如果操作數是類型的話,會計算類型所占大小,sizeof指在乎占用內存空間大小不在乎內容是什么. int main() {int a 0;printf("%zd\n", sizeof(a));printf("%zd\n", sizeof a );printf…

巧【二叉搜索樹的最近公共祖先】【二叉搜索樹的性質】Leetcode 235. 二叉搜索樹的最近公共祖先

【二叉搜索樹的最近公共祖先】【二叉搜索樹性質】Leetcode 235. 二叉搜索樹的最近公共祖先 【巧】解法1 利用二叉搜索樹有序的性質解法2 采用二叉樹求最近公共祖先的方法——后序遍歷 ---------------&#x1f388;&#x1f388;235. 二叉搜索樹的最近公共祖先 題目鏈接&#x…

huggingface上傳或發布自己的模型(大語言模型LLM)

創建huggingface賬號和token 在https://huggingface.co/join注冊huggingface賬號&#xff0c;登錄賬號后&#xff0c;在https://huggingface.co/settings/tokens創建token&#xff0c;注意需要將token的類型設置為WRITE。 安裝必要軟件包和初始化環境 安裝git lfs curl -s …

Springboot+vue的制造裝備物聯及生產管理ERP系統(有報告)。Javaee項目,springboot vue前后端分離項目。

演示視頻&#xff1a; Springbootvue的制造裝備物聯及生產管理ERP系統&#xff08;有報告&#xff09;。Javaee項目&#xff0c;springboot vue前后端分離項 項目介紹&#xff1a; 本文設計了一個基于Springbootvue的制造裝備物聯及生產管理ERP系統&#xff0c;采用M&#xff…

WebSocket協議及其在實時通信中的重要性

本文深入介紹了WebSocket協議及其在實時通信中的重要性。從HTTP的限制到WebSocket的優勢&#xff0c;再到連接建立和實際應用&#xff0c;全面闡述了WebSocket的工作原理及其在實際業務中的應用場景。 一、引言 在生產中&#xff0c;有時需要服務端向客戶端發送消息&#xff0…