Nginx — Nginx處理Web請求機制解析

一、Nginx請求默認頁面資源

1、配置文件詳解

?

?修改端口號為8080并重啟服務:

二、Nginx進程模型

1、nginx常用命令解析

master進程:主進程(只有一個)

worker進程:工作進程(可以有多個,默認只有一個進程)

生命周期的原理:

信號: (操作人在執行以下指令操作的時候,master會轉遞給worker相關的信息讓worker去進行相關的操作)

./nginx                  #開啟nginx服務。
./nginx -s stop          #暴力的關閉,如果后端有用戶在連接如果用此命令會導致連接全部中斷,如果發現有惡意攻擊和黑客入侵的情況下可以用此命令。
./nginx -s stop          #重新加載配置文件信息。
./nginx -s quit          #優雅的關閉,如果后端有用戶在連接會等待連接完成之后再去關閉,同時不會讓新的請求訪問進來(只針對http請求如果不是http請求時不行的)。
./nginx -t               #檢測配置文件的語法是否正確。
./nginx -v               #查看當前的配置信息。
./nginx -V               #顯示詳細信息,包括了nginx的版本、gcc版本、configure編譯路徑等。
./nginx -c               #代表手動切換nginx的配置文件。
./nginx -h & ./nginx -h  #顯示nginx的幫助命令。

?

?

每個worker之間相對獨立,如果某個worker收到黑客的攻擊,那么運維人員只需要關閉相關的worker進程,如果某個worker進程不存在只需要master重新fork以下即可。

?2、修改worker的進程數

?

三、Worker搶占機制

當client發起了請求之后client和worker之間會有一個護事鎖(accept_mutex)服務端的眾多worker會去搶這個鎖,哪個worker搶到就由哪個worker來進行處理。

?

?

四、傳統服務事件處理

假設一個client在進行請求的時候由worker1來進行處理,在處理的過程中用時比較長而且卡住了,客戶端的請求就會被阻塞,假設在阻塞的過程中又有新的請求進來(假設client2、client3也同時連接到worker)要去處理。只有阻塞的請求處理完畢才回去處理client2、client3,所以master會去fork一個新worker進程。(在告并發情況下,這樣的消耗會很大而且占用的資源會比較多)。

?

?

五、Nginx時間處理

假設一個client在進行請求的時候由worker1來進行處理,在處理的過程中用時比較長而且卡住了。對于Nginx而言是異步非阻塞的,如果發生阻塞同時又有新的請求進來那么worker會去處理下一個請求。用到的模型為epoll,(如果用到epoll那么一個worker進程可以處理6~8w的請求量,并且不會產生很多的開銷),那么需要越高的并發量只需要增加服務器的配置就可以了(有錢解決)。

(一)Nginx的events模塊支持的多種事件模型支持的模型

Nginx 的?events?模塊主要用于配置 Nginx 如何處理連接,它提供了多種事件模型,以適應不同的操作系統和應用場景。下面為你詳細介紹 Nginx 支持的主要事件模型:

1.?select?模型

  • 原理select?是一種較為傳統的事件驅動模型,它通過對文件描述符集合進行輪詢,檢查是否有文件描述符處于可讀、可寫或異常狀態。當有事件發生時,select?函數會返回發生事件的文件描述符數量,然后程序需要遍歷文件描述符集合來確定具體是哪些文件描述符發生了事件。
  • 適用場景:適用于連接數較少的場景,因為?select?模型在處理大量連接時,輪詢操作會帶來較高的 CPU 開銷,性能會顯著下降。同時,select?模型對文件描述符數量有限制,通常最大為 1024。
  • 配置示例
?

nginx

events {use select;worker_connections 1024;
}

