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

Nginx處理Web請求機(jī)制的方法詳解

 更新時間:2025年04月01日 10:54:05   作者:裁二尺秋風(fēng)  
這篇文章主要介紹了Nginx處理Web請求機(jī)制的方法,通過對worker搶占機(jī)制、傳統(tǒng)服務(wù)器事件處理機(jī)制以及Nginx事件處理機(jī)制的對比,詳細(xì)解析Nginx在處理web請求機(jī)制時的邏輯,需要的朋友可以參考下

一、Nginx請求默認(rèn)頁面資源

1、配置文件詳解

修改端口號為8080并重啟服務(wù):

二、Nginx進(jìn)程模型

1、nginx常用命令解析

master進(jìn)程:主進(jìn)程(只有一個)

worker進(jìn)程:工作進(jìn)程(可以有多個,默認(rèn)只有一個進(jìn)程)

生命周期的原理:

信號: (操作人在執(zhí)行以下指令操作的時候,master會轉(zhuǎn)遞給worker相關(guān)的信息讓worker去進(jìn)行相關(guān)的操作)

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

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

2、修改worker的進(jìn)程數(shù)

三、Worker搶占機(jī)制

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

四、傳統(tǒng)服務(wù)事件處理

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

五、Nginx時間處理

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

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

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

1. select 模型

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

nginx

events {
    use select;
    worker_connections 1024;
}

2. poll 模型

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

nginx

events {
    use poll;
    worker_connections 2048;
}

3. epoll 模型

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

nginx

events {
    use epoll;
    worker_connections 65535;
}

4. kqueue 模型

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

nginx

events {
    use kqueue;
    worker_connections 65535;
}

5. rtsig 模型

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

nginx

events {
    use rtsig;
    worker_connections 1024;
}

6. /dev/poll 模型

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

nginx

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

自動選擇模型

如果不指定 use 指令,Nginx 會根據(jù)操作系統(tǒng)自動選擇最合適的事件模型。例如,在 Linux 系統(tǒng)上會優(yōu)先選擇 epoll 模型,在 FreeBSD 系統(tǒng)上會優(yōu)先選擇 kqueue 模型。示例如下:

nginx

events {
    worker_connections 65535;
}

在實(shí)際應(yīng)用中,建議根據(jù)服務(wù)器的操作系統(tǒng)和具體的業(yè)務(wù)場景選擇合適的事件模型,以提高 Nginx 的性能和穩(wěn)定性。

(二)nginx默認(rèn)的模型是epoll 

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

基本概念

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

工作原理

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

  • 創(chuàng)建 epoll 實(shí)例:使用 epoll_create 或 epoll_create1 函數(shù)創(chuàng)建一個 epoll 實(shí)例,它會返回一個文件描述符,后續(xù)的操作都基于這個描述符進(jìn)行。
  • 注冊事件:使用 epoll_ctl 函數(shù)向 epoll 實(shí)例中添加、修改或刪除需要監(jiān)控的文件描述符以及對應(yīng)的事件。例如,可以監(jiān)控文件描述符的可讀、可寫等事件。
  • 等待事件發(fā)生:使用 epoll_wait 函數(shù)等待事件的發(fā)生。當(dāng)有事件發(fā)生時,該函數(shù)會返回有事件發(fā)生的文件描述符列表,程序可以對這些文件描述符進(jìn)行相應(yīng)的處理。

代碼示例

以下是一個簡單的使用 epoll 實(shí)現(xiàn)的 TCP 服務(wù)器示例代碼:

#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 1024
 
int main() {
    int listen_fd, epoll_fd;
    struct sockaddr_in server_addr;
    struct epoll_event ev, events[MAX_EVENTS];
 
    // 創(chuàng)建監(jiān)聽套接字
    listen_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (listen_fd == -1) {
        perror("socket");
        return 1;
    }
 
    // 初始化服務(wù)器地址
    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;
    }
 
    // 監(jiān)聽連接
    if (listen(listen_fd, SOMAXCONN) == -1) {
        perror("listen");
        close(listen_fd);
        return 1;
    }
 
    // 創(chuàng)建 epoll 實(shí)例
    epoll_fd = epoll_create1(0);
    if (epoll_fd == -1) {
        perror("epoll_create1");
        close(listen_fd);
        return 1;
    }
 
    // 將監(jiān)聽套接字添加到 epoll 實(shí)例中
    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 實(shí)例中
                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 {
                // 處理客戶端數(shù)據(jù)
                char buf[BUF_SIZE];
                ssize_t n = read(events[i].data.fd, buf, BUF_SIZE);
                if (n <= 0) {
                    // 客戶端關(guān)閉連接
                    close(events[i].data.fd);
                    epoll_ctl(epoll_fd, EPOLL_CTL_DEL, events[i].data.fd, NULL);
                } else {
                    // 回顯數(shù)據(jù)給客戶端
                    write(events[i].data.fd, buf, n);
                }
            }
        }
    }
 
    // 關(guān)閉監(jiān)聽套接字和 epoll 實(shí)例
    close(listen_fd);
    close(epoll_fd);
 
    return 0;
}

優(yōu)點(diǎn)

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

缺點(diǎn)

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

 注:worker的進(jìn)程要根據(jù)CPU實(shí)際情況來定不是越高越高,如果太高會造成請求訪問卡頓。影響業(yè)務(wù)的正常運(yùn)行。

