自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Nginx 如何處理請求?這篇文章幫你講透!

開發(fā) 服務(wù)器
這篇文章,我們將從原理、代碼以及示例來深入分析 Nginx如何處理請求,從而我們可以更好地理解和優(yōu)化我們的Nginx服務(wù)器配置。

Nginx(Engine X)是一個高性能的HTTP和反向代理服務(wù)器,它以其高并發(fā)、高性能和低資源消耗著稱。這篇文章,我們將從原理、代碼以及示例來深入分析 Nginx如何處理請求。

一、Nginx請求處理原理

Nginx請求處理的原理主要涉及以下 6個核心技術(shù)點:

  • 事件驅(qū)動模型
  • 異步非阻塞處理
  • 進程模型
  • 模塊化設(shè)計
  • 負載均衡和反向代理
  • 配置文件解析

接下來我們將一一分析它們:

1. 事件驅(qū)動模型

Nginx的事件驅(qū)動模型基于非阻塞 I/O 和事件循環(huán)。它使用多路復(fù)用技術(shù)(如 epoll、kqueue 等)來監(jiān)控多個連接,并在事件發(fā)生時調(diào)用相應(yīng)的處理器。

(1) 多路復(fù)用技術(shù)

多路復(fù)用技術(shù)是事件驅(qū)動模型的關(guān)鍵。Nginx 支持多種多路復(fù)用機制,包括:

  • epoll:Linux 平臺上的高效多路復(fù)用機制,適用于大量并發(fā)連接。
  • kqueue:FreeBSD、OpenBSD、macOS 等平臺的多路復(fù)用機制。
  • select 和 poll:較早期的多路復(fù)用機制,適用于較少的并發(fā)連接。

Nginx 會根據(jù)操作系統(tǒng)的不同自動選擇最優(yōu)的多路復(fù)用機制。

(2) 事件循環(huán)

在 Nginx 中,事件循環(huán)主要負責監(jiān)控和處理網(wǎng)絡(luò)事件。其基本流程如下:

  • 初始化:初始化事件模塊,配置事件處理機制(如 epoll)。
  • 事件監(jiān)聽:監(jiān)聽客戶端連接請求、數(shù)據(jù)可讀可寫等事件。
  • 事件檢測:通過多路復(fù)用機制檢測事件的發(fā)生。
  • 事件分發(fā):將檢測到的事件分發(fā)給對應(yīng)的事件處理器。
  • 事件處理:調(diào)用回調(diào)函數(shù)來處理具體的事件,如讀取請求、發(fā)送響應(yīng)等。

(3) 事件處理

Nginx 的事件處理是通過一系列的回調(diào)函數(shù)來實現(xiàn)的,這些回調(diào)函數(shù)在不同的事件階段被調(diào)用,包括:

  • 連接建立:處理新連接的建立。
  • 請求讀取:從客戶端讀取請求數(shù)據(jù)。
  • 響應(yīng)發(fā)送:向客戶端發(fā)送響應(yīng)數(shù)據(jù)。
  • 連接關(guān)閉:處理連接的關(guān)閉。

(4) Worker 進程

Nginx 使用多進程架構(gòu),其中每個 Worker 進程都是一個獨立的事件驅(qū)動服務(wù)器。Master 進程負責管理 Worker 進程,而 Worker 進程則負責處理客戶端請求。每個 Worker 進程都有自己的事件循環(huán),能夠獨立處理并發(fā)連接。

2. 異步非阻塞處理

異步非阻塞意味著 Nginx在處理一個請求時,可以進行 I/O操作而不被阻塞,當請求發(fā)起后,處理過程中的任何耗時操作(如磁盤I/O,網(wǎng)絡(luò)I/O)都不會阻塞整個處理。Nginx通過將這些操作放在異步事件中等待完成,釋放工作進程來處理其他可用事件。

3. 進程模型

Nginx 采用了 Master-Worker 多進程架構(gòu),其中包含一個主進程(Master Process)和一個或多個工作進程(Worker Processes)。這種架構(gòu)的設(shè)計可以確保責任分離,以便更好地管理系統(tǒng)資源、并發(fā)請求處理與故障恢復(fù)。

(1) Master進程

職責:

  • Master進程的主要職責是管理和控制工作進程。
  • 接收和處理來自外部(如管理員)的請求,例如配置重載、啟動或關(guān)閉 Nginx。
  • 在啟動時讀取和解析配置文件,初始化各種全局變量和資源。