2.?poll?模型

  • 原理poll?是對?select?模型的改進,它同樣采用輪詢的方式檢查文件描述符的狀態,但?poll?沒有文件描述符數量的限制。poll?使用一個結構體數組來存儲文件描述符和對應的事件,避免了?select?對文件描述符數量的硬限制。
  • 適用場景:適用于連接數相對較多,但仍然不是非常大的場景。相比于?selectpoll?在處理大量連接時性能有所提升,但在處理超大量連接時,輪詢操作仍然會帶來較高的 CPU 開銷。
  • 配置示例
?

nginx

events {use poll;worker_connections 2048;
}

3.?epoll?模型

  • 原理epoll?是 Linux 內核為處理大批量文件描述符而作了改進的?poll,是 Linux 下多路復用 IO 接口?select/poll?的增強版本。它采用事件驅動的方式,只關注那些有事件發生的文件描述符,避免了對所有文件描述符的輪詢,從而提高了效率。epoll?使用內核和用戶空間共享內存的方式,減少了數據的拷貝次數。
  • 適用場景:適用于 Linux 系統下處理大量并發連接的場景,是 Nginx 在 Linux 系統上的首選事件模型。
  • 配置示例
?

nginx

events {use epoll;worker_connections 65535;
}

4.?kqueue?模型

  • 原理kqueue?是 FreeBSD 系統上的一種高效事件通知機制,類似于 Linux 下的?epoll。它采用事件隊列的方式,當有事件發生時,會將事件添加到隊列中,程序可以從隊列中獲取發生事件的文件描述符。
  • 適用場景:適用于 FreeBSD 系統,在處理大量并發連接時性能較好。
  • 配置示例
?

nginx

events {use kqueue;worker_connections 65535;
}

5.?rtsig?模型

  • 原理rtsig?是基于實時信號實現的事件模型,它通過發送實時信號來通知程序有事件發生。
  • 適用場景:該模型在實際應用中使用較少,因為實時信號的處理有一些限制,并且性能不如?epoll?和?kqueue?等模型。
  • 配置示例
?

nginx

events {use rtsig;worker_connections 1024;
}

6.?/dev/poll?模型

  • 原理/dev/poll?是 Solaris 系統上的一種事件通知機制,它通過讀取?/dev/poll?設備文件來獲取事件信息。
  • 適用場景:適用于 Solaris 系統,在該系統上可以提供較好的性能。
  • 配置示例
?

nginx

events {use /dev/poll;worker_connections 65535;
}

自動選擇模型

如果不指定?use?指令,Nginx 會根據操作系統自動選擇最合適的事件模型。例如,在 Linux 系統上會優先選擇?epoll?模型,在 FreeBSD 系統上會優先選擇?kqueue?模型。示例如下:

?

nginx

events {worker_connections 65535;
}
?

在實際應用中,建議根據服務器的操作系統和具體的業務場景選擇合適的事件模型,以提高 Nginx 的性能和穩定性。

(二)nginx默認的模型是epoll?

epoll?是 Linux 內核為處理大批量文件描述符而作了改進的?poll,是 Linux 下多路復用 IO 接口?select/poll?的增強版本,它能顯著提高程序在大量并發連接中只有少量活躍的情況下的系統 CPU 利用率。下面從幾個方面詳細介紹?epoll?模型:

基本概念

在網絡編程中,服務器需要處理多個客戶端的連接請求,傳統的方法(如?select?和?poll)在處理大量連接時性能會下降。epoll?則通過事件驅動的方式,只關注那些有事件發生的文件描述符,避免了對所有文件描述符的輪詢,從而提高了效率。

工作原理

epoll?的工作流程主要分為三個步驟:

?
  1. 創建?epoll?實例:使用?epoll_create?或?epoll_create1?函數創建一個?epoll?實例,它會返回一個文件描述符,后續的操作都基于這個描述符進行。
  2. 注冊事件:使用?epoll_ctl?函數向?epoll?實例中添加、修改或刪除需要監控的文件描述符以及對應的事件。例如,可以監控文件描述符的可讀、可寫等事件。
  3. 等待事件發生:使用?epoll_wait?函數等待事件的發生。當有事件發生時,該函數會返回有事件發生的文件描述符列表,程序可以對這些文件描述符進行相應的處理。