epoll的配置

events {
    #默認(rèn)使用epoll
    use epoll;
    #每個worker允許的客端最大連接數(shù)
    worker_connections  1024;
}
 

以上就是Nginx處理Web請求機(jī)制的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Nginx處理Web請求機(jī)制的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 關(guān)于多級緩存使用(nginx本地緩存、JVM進(jìn)程緩存、redis緩存)

    關(guān)于多級緩存使用(nginx本地緩存、JVM進(jìn)程緩存、redis緩存)

    這篇文章主要介紹了關(guān)于多級緩存使用(nginx本地緩存、JVM進(jìn)程緩存、redis緩存),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Nginx動靜分離的示例代碼

    Nginx動靜分離的示例代碼

    動靜分離是將網(wǎng)站靜態(tài)資源與后臺應(yīng)用分開部署,本文主要介紹了Nginx動靜分離的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • Nginx服務(wù)啟動和停止實(shí)現(xiàn)

    Nginx服務(wù)啟動和停止實(shí)現(xiàn)

    使用Nginx的過程中,我們可能總是需要修改nginx配置文件,然后不停地啟動或者停止nginx服務(wù),本文就來介紹一下,感興趣的可以了解一下
    2023-11-11
  • 在Nginx用htpasswd對網(wǎng)站進(jìn)行密碼保護(hù)的設(shè)置方法

    在Nginx用htpasswd對網(wǎng)站進(jìn)行密碼保護(hù)的設(shè)置方法

    很多時候我們需要對一些網(wǎng)站進(jìn)行密碼保護(hù),比如團(tuán)隊(duì)內(nèi)部的站點(diǎn)、demo站點(diǎn)等等。這里所說的密碼保護(hù)是服務(wù)器級的,并非網(wǎng)站應(yīng)用層的注冊登錄那一套,而是利用服務(wù)器配置和htpasswd文件來實(shí)現(xiàn)訪問的密碼驗(yàn)證
    2013-06-06
  • nginx配置多域名共用服務(wù)器80端口

    nginx配置多域名共用服務(wù)器80端口

    本文主要介紹了配置Nginx.conf文件,使得同一臺服務(wù)器上的服務(wù)程序能夠根據(jù)域名分發(fā)到相應(yīng)的端口進(jìn)行處理,從而實(shí)現(xiàn)用戶通過abc.com或xyz.com直接訪問到不同“網(wǎng)站”,感興趣的可以了解一下
    2025-03-03
  • 當(dāng) Nginx 出現(xiàn) 504 錯誤的完美解決方法

    當(dāng) Nginx 出現(xiàn) 504 錯誤的完美解決方法

    Nginx是一款流行的Web服務(wù)器和反向代理服務(wù)器,但有時會遇到504網(wǎng)關(guān)超時錯誤,這種錯誤通常是由后端服務(wù)器響應(yīng)緩慢、Nginx配置不當(dāng)或網(wǎng)絡(luò)問題導(dǎo)致的,下面給大家分享Nginx 出現(xiàn) 504 錯誤的完美解決方法,一起看看吧
    2024-09-09
  • Nginx反向代理及負(fù)載均衡如何實(shí)現(xiàn)(基于linux)

    Nginx反向代理及負(fù)載均衡如何實(shí)現(xiàn)(基于linux)

    這篇文章主要介紹了Nginx反向代理及負(fù)載均衡如何實(shí)現(xiàn)(基于linux),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • nginx結(jié)合openssl實(shí)現(xiàn)https的方法

    nginx結(jié)合openssl實(shí)現(xiàn)https的方法

    這篇文章主要介紹了基于nginx結(jié)合openssl實(shí)現(xiàn)https的方法,準(zhǔn)備工作大家需要安裝nginx服務(wù),具體操作過程跟隨小編一起看看吧
    2021-07-07
  • nginx里集成php模塊安裝配置步驟詳解

    nginx里集成php模塊安裝配置步驟詳解

    這篇文章主要為大家介紹了nginx里集成php模塊安裝配置步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Nginx的URL重寫及IP訪問控制詳解

    Nginx的URL重寫及IP訪問控制詳解

    Nginx 是一個高性能的 HTTP 服務(wù)器和反向代理服務(wù)器,廣泛應(yīng)用于 Web 服務(wù)中,除了基本的 HTTP 服務(wù)功能外, Nginx 還提供了許多強(qiáng)大的功能,如 URL 重寫、 IP 訪問控制和基本認(rèn)證,本文小編給大家詳細(xì)介紹了Nginx的URL重寫及IP訪問控制,需要的朋友可以參考下
    2025-05-05

最新評論

东乡族自治县| 凤台县| 平度市| 南陵县| 扬州市| 红河县| 敖汉旗| 田阳县| 错那县| 德钦县| SHOW| 龙江县| 铜鼓县| 灵寿县| 武义县| 宝山区| 明水县| 榆社县| 东乌| 晋宁县| 平阴县| 厦门市| 库车县| 京山县| 通化市| 富源县| 高碑店市| 高雄县| 汨罗市| 红河县| 渭南市| 富川| 通化市| 忻州市| 武平县| 江油市| 青冈县| 龙胜| 贡嘎县| 阆中市| 怀化市|