主要功能:

  • 啟動和終止 Worker 進程:Master 進程負責分批啟動工作進程,并根據(jù)需要重啟或終止工作進程。
  • 管理信號:監(jiān)聽和處理系統(tǒng)信號(如 SIGHUP 用于重載配置,SIGTERM 用于關(guān)閉服務(wù)器等)。
  • 平滑升級:做出配置更改或執(zhí)行 Nginx 版本升級時,可以通過不間斷地重新啟動工作進程實現(xiàn)平滑升級。

(2) Worker進程

職責:

  • 處理客戶端請求的所有工作。所有實際的網(wǎng)絡(luò)事件處理都在工作進程中進行,包括接受連接、讀取請求、處理請求、發(fā)送響應(yīng),等等。
  • 每個 Worker 進程都是相互獨立的,同時可以處理獨立的連接。

主要特性和功能:

  • 無共享狀態(tài):每個 Worker 內(nèi)存相互獨立,這樣可以避免在編程中可能出現(xiàn)的很多鎖問題,提高并行處理效率。
  • 事件驅(qū)動和非阻塞 I/O:Worker 進程使用非阻塞 I/O 和事件驅(qū)動機制(如 epoll、kqueue 等)來處理請求,這使得在同一時間可以處理大量的并發(fā)請求。
  • 進程模型的競爭連接機制:所有 Worker 進程均平等地收到請求連接,具體哪個進程處理新連接由端口復(fù)用技術(shù)和操作系統(tǒng)決定。

(3) 進程之間的通信

① Nginx 的 Master 和 Worker 進程之間使用 UNIX 信號進行簡單而有效的通信,Master 進程對信號的響應(yīng)可以帶來整體行為的變化。例如:

SIGHUP:重新加載配置,此時 Master進程會完成以下幾件事:

  • 檢查語法錯誤后生成新配置。
  • 啟動新的 Worker 進程。
  • 逐漸關(guān)閉舊的 Worker 進程,以便不會中斷現(xiàn)有連接。

② SIGTERM/SIGQUIT:優(yōu)雅地關(guān)閉 Nginx 服務(wù)器。此時,Master 進程會通知 Worker 進程在所有當前請求完成后關(guān)閉。

③ SIGUSR1:重新打開日志文件,通常用于日志切換。

4. 模塊化設(shè)計

Nginx以模塊化的方式設(shè)計,通過不同類型的模塊(如HTTP模塊、事件模塊、Mail模塊等)來完成不同功能。每種模塊提供了處理請求的特定功能,組合在一起完成完整的HTTP服務(wù)。

5. 負載均衡和反向代理

Nginx可以配置為反向代理,在處理請求時直接轉(zhuǎn)發(fā)到后端服務(wù)器。它可以實現(xiàn)負載均衡,根據(jù)設(shè)定的策略(如輪詢、最少連接)來分配請求。

6. 配置文件解析

Nginx通過配置文件執(zhí)行請求的處理定義。配置文件指定服務(wù)器塊、位置塊和其他配置指令,用以指示Nginx如何響應(yīng)不同的HTTP請求。

二、代碼分析

Nginx的代碼是用C語言編寫的,下面我們分析一些關(guān)鍵的代碼片段來了解其工作原理。

1. 啟動流程

Nginx的啟動從main函數(shù)開始,在src/core/nginx.c文件中:

int main(int argc, char *const *argv) {
    ngx_log_t         *log;
    ngx_cycle_t       *cycle, init_cycle;
    ngx_core_conf_t   *ccf;
    ngx_conf_t        cf;
    
    // 初始化日志、信號處理等
    ngx_log_error(NGX_LOG_NOTICE, log, 0, "nginx version: " NGINX_VERSION);
    
    // 獲取命令行參數(shù)
    process_args(argc, argv, &init_cycle);
    
    // 初始化周期
    cycle = ngx_init_cycle(&init_cycle);
    
    // 循環(huán)處理到來的請求
    ngx_process_events_and_timers(cycle);
    
    return 0;
}

ngx_init_cycle是初始化Nginx周期的函數(shù),其中包括配置文件的加載和解析。

2. 事件循環(huán)

核心的事件循環(huán)位于ngx_process_events_and_timers函數(shù)中:

void ngx_process_events_and_timers(ngx_cycle_t *cycle) {
    ngx_msec_t  timer, delta;
    ngx_uint_t  i;
    
    for (;;) {
        // 獲取即將觸發(fā)的事件和時間
        timer = ngx_event_find_timer();
        
        if (timer == NGX_TIMER_INFINITE) {
            timer = (ngx_msec_t) NGX_TIMER_INFINITE_VALUE;
        }
        
        // 等待事件到來
        (void) ngx_process_events(cycle, timer, 0);
        
        // 調(diào)用定時器事件
        ngx_event_expire_timers();
        
        // 處理延遲文件事件
        ngx_handle_delayed_events(cycle);
    }
}