代碼示例

以下是一個簡單的使用?epoll?實現的 TCP 服務器示例代碼:

?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include <unistd.h>#define MAX_EVENTS 10
#define BUF_SIZE 1024int main() {int listen_fd, epoll_fd;struct sockaddr_in server_addr;struct epoll_event ev, events[MAX_EVENTS];// 創建監聽套接字listen_fd = socket(AF_INET, SOCK_STREAM, 0);if (listen_fd == -1) {perror("socket");return 1;}// 初始化服務器地址memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = INADDR_ANY;server_addr.sin_port = htons(8080);// 綁定地址if (bind(listen_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {perror("bind");close(listen_fd);return 1;}// 監聽連接if (listen(listen_fd, SOMAXCONN) == -1) {perror("listen");close(listen_fd);return 1;}// 創建 epoll 實例epoll_fd = epoll_create1(0);if (epoll_fd == -1) {perror("epoll_create1");close(listen_fd);return 1;}// 將監聽套接字添加到 epoll 實例中ev.events = EPOLLIN;ev.data.fd = listen_fd;if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, listen_fd, &ev) == -1) {perror("epoll_ctl: listen_fd");close(listen_fd);close(epoll_fd);return 1;}while (1) {int nfds = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);if (nfds == -1) {perror("epoll_wait");continue;}for (int i = 0; i < nfds; i++) {if (events[i].data.fd == listen_fd) {// 處理新的連接struct sockaddr_in client_addr;socklen_t client_addr_len = sizeof(client_addr);int conn_fd = accept(listen_fd, (struct sockaddr *)&client_addr, &client_addr_len);if (conn_fd == -1) {perror("accept");continue;}// 將新的連接添加到 epoll 實例中ev.events = EPOLLIN;ev.data.fd = conn_fd;if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, conn_fd, &ev) == -1) {perror("epoll_ctl: conn_fd");close(conn_fd);}} else {// 處理客戶端數據char buf[BUF_SIZE];ssize_t n = read(events[i].data.fd, buf, BUF_SIZE);if (n <= 0) {// 客戶端關閉連接close(events[i].data.fd);epoll_ctl(epoll_fd, EPOLL_CTL_DEL, events[i].data.fd, NULL);} else {// 回顯數據給客戶端write(events[i].data.fd, buf, n);}}}}// 關閉監聽套接字和 epoll 實例close(listen_fd);close(epoll_fd);return 0;
}

優點

  • 高效處理大量連接epoll?使用事件驅動機制,只關注有事件發生的文件描述符,避免了?select?和?poll?對所有文件描述符的輪詢,因此在處理大量并發連接時性能更優。
  • 內存拷貝優化epoll?使用內核和用戶空間共享內存的方式,減少了數據的拷貝次數,提高了效率。
  • 水平觸發和邊緣觸發模式epoll?支持水平觸發(LT)和邊緣觸發(ET)兩種模式,開發者可以根據具體需求選擇合適的模式。

缺點

  • 平臺依賴性epoll?是 Linux 特有的,在其他操作系統(如 Windows、macOS)上無法使用。
  • 實現復雜度較高:相比于?select?和?pollepoll?的使用和實現相對復雜,需要開發者對其原理有深入的理解。

?注:worker的進程要根據CPU實際情況來定不是越高越高,如果太高會造成請求訪問卡頓。影響業務的正常運行。

epoll的配置

events {#默認使用epolluse epoll;#每個worker允許的客端最大連接數worker_connections  1024;
}

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

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

相關文章

【C++標準IO庫】字符串流

目錄 一、字符串流概述 1.1 流的概念回顧 1.2 字符串流的定義和作用 二、istringstream 的使用 2.1 基本用法 2.2 常見應用場景 三、ostringstream 的使用 3.1 基本用法 3.2 常見應用場景 四、stringstream 的使用 4.1 基本用法 4.2 常見應用場景 五、字符串流的錯…

C語言pthread庫的線程休眠和喚醒的案例

一、代碼如下 #include<stdio.h> #include<pthread.h> // 定義獨占鎖 pthread_mutex_t mutex; // 定義條件信號對象 pthread_cond_t condition; // 初始化函數 void init(){ int code pthread_mutex_init(&mutex, NULL); printf("共享鎖初…

人臉照片比對 API 接口如何對接?

隨著數字化程度加深&#xff0c;身份驗證的重要性也日益凸顯&#xff0c;它成為保障個人信息安全、維護交易秩序的關鍵環節。人臉照片比對 API 接口作為連接人臉比對技術與各類應用的橋梁&#xff0c;正發揮著越來越重要的作用&#xff0c;成為眾多企業和開發者實現高效、安全身…

java學習筆記9——常用類

字符串相關的類&#xff1a; String 指向同一個地址可才相等 注意這個地方&#xff0c;兩個person對象的name實際上指向的是同一個字符串常量池&#xff08;Tom&#xff09; String常用方法 總結&#xff1a; 1.string類的理解(以JDK8為例說明) 1.1 類的聲明 public final cl…

Day 09

文章目錄 指針數組指針和函數技術名詞解釋技術細節課堂筆記 指針數組 #include<stdio.h> int main() {int a[3] {0,1,2};//指針數組&#xff0c;它是數組&#xff0c;每個元素都是指針int *p[3];p[0] &a[0];p[0] a;p[1] &a[1];p[1] a1;p[2] &a[2];p[…

Nginx — Nginx安裝證書模塊(配置HTTPS和TCPS)

一、安裝和編譯證書模塊 [rootmaster nginx]# wget https://nginx.org/download/nginx-1.25.3.tar.gz [rootmaster nginx]# tar -zxvf nginx-1.25.3.tar.gz [rootmaster nginx]# cd nginx-1.25.3 [rootmaster nginx]# ./configure --prefix/usr/local/nginx --with-http_stub_…

計算機網絡 用deepseek幫助整理的復習資料(一)

### 計算機網絡基礎知識整理 --- #### **一、網絡類型** 1. **局域網 (LAN)** - **定義**&#xff1a;覆蓋小范圍&#xff08;如家庭、教室、公司&#xff09;。 - **特點**&#xff1a;高帶寬、低延遲&#xff0c;設備通過交換機互聯。 - **示例**&#xff1…

Linux SCP傳輸文件免密配置

文章目錄 Linux SCP傳輸文件免密配置生成SSH密鑰對將公鑰復制到遠程服務器測試SSH連接使用SCP免密傳輸文件可選配置帶密碼的秘鑰連接處理使用 ssh-agent進行緩存管理&#xff08;該方式只能確保同一個回話中&#xff0c;多次傳輸只輸一次密碼&#xff09;使用 keychain&#xf…

數字電子技術基礎(三十六)——利用Multisim軟件實現3線-8線譯碼器

目錄 1 手動方式實現3線-8線譯碼器 2 使用字選擇器實現3線-8線譯碼器 現在嘗試利用Multisim軟件來實現3線-8線譯碼器。本實驗目的是驗證74LS138的基本功能&#xff0c;簡單來說就是“N中選1”。 實驗設計&#xff1a; &#xff08;1&#xff09;使能信號&#xff1a;時&am…

wait和notify : 避免線程餓死(以及votile內存可見性和指令重排序問題)

各位看官&#xff0c;大家早安午安晚安呀~~~ 如果您覺得這篇文章對您有幫助的話 歡迎您一鍵三連&#xff0c;小編盡全力做到更好 歡迎您分享給更多人哦 今天我們來學習&#xff1a;wait和notify : 避免線程餓死&#xff08;以及votile內存可見性和指令重排序問題&#xff09; …

HarmonyOS 介紹