在這個循環(huán)中,Nginx持續(xù)地等待事件的發(fā)生,然后根據(jù)事件的類型執(zhí)行相應(yīng)的操作。

3. 請求處理

實際的HTTP請求處理則是在ngx_http_process_request中完成:

void ngx_http_process_request(ngx_http_request_t *r) {
    ngx_connection_t       *c;
    ngx_http_core_main_conf_t  *cmcf;
    
    c = r->connection;
    
    // 處理的階段分為不同的handler
    cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
    
    // Match the location
    ngx_http_core_find_config_phase(r);
    
    // Perform access checks
    if (ngx_http_process_request_uri(r) != NGX_OK) {
        return;
    }
    
    // Execute input body filters
    if (ngx_http_read_client_request_body(r, ngx_http_request_body_handler) >= NGX_HTTP_SPECIAL_RESPONSE) {
        return;
    }
    
    // Call content handler
    ngx_http_core_content_phase(r);
}

在這個函數(shù)里,Nginx逐一執(zhí)行請求生命周期中的各個階段,包括URI解析,權(quán)限檢查,讀取請求體,以及最終的內(nèi)容處理。

三、示例配置

為了更好地理解 Nginx如何處理請求,在這里,我們通過一個簡單的靜態(tài)網(wǎng)頁服務(wù)器的配置例子來說明:

worker_processes  1;

events {
    worker_connections 1024;
}

http {
    server {
        listen 80;
        server_name localhost;
        
        location / {
            root /var/www/html;
            index index.html index.htm;
        }
    }
}

配置分析:

  • worker_processes 1;:指定Nginx使用一個worker進程。
  • worker_connections 1024;:每個worker進程最多支持1024個并發(fā)連接。
  • http {}:開始一個HTTP配置上下文。
  • server {}:定義一個虛擬服務(wù)器。
  • listen 80;:服務(wù)器監(jiān)聽80端口。
  • server_name localhost;:指定服務(wù)器名。
  • location / {}:定義根目錄的請求處理位置。
  • root /var/www/html;:將所有對根目錄的請求映射到文件系統(tǒng)的/var/www/html目錄。
  • index index.html index.htm;:指定默認的首頁文件。

四、總結(jié)

Nginx是一款優(yōu)秀的反向代理框架,它的設(shè)計和實現(xiàn)牢牢把握住了高性能和高并發(fā)的目標,通過事件驅(qū)動模型、異步處理、多進程架構(gòu)以及豐富的模塊系統(tǒng),Nginx不僅可以高效地處理HTTP請求,還可以通過模塊化的配置系統(tǒng)進行極為靈活的部署和定制。通過深入Nginx的代碼和運行原理,我們可以更好地理解和優(yōu)化我們的Nginx服務(wù)器配置。

責任編輯:趙寧寧 來源: 猿java
相關(guān)推薦

2022-02-22 11:17:31

Kafka架構(gòu)代碼

2022-04-14 10:10:59

Nginx開源Linux

2021-09-30 09:59:23

OSPF網(wǎng)絡(luò)協(xié)議網(wǎng)絡(luò)技術(shù)

2018-10-21 15:36:13

UI適配iOS

2020-11-06 08:36:04

UI設(shè)計規(guī)范iOS

2018-04-13 16:24:59

區(qū)塊鏈數(shù)據(jù)庫去中心化

2019-10-31 10:08:15

Synchronize面試線程

2019-10-31 09:48:53

MySQL數(shù)據(jù)庫事務(wù)

2020-07-09 10:21:03

網(wǎng)絡(luò)排錯TCPIP

2017-03-30 22:41:55

虛擬化操作系統(tǒng)軟件

2018-09-05 09:32:42

高性能網(wǎng)絡(luò)模型

2010-05-17 10:04:45

2022-08-03 08:41:30

客戶端操作并發(fā)請求

2017-12-12 12:53:09

2021-07-13 12:21:34

PythonRPC通信

2017-03-10 21:04:04

Android適配

2023-04-06 11:10:31

閉包JavaScript

2020-09-18 10:18:08

MySQL數(shù)據(jù)插入數(shù)據(jù)庫

2017-03-07 15:35:26

Android適配 界面

2021-11-10 07:47:48

Traefik邊緣網(wǎng)關(guān)
點贊
收藏

51CTO技術(shù)棧公眾號