HarmonyOS簡介 隨著萬物互聯時代的開啟&#xff0c;應用的設備底座將從幾十億手機擴展到數百億IoT設備。全新的全場景設備體驗&#xff0c;正深入改變消費者的使用習慣。 同時應用開發者也面臨設備底座從手機單設備到全場景多設備的轉變&#xff0c;全場景多設備的全新底座&am…

【視覺提示學習】3.28閱讀隨想

2109.01134 CoOp通過可學習的向量來建模提示的上下文詞匯&#xff0c;這些向量可以用隨機值或預訓練的詞嵌入進行初始化&#xff08;見圖2&#xff09;。我們提供了兩種實現方式&#xff0c;以處理不同性質的任務&#xff1a;一種是基于統一上下文&#xff08;unified context…

計算機求職面試中高頻出現的經典題目分類整理

以下為計算機求職面試中高頻出現的經典題目分類整理&#xff0c;涵蓋技術核心與深度考察方向&#xff0c;答案要點已附解析思路&#xff1a; 一、數據結構與算法 鏈表操作 題目&#xff1a;反轉鏈表&#xff08;迭代/遞歸實現&#xff09;考察點&#xff1a;指針操作、遞歸思維…

uniapp選擇文件使用formData格式提交數據

1. Vue實現 在vue項目中,我們有個文件,和一些其他字段數據需要提交的時候,我們都是使用axios 設置請求頭中的Content-Type: multipart/form-data,然后new FormData的方式來進行提交。方式如下: const sendRequest = () => {const formData = new FormData()formData…

BeanDefinition和Beanfactory實現一個簡單的bean容器

目錄 什么是 Springbean 容器 設計思路 圖解 參考文章 開源地址 BeanDefinition 類 BeanFactory 類 測試類 什么是 Springbean 容器 Spring 包含并管理應用對象的配置和生命周期&#xff0c;在這個意義上它是一種用于承載對象的容器&#xff0c;你可以配置你的每個 Bea…

AI Agent開發大全第十四課-零售智能導購智能體的RAG開發理論部分

開篇 經過前面的一些課程,我們手上已經積累了各種LLM的API調用、向量庫的建立和使用、embedding算法的意義和基本使用。 這已經為我們具備了開發一個基本的問答類RAG的開發必需要素了。下面我們會來講一個基本問答類場景的RAG,零售中的“智能導購”場景。 智能導購 大家先…

向字符串添加空格

給你一個下標從 0 開始的字符串 s &#xff0c;以及一個下標從 0 開始的整數數組 spaces 。 數組 spaces 描述原字符串中需要添加空格的下標。每個空格都應該插入到給定索引處的字符值 之前 。 例如&#xff0c;s "EnjoyYourCoffee" 且 spaces [5, 9] &#xff0…

百人會上的蔚小理與「來的剛剛好」的雷軍

這就是2025百人會上的蔚小理&#xff0c;努力的李斌、宣揚飛行汽車的何小鵬與大講開源的李想。那么小米汽車的模式是什么呢&#xff1f;站在蔚小理的肩上。 這就是2025百人會上的蔚小理&#xff0c;努力的李斌、宣揚飛行汽車的何小鵬與大講開源的李想。那么小米汽車的模式是什么…

解鎖Nginx路由器匹配規則

引言 Nginx 無疑是一款備受矚目的明星產品。它以其高性能、高可靠性以及出色的并發處理能力&#xff0c;在眾多 Web 服務器和反向代理服務器中脫穎而出 &#xff0c;廣泛應用于各類網站和應用程序中。據統計&#xff0c;超過 30% 的網站都在使用 Nginx 作為其 Web 服務器&…

傳統策略梯度方法的弊端與PPO的改進:穩定性與樣本效率的提升

為什么傳統策略梯度方法&#xff08;如REINFORCE算法&#xff09;在訓練過程中存在不穩定性和樣本效率低下的問題 1. 傳統策略梯度方法的基本公式 傳統策略梯度方法的目標是最大化累積獎勵的期望值。具體來說&#xff0c;優化目標可以表示為&#xff1a; max ? θ J ( θ )…