国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

NGINX源碼閱讀

wenshi11019 / 2465人閱讀

摘要:源碼閱讀前言源碼版本本文主要描述環境下的流程,與環境下類似,環境下可能會減少部分流程等類系統使用多進程方式運行,而使用多線程方式運行開頭的變量多為全局變量多為處理配置中相應模塊的配置處理,多為該模塊的核心通用處理邏輯架構進程工作模式多

NGINX源碼閱讀 前言

源碼版本:2018-10-02 nginx-1.15.5

本文主要描述Darwin環境下的流程,與Linux環境下類似,Win32環境下可能會減少部分流程

Darwin/Linux等*nix類系統使用多進程方式運行,而Win32使用多線程方式運行

ngx_ 開頭的變量多為全局變量

ngx_model_name.c 多為處理nginx配置中相應模塊的配置處理,ngx_model_name_core_module.c 多為該模塊的核心(通用)處理邏輯

nginx架構 進程工作模式 多進程

master進程

用于接收外部信號發送給worker進程,如stop、restart、reload等

監控worker進程運行狀態,worker異常退出后重新啟動新的worker進程

緩存管理

worker進程

處理基本網絡事件,如http、mail請求等

單進程
調試情況下使用,直接使用單進程處理網絡事件
配置

daemon

配置塊:main

值類型:flag

默認值:1

可選范圍:on、off

說明:是否使用守護進程模式開啟服務

master_process

配置塊:main

值類型:flag

默認值:1

可選范圍:on、off

說明:是否開啟master管理進程,主要用于nginx開發調試,關閉狀態下不會開啟accept互斥鎖

timer_resolution

配置塊:main

值類型:time

默認值:0

可選范圍:y、M、w、d、h、m、s、ms,解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]

說明:用于控制gettimeofday()的系統調用時機,未設置的情況下每次系統事件都將調用gettimeofday(),設置后將以該時間調用gettimeofday()

pid

配置塊:main

值類型:string

默認值:logs/nginx.pid(根據編譯時設置,未設置則為該值)

可選范圍:—

說明:用于設置主進程pid的存放路徑

lock_file

配置塊:main

值類型:string

默認值:logs/nginx.lock(根據編譯時設置,未設置則為該值)

可選范圍:—

說明:用于不支持原子操作的系統使用文件鎖作為accept互斥鎖,支持原子操作的系統將忽略該值

worker_processes

配置塊:main

值類型:unit|string(auto)

默認值:1

可選范圍:1-[32位:2147483647;64位:9223372036854775807;]

說明:設置worker進程數,建議使用auto由程序根據當前系統環境CPU核數設置(等于CPU核數,如果小于1則設置為1)

debug_points

配置塊:main

值類型:uint

默認值:0

可選范圍:1-[32位:2147483647;64位:9223372036854775807;]

說明:用于監測到內部錯誤時中止或停止進程以進行進一步的調試

user

配置塊:main

值類型:string

默認值:nobody [nobody]

可選范圍:-

說明:設置worker進程使用什么用戶和用戶組身份啟動

worker_priority

配置塊:main

值類型:int

默認值:0

可選范圍:-20-20

說明:設置worker進程的調度優先級,數值越小表示優先級越高

worker_cpu_affinity

配置塊:main

值類型:umask|string(auto)

默認值:—

可選范圍:—

說明:將工作進程綁定到CPU組用以減少CPU上下文切換,默認情況下不綁定,設置不存在的CPU掩碼將被忽略

worker_rlimit_nofile

配置塊:main

值類型:uint

默認值:—

可選范圍:—

說明:修改worker進程的最大文件描述符限制,用于在不重新啟動master進程的情況下修改限制

worker_rlimit_core

配置塊:main

值類型:uint

默認值:—

可選范圍:—

說明:修改worker進程的核心文件最大限制,用于在不重新啟動master進程的情況下修改限制

worker_shutdown_timeout

配置塊:main

值類型:time

默認值:0

可選范圍:y、M、w、d、h、m、s、ms,解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]

說明:設置worker進程的結束等待時間(收到結束信號后worker可能還有未處理完的請求,默認系統將等待所有請求處理完成后退出),設置該時間后worker將在到期時直接關閉所有持有的連接

working_directory

配置塊:main

值類型:string

默認值:—

可選范圍:—

說明:設置工作目錄

env

配置塊:main

值類型:string

默認值:TZ

可選范圍:—

說明:默認情況下程序在啟動時將移除除了時區外的所有環境變量,可用該參數設置需要的環境變量

load_module

配置塊:main

值類型:string

默認值:—

可選范圍:—

說明:用于加載動態模塊

啟動階段 master處理流程

日志初始化

初始化日志格式

打開日志文件獲取文件句柄(讀寫刪共享鎖)

SSL初始化

保存啟動參數

解析配置文件路徑

運行環境系統初始化

獲取cpu緩存塊大小(如果有一級CPU緩存則使用一級緩存大小)ngx_cacheline_size

獲取內存頁大小 ngx_pagesize

獲取CPU核數(如果小于一核則設置為1核)

壓縮表初始化

如果為繼承關系則繼承原socket信息

模塊預初始化(將所需加載的模塊信息加入全局變量,程序所需加載的模塊列表在程序編譯時根據配置輸出至ngx_modules全局變量中)

輪訓初始化

加載配置

加載模塊

創建共享內存

關閉無用socket和已打開文件

socket監聽及配置

如果是檢查配置文件錯誤則返回結果

如果有接收到nginx信號則轉發外部信號給worker進程(通過跨進程事件OpenEvent/SetEvent)

注冊信號處理器

守護進程模式下fork出子進程(當前進程結束),重定向子進程輸入、輸出至/dev/null(通過tup2)

創建pid文件

啟動worker進程循環

設置信號處理器(阻塞部分系統信號,接收到系統信號后轉由信號處理函數處理,避免master在處理事件過程中被系統直接kill。在循環管理狀態中通過sigsuspend進行阻塞等待信號,子進程退出會接收到CHLD信號)

啟動worker進程

檢查是否有模塊使用緩存服務如有則啟動緩存管理進程

進入循環管理狀態(處理nginx和系統信號,監控worker進程)

worker處理流程

初始化

設置進程執行優先級

設置進程可打開的最大文件描述符

如果以root身份啟動進程則根據nginx.conf配置設置進程運行的用戶、用戶組

如果有配置嘗試設置CPU親緣性(限定進程在某個特定的CPU中調度,減少CPU上下文切換,均衡CPU利用率)

解除阻塞系統信號

執行各模塊init_process

設置通道讀事件回調

循環處理事件及定時器

從定時事件紅黑樹中查找出最近需要執行的定時器時間

執行各模塊事件初始化

檢查當前worker是否繁忙(todo),不繁忙則嘗試獲取事件監聽鎖(避免驚群效應),如果獲取不到則退出本次處理,也可通過配置忽略鎖

等待I/O事件喚起(如果超時仍未接收到事件則),保存I/O事件相關信息,將讀寫事件放入隊列等待后續處理

處理accept事件中接收的post數據

釋放事件監聽鎖(允許其他worker繼續獲取監聽鎖處理事件)

處理時間到達的定時器

處理普通事件(非accept事件)中接收的post數據

循環處理master通知信號

ngx_exiting 檢查定時器中是否仍有未處理的事件,沒有則退出worker

ngx_terminate 直接退出worker

ngx_quit 關閉定時器、關閉socket監聽、關閉閑置連接

ngx_reopen rotate logs

緩存管理處理流程
備注:緩存分為manager和loader

設置進程類型為helper

關閉當前進程的socket監聽

重置當前進程的最大連接數為512

初始化

設置進程執行優先級

設置進程可打開的最大文件描述符

如果以root身份啟動進程則根據nginx.conf配置設置進程運行的用戶、用戶組

解除阻塞系統信號

執行各模塊init_process

設置通道讀事件回調

設置定時器

循環處理事件及定時器

從定時事件紅黑樹中查找出最近需要執行的定時器時間

執行各模塊事件初始化

檢查當前worker是否繁忙(todo),不繁忙則嘗試獲取事件監聽鎖(避免驚群效應),如果獲取不到則退出本次處理,也可通過配置忽略鎖

等待I/O事件喚起(如果超時仍未接收到事件則),保存I/O事件相關信息,將讀寫事件放入隊列等待后續處理

處理accept事件中接收的post數據

釋放事件監聽鎖(允許其他worker繼續獲取監聽鎖處理事件)

處理時間到達的定時器(manager目前ngx_http_file_cache_manager僅一個事件,主要用于清理過期的緩存文件;cache目前僅ngx_http_file_cache_loader一個事件,主要用于緩存數據到緩存文件和記錄最新訪問時間便于LRU)

處理普通事件(非accept事件)中接收的post數據

事件模塊 加載流程

ngx_init_cycle

create_conf

command->set

init_conf

init_module

ngx_event_process_init

init_event(actions.init)

init_process(init_thread)

add_event

事件喚起

process_events

event_handle

ngx_worker_process_exit

exit_process

ngx_master_process_exit

exit_master

主要函數解析

事件結構

static ngx_event_module_t  ngx_kqueue_module_ctx = {
    &kqueue_name,
    ngx_kqueue_create_conf,                /* create configuration */
    ngx_kqueue_init_conf,                  /* init configuration */

    {
        ngx_kqueue_add_event,              /* add an event */
        ngx_kqueue_del_event,              /* delete an event */
        ngx_kqueue_add_event,              /* enable an event */
        ngx_kqueue_del_event,              /* disable an event */
        NULL,                              /* add an connection */
        NULL,                              /* delete an connection */
#ifdef EVFILT_USER
        ngx_kqueue_notify,                 /* trigger a notify */
#else
        NULL,                              /* trigger a notify */
#endif
        ngx_kqueue_process_events,         /* process the events */
        ngx_kqueue_init,                   /* init the events */
        ngx_kqueue_done                    /* done the events */
    }

};

模塊結構

ngx_module_t  ngx_event_core_module = {
    NGX_MODULE_V1,
    &ngx_event_core_module_ctx,            /* module context */
    ngx_event_core_commands,               /* module directives */
    NGX_EVENT_MODULE,                      /* module type */
    NULL,                                  /* init master */
    ngx_event_module_init,                 /* init module */
    ngx_event_process_init,                /* init process */
    NULL,                                  /* init thread */
    NULL,                                  /* exit thread */
    NULL,                                  /* exit process */
    NULL,                                  /* exit master */
    NGX_MODULE_V1_PADDING
};

ngx_event_module_init

檢查進程允許打開的最大文件描述符

分配進程間共享內存(空間=ngx_accept_mutex+ngx_connection_counter+ngx_temp_number[+ngx_stat_accepted+ngx_stat_handled+ngx_stat_requests+ngx_stat_active+ngx_stat_reading+ngx_stat_writing+ngx_stat_waiting])

ngx_event_process_init

進程數設置大于1且配置開啟競爭鎖(默認禁用)則使用 accept 競爭鎖

ngx_posted_accept_events隊列、ngx_posted_events隊列、事件定時器、連接池 等資源初始化

event_init

移除舊cycle事件

添加監聽事件

ngx_event_core_create_conf

對配置參數進行初始化

ngx_event_core_init_conf

判斷當前使用的I/O事件(epoll、devpoll、kqueue、select)

對部分未設置值的參數默認值

ngx_event_accept

新增讀事件

從等待連接的socket隊列中獲取第一個連接請求(非阻塞)

如果連接尚未準備就緒則直接返回

如果當前進程可用最大文件描述符超過限制則刪除讀事件,標記當前進程暫時停止接收新請求

重新計算當前進程的忙碌指數(ngx_cycle->connection_n / 8 - ngx_cycle->free_connection_n)

將socket信息保存至當前進程連接池中

設置I/O事件處理函數

監聽函數處理(ngx_http_init_connection、ngx_mail_init_connection、ngx_stream_init_connection)

ngx_trylock_accept_mutex

嘗試獲取共享accept鎖

如果鎖獲取成功則添加accept事件

如果獲取鎖失敗且成功添加過accept事件則移除accept事件

ngx_event_connect_peer

從待連接池中(根據規則)獲取一個可用的連接對象

創建空白socket

從連接池獲取一個空閑的連接資源

設置socket為非阻塞

如果為 stream_proxy 則綁定本地端口

建立遠端(upstream、proxy等)連接

添加讀寫事件

ngx_event_pipe

從上游讀取數據寫入下游

為上游添加讀事件,如果沒有設置過讀延遲標識項則添加或刪除讀超時定時器

為下游添加寫事件,如果沒有設置過寫延遲標識項則添加或刪除寫超時定時器

ngx_event_pipe_read_upstream

如果上游發生錯誤、讀取完成或讀事件尚未就緒則返回

如果為預讀事件則從預讀緩沖區獲取數據

如果有配置帶寬控制策略則計算當前是否超過限制(limit = limit_rate * (now_sec - start_sec + 1) - read_length),如超過則加入定時器延時讀取

根據條件從各類管道緩沖區中選取合適的讀取

對上游輸入數據進行過濾(input_filter)

如果設置有緩存項則將讀取的上游數據存儲至臨時文件中

ngx_event_pipe_write_to_downstream

對將向下游數據輸出及下游輸入的數據進行過濾(output_filter)

如果循環池內的緩沖區占用大于所設置大小則輸出數據

緩沖區資源回收

如果連續輸出超過10次則返回系統繁忙

如果所有緩沖區數據均已輸出則重置臨時文件游標

將空閑的緩沖拷貝放回空閑緩沖區中

ngx_event_recvmsg

如果事件已經到達執行時間則添加到accept事件

設置對應的消息控制器

從socket獲取消息

如果尚未有任何消息到達則返回

如果消息有截斷則循環多次獲取

從消息中提取其他輔助信息(如socket的頭字段、拓展的錯誤描述等)

查找連接是否已經存在udp連接池中,如果存在則執行事件的處理程序,否則將socket信息保存至當前進程udp連接池中再則執行事件的處理程序

計算當前進程的忙碌指數

ngx_process_events_and_timers(詳見:worker處理流程-循環處理事件及定時器)

ngx_handle_write_event

如果有設置緩沖區最小發送值則添加設置到寫socket(寫入緩沖區的數據大小超過最小值后才將數據傳到協議層)

根據事件標識和事件狀態添加或移除對應寫事件

配置
event

worker_connections

配置塊:events

值類型:uint

默認值:512

可選范圍:1-[32位:2147483647;64位:9223372036854775807;select事件模型:FD_SETSIZE;同時受限于系統設置的單進程最大文件描述符,如果設置超過將忽略設置值]

說明:設置單worker可同時處理的最大連接數(包括接收的請求以及upstream之類對外的請求),已經在運行的nginx減小此值設置小于已經監聽的連接數可能引發錯誤

use

配置塊:events

值類型:string

默認值:根據當前系統支持的I/O事件通知機制按先后順序選擇(epoll、/dev/poll、kqueue、select)

可選范圍:epoll、/dev/poll、kqueue、select

說明:設置使用特定I/O事件通知機制,不同的事件通知機制可能影響程序運行效率;需在程序編譯時加入對應可選參數以支持事件,否則無法設置

multi_accept

配置塊:events

值類型:string

默認值:0(off)

可選范圍:on、off

說明:設置同一worker是否盡可能多的(在一次accept后繼續)接收等待監聽隊列中的socket,如果程序使用kqueue事件機制強制關閉

accept_mutex

配置塊:events

值類型:string

默認值:0(off)

可選范圍:on、off

說明:設置是否開啟accept互斥鎖,用于控制是否多個worker同時accept(避免驚群效應但是會降低一定效率,由于worker數一般與CPU核數一致進程數少影響較小故默認關閉),如果worker數小于等于1或Win32環境下強制關閉

accept_mutex_delay

配置塊:events

值類型:uint

默認值:500(毫秒)

可選范圍:1-[32位:2147483647;64位:9223372036854775807;]

說明:設置accept互斥鎖延遲時間,當某個worker超過文件最大描述符且未啟用互斥鎖時下一次嘗試accept事件的等待時間,以及I/O事件的最大等待時間

debug_connection

配置塊:events

值類型:string

默認值:無

可選范圍:

說明:設置開啟debug日志的連接,需編譯時開啟debug參數方可設置生效

devpoll

devpoll_changes

devpoll_events

epoll

epoll_events

worker_aio_requests

eventport

eventport_events

iocp

iocp_threads

post_acceptex

acceptex_read

kqueue

kqueue_changes

kqueue_events

openssl

ssl_engine

http服務 初始化流程

create_main_conf

create_srv_conf

create_loc_conf

preconfiguration

init_main_conf

merge_srv_conf

merge_loc_conf

ngx_http_init_static_location_trees

ngx_http_init_phases

postconfiguration

ngx_http_optimize_servers

優化server信息列表

添加各server所需地址的監聽

設置監聽參數(如:backlog、reuseport等),并將監聽處理器設置為ngx_http_init_connection

建立連接流程

查找請求對應的server配置

設置當前server的讀控制器(根據配置可能為:ssl、http2、http)

如果讀事件尚未準備就緒則將連接放回隊列并添加讀事件

如果讀事件(數據)已經準備就緒則執行對應讀控制器(對應https、http2、http)

https

嘗試從socket中讀取數據,沒有則添加讀事件后返回

創建ssl連接并和客戶端完成握手,若尚未完成則返回等待下次處理

如果客戶端使用的是http2協議則進入http2處理流程,否則進入http處理流程

http2

發送http2的headers frame

設置單個stream的流量控制

接收客戶端請求數據

確認客戶端請求數據包含http2連接序言,提取sid等信息并根據請求的frame類型調用對應處理方法

HEADERS frame處理

檢查客戶端發送的frame數據是否有錯誤(包括數據大小是否超過限制、當前處理中的請求是否超過限制等),有錯誤則發送中止stream推送信號或關閉連接返回錯誤

如果有設置優先級則根據權重及依賴流構建依賴樹以確定每個流的發送次序

根據stream狀態字段格式(壓縮或者非壓縮)處理狀態值

如果狀態字段未處理完成則繼續處理CONTINUATION frame

處理header相關信息

檢查cookie是否有變動,有則緩存cookie

進入請求處理流程

添加讀事件

處理輸出隊列

處理已經建立的連接

如果輸出緩沖區中有數據添加到輸出隊列中

如果請求尚未處理完成則返回繼續處理

清理臨時資源占用,將連接放回連接池中以待復用

添加連接閑置超時關閉事件

http

讀取socket中已接收信息,如果信息尚未接收完成則添加讀事件后返回

從復用連接池中移除當前連接

處理header相關信息(host合法性檢查、解析uri、header數據是否超過大小限制等)

進入請求處理流程

添加輸出寫事件

請求處理流程

如果為https請求則檢查客戶端證書是否正確

執行各階段檢查器

NGX_HTTP_POST_READ_PHASE

讀取請求內容階段

ngx_http_realip_handler

根據配置從請求header的x_real_ip、x_forwarded_for、代理請求來源IP或請求來源IP中獲取客戶端真實IP
NGX_HTTP_SERVER_REWRITE_PHASE

server級別的uri重寫階段

ngx_http_rewrite_handler

根據rewrite命令(rewrite、return、break、if、set、rewrite_log、uninitialized_variable_warn)執行對應命令的方法(在ngx_http_rewrite_commands中映射)
NGX_HTTP_FIND_CONFIG_PHASE

尋找location配置階段,該階段使用重寫之后的uri來查找對應的location,因為location級別可能有重寫指令所以可能會被執行多次

ngx_http_core_find_config_phase

不能添加外部檢查器

優先靜態location、后正則匹配location

檢查客戶端將要發送的body大小是否超過限制,超過則丟棄body數據結束請求

NGX_HTTP_REWRITE_PHASE

location級別的uri重寫階段,該階段執行location基本的重寫指令,也可能會被執行多次

ngx_http_rewrite_handler

NGX_HTTP_POST_REWRITE_PHASE

location級別重寫的最后處理階段

ngx_http_core_post_rewrite_phase

不能添加外部檢查器

用來檢查上階段是否有uri重寫,并根據結果跳轉到合適的階段

NGX_HTTP_PREACCESS_PHASE

訪問權限控制的前一階段,該階段在權限控制階段之前,一般用于訪問控制

ngx_http_degradation_handler

當可用內存低于配置閥值時提供降級處理方式(返回204或444 http狀態碼)

ngx_http_limit_conn_handler

最大連接數限制

ngx_http_limit_req_handler

請求頻率限制

ngx_http_realip_handler

NGX_HTTP_ACCESS_PHASE

訪問權限控制階段

ngx_http_core_access_phase

根據配置綜合其他權限控制階段的結果決定是否拒絕訪問

ngx_http_access_handler

基于IP黑白名單權限控制

ngx_http_auth_basic_handler

基于Basic的用戶密碼權限控制

ngx_http_auth_request_handler

使用外部服務進行權限控制,當外部服務返回2xx時允許訪問,當外部服務返回401或403則限制訪問
NGX_HTTP_POST_ACCESS_PHASE

訪問權限控制的最后處理階段

ngx_http_core_post_access_phase

不能添加外部檢查器

根據權限控制階段的執行結果進行相應處理

NGX_HTTP_PRECONTENT_PHASE

開始內容生成前的階段

ngx_http_mirror_handler

將當前接收到的請求鏡像一份(創建一份相同的子請求)異步請求第三方服務,可用于流量放大壓測、跨環境測試等,第三方服務的返回將被忽略

ngx_http_try_files_handler

檢查指定順序的文件是否存在,并使用第一個找到的文件進行請求處理,如果未找到任何文件則內部重定向到最后一個參數指定的uri
NGX_HTTP_CONTENT_PHASE

內容生成階段,該階段產生響應,并發送到客戶端

ngx_http_core_content_phase

如果該請求對應location有設置內容控制器(如fastcgi、grpc、proxy等)則使用對應內容控制器生成內容,否則輪詢其他內容生成階段控制器

最終如果沒有任何內容生成階段控制器響應該請求則根據訪問資源類型,目錄訪問返回失敗(403),文件訪問返回失?。?04)

ngx_http_autoindex_handler

處理以 "/" 結尾的GET、HEAD請求,并生成目錄列表。 當ngx_http_index_module模塊找不到索引文件時,通常會將請求傳遞給ngx_http_autoindex_module模塊

ngx_http_dav_handler

用于通過WebDAV協議進行文件管理,默認未編譯該模塊,需使用 --with-http_dav_module 編譯啟用

ngx_http_gzip_static_handler

用于發送帶有".gz"文件擴展名的預壓縮文件,只處理GET、HEAD請求,默認未編譯該模塊,需使用 --with-http_gzip_static_module 編譯啟用

ngx_http_index_handler

處理以 "/" 結尾的GET、POST、HEAD請求,可以觸發內部重定向至其他location

ngx_http_random_index_handler

處理以 "/" 結尾的GET、POST、HEAD請求,并在目錄中選擇一個隨機文件作為索引文件,在ngx_http_index_module模塊處理之前,默認未編譯該模塊,需使用 --with-http_random_index_module 編譯啟用

ngx_http_static_handler

用于讀取靜態文件,只處理GET、POST、HEAD請求
NGX_HTTP_LOG_PHASE

日志記錄階段

ngx_http_log_handler

不能添加外部檢查器

記錄訪問日志

配置
http

variables_hash_max_size

配置塊:http

值類型:uint

默認值:1024

可選范圍:1-[32位:2147483647;64位:9223372036854775807;]

說明:設置變量哈希表的最大大小

variables_hash_bucket_size

配置塊:http

值類型:uint

默認值:64

可選范圍:1-[32位:2147483647;64位:9223372036854775807;]

說明:設置變量哈希表的桶大小

server_names_hash_max_size

配置塊:http

值類型:uint

默認值:512

可選范圍:1-[32位:2147483647;64位:9223372036854775807;]

說明:設置服務器名稱哈希表的最大大小

server_names_hash_bucket_size

配置塊:http

值類型:uint

默認值:ngx_cacheline_size

可選范圍:1-[32位:2147483647;64位:9223372036854775807;]

說明:設置服務器名稱哈希表的存儲桶大小

server

配置塊:http

值類型:配置塊

默認值:無

可選范圍:無

說明:設置虛擬服務器的配置

connection_pool_size

配置塊:mainhttp、server

值類型:string

默認值:64 * 指針長度

可選范圍:k、K、M、m

說明:精確調整每個連接的內存分配

request_pool_size

配置塊:http、server

值類型:string

默認值:4096

可選范圍:k、K、M、m

說明:精確調整每個請求的內存分配

client_header_timeout

配置塊:http、server

值類型:time

默認值:60000

可選范圍:y、M、w、d、h、m、s、ms,解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]

說明:設置讀取客戶端請求頭信息的超時時間

client_header_buffer_size

配置塊:http、server

值類型:string

默認值:1024

可選范圍:k、K、M、m

說明:設置緩沖區大小以讀取客戶端請求頭信息,當請求頭大于此值時將嘗試使用large_client_header_buffers用以緩沖信息(但large_client_header_buffers的可用數量一般較小)

large_client_header_buffers

配置塊:http、server

值類型:uint size

默認值:4 8192

可選范圍:1-[32位:2147483647;64位:9223372036854775807;];k、K、M、m

說明:設置用于讀取客戶端大請求頭信息緩沖區的最大數量和大小

ignore_invalid_headers

配置塊:http、server

值類型:flag

默認值:1

可選范圍:on、off

說明:控制是否應忽略具有無效名稱的請求頭字段(有效名稱由英文字母、數字、連字符、下劃線組成)

merge_slashes

配置塊:http、server

值類型:flag

默認值:1

可選范圍:on、off

說明:設置是否將請求URI中重復的 "/" 壓縮成單個

underscores_in_headers

配置塊:http、server

值類型:flag

默認值:0

可選范圍:on、off

說明:設置是否禁用請求頭中包含下劃線字段的使用

location

配置塊:server

值類型:配置塊

默認值:無

可選范圍:無

說明:根據請求URI多帶帶設置配置(支持正則)

listen

配置塊:http、server

值類型:string

默認值:*:80(以超級用戶權限運行)、*:8000

可選范圍:無

說明:設置監聽請求的地址(IP、端口、Unix域套接字)

server_name

配置塊:http、server

值類型:string

默認值:""

可選范圍:無

說明:設置虛擬服務器的名稱(支持正則)

types_hash_max_size

配置塊:http、server、location

值類型:uint

默認值:1024

可選范圍:1-[32位:2147483647;64位:9223372036854775807;]

說明:設置類型哈希表的最大大小

types_hash_bucket_size

配置塊:http、server、location

值類型:uint

默認值:64

可選范圍:1-[32位:2147483647;64位:9223372036854775807;]

說明:設置類型哈希表的存儲桶大小

types

配置塊:http、server、location

值類型:配置塊

默認值:NULL

可選范圍:無

說明:將文件擴展名映射到對應的MIME類型

default_type

配置塊:http、server、location

值類型:string

默認值:text/plain

可選范圍:types中配置的映射

說明:定義默認響應的MIME類型

root

配置塊:http、server、location、location=>if

值類型:string

默認值:{ 0, NULL }

可選范圍:無

說明:設置請求根目錄

alias

配置塊:location

值類型:string

默認值:無

可選范圍:無

說明:為特定location定義別名路徑,如alias /www/www.mudoom.com/,uri為 mudoom.icon,則實際訪問 /www/www.mudoom.com/mudoom.icon 資源

limit_except

配置塊:location

值類型:配置塊

默認值:無

可選范圍:無

說明:為特定location增加對某種HTTP請求方法的特殊限制,如限制GET請求只允許某些IP訪問

client_max_body_size

配置塊:http、server、location

值類型:buf

默認值:1 1024 1024

可選范圍:k、K、M、m、g、G

說明:設置客戶端請求體的最大大小,Content-Length大于此值的請求將被拒絕,設為0則不限制大小

client_body_buffer_size

配置塊:http、server、location

值類型:size

默認值:2 * ngx_pagesize

可選范圍:k、K、M、m、g、G

說明:設置客戶端請求體的緩沖區大小

client_body_timeout

配置塊:http、server、location

值類型:time

默認值:60000

可選范圍:y、M、w、d、h、m、s、ms,解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]

說明:設置讀取客戶端請求頭信息的超時時間

client_body_temp_path

配置塊:http、server、location

值類型:string

默認值:NGX_HTTP_CLIENT_TEMP_PATH(編譯時設置)

可選范圍:無

說明:設置用于存儲客戶端請求信息的臨時文件的目錄

client_body_in_file_only

配置塊:http、server、location

值類型:flag

默認值:0

可選范圍:on、clean、off

說明:設置是否將請求體保存至文件中,on為保存且請求結束后不刪除臨時文件,clean則在請求結束后刪除臨時文件

client_body_in_single_buffer

配置塊:http、server、location

值類型:flag

默認值:0

可選范圍:on、off

說明:設置是否將整個客戶端請求體保存在單個緩沖區中

sendfile

配置塊:http、server、location、location=>if

值類型:flag

默認值:0

可選范圍:on、off

說明:設置是否使用sendfile發送文件數據

sendfile_max_chunk

配置塊:http、server、location

值類型:size

默認值:0

可選范圍:k、K、M、m

說明:設置單個sendfile最大傳輸量,設置為0表示無限制,無限制的情況下一個快速連接可能導致整個worker進程被占用

subrequest_output_buffer_size

配置塊:http、server、location

值類型:size

默認值:ngx_pagesize

可選范圍:k、K、M、m

說明:設置用于存儲子請求輸出緩沖區大小

aio

配置塊:http、server、location

值類型:flag|string

默認值:0

可選范圍:on、off、threads[=pool](pool為所使用的線程池名稱)

說明:設置是否啟用異步I/O,僅在FreeBSD和Linux中生效,當在Linux上同時啟用AIO和sendfile時,AIO用于大于或等于directio設置中指定大小的文件,而sendfile用于小于該大小的文件或禁用directio被禁用時。默認情況下程序只啟用單線程異步I/O,如需啟用多線程則在編譯時添加參數 --with-threads ,僅在epoll、kqueue、eventport I/O事件類型中有效

aio_write

配置塊:http、server、location

值類型:flag

默認值:0

可選范圍:on、off

說明:設置是否使用異步I/O寫數據,需再aio開啟下使用,且僅用于寫入從代理服務模塊接收的臨時文件數據

read_ahead

配置塊:http、server、location

值類型:size

默認值:0

可選范圍:k、K、M、m

說明:設置讀取文件時內核的預讀取量

directio

配置塊:http、server、location

值類型:flag|size

默認值:NGX_OPEN_FILE_DIRECTIO_OFF

可選范圍:off、k、K、M、m

說明:設置使用異步I/O還是sendfile的臨界點

directio_alignment

配置塊:http、server、location

值類型:size

默認值:512

可選范圍:k、K、M、m

說明:設置directio的對齊大小,在Linux下使用XFS時,需要將其增加到4K

tcp_nopush

配置塊:http、server、location

值類型:flag

默認值:0

可選范圍:on、off

說明:設置在socket中是否設置(Linux中)TCP_CORK或(FreeBSD中)TCP_NOPUSH參數,僅在sendfile開啟有可用。該設置可能會導致數據不會立即發送給客戶端,而是等待待發送數據長度超過設定值或手動取消阻塞后發送,可以有助于提高大數據量的發送效率

tcp_nodelay

配置塊:http、server、location

值類型:flag

默認值:1

可選范圍:on、off

說明:設置在socket中是否設置TCP_NODELAY參數,僅在長連接、無緩沖代理、WebSocket代理中啟用。該設置會立即將數據發送給客戶端而無需等待到指定長度或時間,可以有助于提高小數據量的發送效率

send_timeout

配置塊:http、server、location

值類型:time

默認值:60000

可選范圍:y、M、w、d、h、m、s、ms,解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]

說明:設置將響應數據發送給客戶端的超時時間,該設置用于兩次寫操作時間的超時時間而非整個請求響應的時間,客戶端在這個時間內如果未響應任何信息則連接將被關閉

send_lowat

配置塊:http、server、location

值類型:size

默認值:0

可選范圍:k、K、M、m

說明:設置socket最小讀寫數據量,僅在kqueue I/O事件模型中生效。該設置會使內核在讀、寫緩沖區中數據量達到該值時才通知進程可讀寫,可以有助于內核喚起進程次數提高CPU利用率

postpone_output

配置塊:http、server、location

值類型:size

默認值:1460

可選范圍:k、K、M、m

說明:設置向客戶端傳輸響應數據的最小值,當請求未結束、程序未強制執行刷寫指令且待傳輸數據大于該值時才開始向客戶端傳輸響應數據

limit_rate

配置塊:http、server、location

值類型:size

默認值:0

可選范圍:k、K、M、m

說明:設置向客戶端每個連接傳輸響應數據的速率(bytes/second),為0時表示無限制

limit_rate_after

配置塊:http、server、location

值類型:size

默認值:0

可選范圍:k、K、M、m

說明:設置初始無響應速率限制閥值,超過該值后開始按limit_rate限制

keepalive_timeout

配置塊:http、server、location

值類型:time [time]

默認值:75000

可選范圍:y、M、w、d、h、m、s、ms,解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]

說明:第一個值用于控制程序長連接超時時間,第二個值用于向客戶端響應的header中添加長連接超時時間,部分瀏覽器會根據該header控制長連接

keepalive_requests

配置塊:http、server、location

值類型:uint

默認值:100

可選范圍:1-[32位:2147483647;64位:9223372036854775807;]

說明:設置一個長連接的最大請求數,當請求數超過該值則關閉該長連接

keepalive_disable

配置塊:http、server、location

值類型:string

默認值:NGX_CONF_BITMASK_SET | NGX_HTTP_KEEPALIVE_DISABLE_MSIE6

可選范圍:user_agent中配置的映射

說明:設置在某些瀏覽器下禁用長連接

satisfy

配置塊:http、server、location

值類型:flag

默認值:0

可選范圍:all、any

說明:設置訪問權限控制中是滿足任意模塊還是滿足所有模塊才允許訪問

internal

配置塊:location

值類型:無

默認值:0

可選范圍:無

說明:設置特定location只允許內部(重定向)請求,其他請求均返回404,且每個請求最多允許10次(NGX_HTTP_MAX_URI_CHANGES)內部重定向

lingering_close

配置塊:http、server、location

值類型:flag

默認值:1

可選范圍:on、off、always

說明:控制程序如何關閉客戶端連接,on為如果客戶端正在發送數據則等待數據接收完成后關閉連接,always為無條件等待指定時間(受lingering_time、lingering_timeout綜合影響)后關閉連接,off為立即關閉連接

lingering_time

配置塊:http、server、location

值類型:time

默認值:30000

可選范圍:y、M、w、d、h、m、s、ms,解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]

說明:設置延遲關閉客戶端連接等待時間

lingering_timeout

配置塊:http、server、location

值類型:time

默認值:5000

可選范圍:y、M、w、d、h、m、s、ms,解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]

說明:設置延遲關閉連接每次接收數據的超時時間(每次超時時間內接收到數據都將進入下一次超時計算,但最長不會超過lingering_time)

reset_timedout_connection

配置塊:http、server、location

值類型:flag

默認值:0

可選范圍:on、off

說明:設置是否重置連接超時,在socket關閉后tcp將向客戶端RST以引導客戶端重新建立連接

absolute_redirect

配置塊:http、server、location

值類型:flag

默認值:1

可選范圍:on、off

說明:設置是否為絕對(路徑)重定向,on為絕對(路徑)重定向,off為相對(路徑)重定向

server_name_in_redirect

配置塊:http、server、location

值類型:flag

默認值:0

可選范圍:on、off

說明:設置是否根據客戶端請求的host返回重定向,on為使用實際請求host重定向,off為使用客戶端請求host重定向

port_in_redirect

配置塊:http、server、location

值類型:flag

默認值:1

可選范圍:on、off

說明:設置是否在絕對(路徑)重定向中返回端口

msie_padding

配置塊:http、server、location

值類型:flag

默認值:1

可選范圍:on、off

說明:設置是否向IE客戶端請求http狀態碼大于400的響應中添加空白填充以達到512字節

msie_refresh

配置塊:http、server、location

值類型:flag

默認值:0

可選范圍:on、off

說明:設置是否向IE客戶端請求發送refreshes(而非重定向)命令

log_not_found

配置塊:http、server、location

值類型:flag

默認值:1

可選范圍:on、off

說明:設置收否記錄文件不存在錯誤日志

log_subrequest

配置塊:http、server、location

值類型:flag

默認值:0

可選范圍:on、off

說明:設置收否記錄子請求日志

recursive_error_pages

配置塊:http、server、location

值類型:flag

默認值:0

可選范圍:on、off

說明:設置是否使用error_page重定向請求

server_tokens

配置塊:http、server、location

值類型:flag|string

默認值:1

可選范圍:off、on、build

說明:設置是否在請求響應header中添加nginx版本號等信息

if_modified_since

配置塊:http、server、location

值類型:flag

默認值:1

可選范圍:off、exact、before

說明:設置如何根據請求header中的If-Modified-Since響應請求,off為忽略請求頭,exact為精確匹配,before為小于或等于

max_ranges

配置塊:http、server、location

值類型:uint

默認值:0x7fffffff

可選范圍:1-[32位:2147483647;64位:9223372036854775807;]

說明:設置請求header中Ranges允許接收的最大值

chunked_transfer_encoding

配置塊:http、server、location

值類型:flag

默認值:1

可選范圍:off、on

說明:設置禁用 HTTP/1.1 的數據分片傳輸

etag

配置塊:http、server、location

值類型:flag

默認值:1

可選范圍:off、on

說明:設置是否自動在請求響應header中根據返回的靜態文件類型添加ETag類型

error_page

配置塊:http、server、location

值類型:code uri

默認值:無

可選范圍:無

說明:根據http錯誤碼響應指定URI資源(可以為變量)

post_action

配置塊:http、server、location

值類型:string

默認值:{ 0, NULL }

可選范圍:無

說明:內容生成階段結束后程序將請求內部重定向至指定的location處理(可用于請求統計之類用途)

error_log

配置塊:http、server、location

值類型:file level

默認值:logs/error.log error

可選范圍:無

說明:設置日志記錄路徑

open_file_cache

配置塊:http、server、location

值類型:flag

默認值:NULL

可選范圍:off、max、inactive

說明:設置文件(讀取時)信息緩存,off關閉緩存,max設置最大緩存數,inactive設置緩存過期時間

open_file_cache_valid

配置塊:http、server、location

值類型:time

默認值:60(秒)

可選范圍:解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]

說明:設置文件信息緩存后再次驗證文件信息的時間

open_file_cache_min_uses

配置塊:http、server、location

值類型:uint

默認值:1

可選范圍:1-[32位:2147483647;64位:9223372036854775807;]

說明:設置文件描述符保存進文件信息緩存的最小訪問次數

open_file_cache_errors

配置塊:http、server、location

值類型:flag

默認值:0

可選范圍:on、off

說明:設置是否保存文件訪問錯誤進文件信息緩存

open_file_cache_events

配置塊:http、server、location

值類型:flag

默認值:0

可選范圍:on、off

說明:暫未發現使用用途

resolver

配置塊:http、server、location

值類型:address ... [valid=time] [ipv6=on|off]

默認值:創建虛擬解析器

可選范圍:無

說明:配置特定的DNS服務作為解析

resolver_timeout

配置塊:http、server、location

值類型:time

默認值:30000

可選范圍:y、M、w、d、h、m、s、ms,解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]

說明:設置DNS解析超時時間

disable_symlinks

配置塊:http、server、location

值類型:flag

默認值:0

可選范圍:off、on

說明:是否禁用符號連接類資源

http狀態碼

100

NGX_HTTP_CONTINUE

目前為止一切正常, 客戶端應該繼續請求, 如果已完成請求則忽略。程序中定義未使用

101

NGX_HTTP_SWITCHING_PROTOCOLS

服務器應客戶端升級協議的請求(Upgrade請求頭)正在進行協議切換。程序中proxy、uwsgi、scgi模塊將進行協議切換(http2目前不支持該協議協商只支持指定協議請求)

102

NGX_HTTP_PROCESSING

非通用協議,程序中定義未使用

200

NGX_HTTP_OK

請求成功

201

NGX_HTTP_CREATED

請求已經被成功處理,并且創建了新的資源。WebDAV模塊中使用,表示(move、overwrite)文件或集合(mkcol)創建成功

202

NGX_HTTP_ACCEPTED

服務器端已經收到請求消息,但是尚未進行處理。程序中定義未使用

204

NGX_HTTP_NO_CONTENT

目前請求成功,但客戶端不需要更新其現有頁面。

206

NGX_HTTP_PARTIAL_CONTENT

請求已成功,并且主體包含所請求的數據區間,該數據區間是在請求的 Range 首部指定的。

300

NGX_HTTP_SPECIAL_RESPONSE

表示重定向的響應狀態碼,表示該請求擁有多種可能的響應。用戶代理或者用戶自身應該從中選擇一個。程序中作為特殊響應碼的分界值

301

NGX_HTTP_MOVED_PERMANENTLY

被請求的資源已永久移動到新位置,并且將來任何對此資源的引用都應該使用本響應返回的若干個 URI 之一。

302

NGX_HTTP_MOVED_TEMPORARILY

請求的資源現在臨時從不同的 URI 響應請求。由于這樣的重定向是臨時的,客戶端應當繼續向原有地址發送以后的請求。

303

NGX_HTTP_SEE_OTHER

對應當前請求的響應可以在另一個 URI 上被找到,而且客戶端應當采用 GET 的方式訪問那個資源。程序定義未使用

304

NGX_HTTP_NOT_MODIFIED

如果客戶端發送了一個帶條件的 GET 請求且該請求已被允許,而文檔的內容(自上次訪問以來或者根據請求的條件)并沒有改變,則服務器應當返回這個狀態碼。

307

NGX_HTTP_TEMPORARY_REDIRECT

請求的資源現在臨時從不同的URI 響應請求。由于這樣的重定向是臨時的,客戶端應當繼續向原有地址發送以后的請求。程序定義未使用

308

NGX_HTTP_PERMANENT_REDIRECT

這意味著資源現在永久位于由 Location: HTTP Response 標頭指定的另一個 URI。程序定義未使用

400

NGX_HTTP_BAD_REQUEST

語義有誤,當前請求無法被服務器理解。客戶端請求信息有誤或請求host不存在

401

NGX_HTTP_UNAUTHORIZED

當前請求需要用戶驗證。該響應必須包含一個適用于被請求資源的 WWW-Authenticate 信息頭用以詢問用戶信息。auth_basic模塊權限校驗失敗或upstream上游返回

403

NGX_HTTP_FORBIDDEN

服務器已經理解請求,但是拒絕執行它。訪問權限控制階段被限制、請求的資源無讀取權限、upstream上游返回

404

NGX_HTTP_NOT_FOUND

請求失敗,請求所希望得到的資源未被在服務器上發現。

405

NGX_HTTP_NOT_ALLOWED

請求行中指定的請求方法不能被用于請求相應的資源。

408

NGX_HTTP_REQUEST_TIME_OUT

請求超時。接收客戶端請求數據超時(客戶端指定的Content-Length在指定時間內未能接收完成)

409

NGX_HTTP_CONFLICT

由于和被請求的資源的當前狀態之間存在沖突,請求無法完成。WebDAV模塊中部分請求操作失敗

411

NGX_HTTP_LENGTH_REQUIRED

服務器拒絕在沒有定義 Content-Length 頭的情況下接受請求。程序定義未使用

412

NGX_HTTP_PRECONDITION_FAILED

服務器在驗證在請求的頭字段中給出先決條件時,沒能滿足其中的一個或多個。WebDAV模塊中overwrite發生錯誤或not_modified模塊中客戶端請求的判斷條件沒有滿足

413

NGX_HTTP_REQUEST_ENTITY_TOO_LARGE

服務器拒絕處理當前請求,因為該請求提交的實體數據大小超過了服務器愿意或者能夠處理的范圍。

414

NGX_HTTP_REQUEST_URI_TOO_LARGE

請求的URI 長度超過了服務器能夠解釋的長度,因此服務器拒絕對該請求提供服務。

415

NGX_HTTP_UNSUPPORTED_MEDIA_TYPE

對于當前請求的方法和所請求的資源,請求中提交的實體并不是服務器中所支持的格式,因此請求被拒絕。客戶端請求時使用請求體訪問WebDAV模塊部分方法或image_filter模塊中圖片資源數據異常

416

NGX_HTTP_RANGE_NOT_SATISFIABLE

如果請求中包含了 Range 請求頭,并且 Range 中指定的任何數據范圍都與當前資源的可用范圍不重合,同時請求中又沒有定義 If-Range 請求頭,那么服務器就應當返回416狀態碼??蛻舳苏埱骽eader中的Range不合法(格式不正確)

421

NGX_HTTP_MISDIRECTED_REQUEST

該請求針對的是無法產生響應的服務器。 客戶端嘗試https請求的host于server配置中host不一致

429

NGX_HTTP_TOO_MANY_REQUESTS

用戶在給定的時間內請求過于頻繁。upstream模塊中根據上游服務的返回而返回

444

NGX_HTTP_CLOSE

非通用協議。程序定義未使用

494

NGX_HTTP_NGINX_CODES

非通用協議。程序定義未使用

NGX_HTTP_REQUEST_HEADER_TOO_LARGE

非通用協議??蛻舳苏埱骽eader過大(large_header_buf已被分配完或者請求大于headerlarge_header_buf)

495

NGX_HTTPS_CERT_ERROR

非通用協議。客戶端以https協議請求但是程序對客戶端證書校驗失敗

496

NGX_HTTPS_NO_CERT

非通用協議??蛻舳艘詇ttps協議請求但是對應的server塊未配置證書信息

497

NGX_HTTP_TO_HTTPS

非通用協議??蛻舳艘詇ttps協議請求但是對應的server塊未開啟ssl

499

NGX_HTTP_CLIENT_CLOSED_REQUEST

非通用協議??蛻舳嗽诔绦蝽憫皵嚅_了連接

500

NGX_HTTP_INTERNAL_SERVER_ERROR

服務器遇到了不知道如何處理的情況。程序發生內部錯誤(如配置錯誤、重定向錯誤等)時使用

501

NGX_HTTP_NOT_IMPLEMENTED

此請求方法不被服務器支持且無法被處理。WebDAV模塊客戶端PUT請求header中使用Range、http客戶端請求header中的Transfer-Encoding無法識別時使用

502

NGX_HTTP_BAD_GATEWAY

此錯誤響應表明服務器作為網關需要得到一個處理這個請求的響應,但是得到一個錯誤的響應。upstream模塊中上游服務響應錯誤時使用

503

NGX_HTTP_SERVICE_UNAVAILABLE

服務器沒有準備好處理請求。 limit_conn(觸發請求數限制)、limit_req(觸發速率限制)、upstream模塊中使用

504

NGX_HTTP_GATEWAY_TIME_OUT

當服務器作為網關,不能及時得到響應時返回此錯誤代碼。upstream模塊中上游服務響應超時時使用

505

NGX_HTTP_VERSION_NOT_SUPPORTED

服務器不支持請求中所使用的HTTP協議版本。

507

NGX_HTTP_INSUFFICIENT_STORAGE

服務器有內部配置錯誤。WebDAV模塊中發生NGX_ENOSPC錯誤時使用

mail服務 初始化流程

create_main_conf

create_srv_conf

init_main_conf

merge_srv_conf

ngx_mail_add_ports

ngx_mail_optimize_servers

優化監聽列表,如果相同端口有泛IP監聽則忽略其他指定IP地址的監聽

添加各server所需地址的監聽

設置監聽參數(如:backlog、rcvbuf等),并將監聽處理器設置為ngx_mail_init_connection

建立連接流程

查找請求對應的server配置(根據server配置可確定當前請求對應的mail協議)

設置當前server的讀控制器(根據配置可能為:ssl、非ssl)

執行對應讀控制器(對應ssl、非ssl)

ssl

創建ssl連接并和客戶端完成握手,若尚未完成則添加超時定時器后返回等待下次處理

檢查客戶端證書

如果當前server配置中的STARTTLS命令未關閉則執行對應協議(imap、pop3、smtp)的init_protocol方法后返回

否則進入session初始化流程

非ssl

進入session初始化流程

session初始化流程

imap

添加讀(ngx_mail_imap_init_protocol)寫(ngx_mail_send)事件

pop3

如果server配置有apop、cram-md5兩種身份驗證方式則為請求輸出加鹽(避免暴露破解)

添加讀(ngx_mail_imap_init_protocol)寫(ngx_mail_send)事件

smtp

添加讀(ngx_mail_imap_init_protocol)寫(ngx_mail_send)事件

協議初始化

檢查請求是否超時,超時則關閉連接

創建臨時緩沖區

讀取客戶端請求命令(一次無法讀取完則添加讀事件返回等待下次處理)

如果客戶端發送命令數據過大則退出本次請求

解析客戶端請求命令并根據命令提取相應鑒權驗證信息

將授權驗證信息發送至上游身份驗證服務(根據auth_http配置)

檢查上游身份驗證服務的返回結果,如果失敗則根據配置絕對是否返回錯誤信息給客戶端,否則將嚴重服務器身份驗證服務返回的郵件服務地址及授權信息(授權密鑰)存儲于輸出緩沖區

如果輸出緩沖區存在數據則向客戶端發送數據

stream服務 初始化流程

create_main_conf

create_srv_conf

preconfiguration

init_main_conf

merge_srv_conf

postconfiguration

ngx_stream_init_phase_handlers

初始化個請求階段處理控制器

ngx_stream_add_ports

ngx_stream_optimize_servers

優化監聽列表,如果相同端口有泛IP監聽則忽略其他指定IP地址的監聽

添加各server所需地址的監聽

設置監聽參數(如:backlog、keepalive等)

建立連接流程

查找請求對應的server配置

如果有配置使用accept互斥鎖則將讀事件添加到普通事件(非accept事件)隊列中

進入請求處理流程

請求處理流程
NGX_STREAM_POST_ACCEPT_PHASE

讀取請求內容階段

ngx_stream_realip_handler

獲取客戶端真實IP
NGX_STREAM_PREACCESS_PHASE

訪問權限控制的前一階段,該階段在權限控制階段之前,一般用于訪問控制

ngx_stream_limit_conn_handler

最大連接數限制
NGX_STREAM_ACCESS_PHASE

訪問權限控制階段

ngx_stream_access_handler

基于IP黑白名單權限控制
NGX_STREAM_SSL_PHASE

訪問建立ssl階段

ngx_stream_ssl_handler

建立ssl連接
NGX_STREAM_PREREAD_PHASE

請求數據預讀階段

ngx_stream_core_preread_phase

創建臨時緩沖區

讀取客戶端請求數據

如果客戶端數據請求尚未接收完成則添加讀事件后返回等待下次處理

ngx_stream_ssl_preread_handler

讀取SSL請求數據
NGX_STREAM_CONTENT_PHASE

內容生成階段,該階段產生響應,并發送到客戶端

ngx_stream_core_content_phase

轉發客戶端請求至對應上游服務,并將上游服務的響應返回給客戶端

NGX_STREAM_LOG_PHASE

日志記錄階段

ngx_stream_log_handler

不能添加外部檢查器

記錄訪問日志

參考文檔

Nginx開發從入門到精通

CPU緩存 - 維基百科

Page (computer memory))

OpenEvent

Linux管道編程技術:dup函數,dup2函數,open函數詳解

Nginx Caching

紅黑樹

nginx documentation

Hypertext Transfer Protocol Version 2 (HTTP/2)

HTTP 響應代碼

Configuring NGINX as a Mail Proxy Server

源地址 By佐柱

轉載請注明出處,也歡迎偶爾逛逛我的小站,謝謝 :)

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/40272.html

相關文章

  • Nginx 源碼分析:從模塊到配置(下)

    摘要:每個模塊由以下幾部分構成結構體代表模塊本身,其指針被放入數組中。結構體用來表示模塊的配置內容,其中部分成員可以通過配置文件進行配置。調用該中的函數,該函數最終初始化模塊對應的結構體,完成配置。因此,分析源碼中的配置指令,就是分析結構體。 本篇的上篇 Nginx 源碼分析:從模塊到配置(上),建議閱讀本篇前先閱讀上篇。 關于模塊 Nginx的架構高度模塊化。每個模塊各司其職,組合在一...

    Chao 評論0 收藏0
  • PHP程序員學習路線

    摘要:第一階段基礎階段基礎程序員重點把搞熟練核心是安裝配置基本操作目標能夠完成基本的系統安裝,簡單配置維護能夠做基本的簡單系統的開發能夠在中型系統中支持某個功能模塊的開發。本項不做重點學習,除非對前端有興趣。 第一階段:基礎階段(基礎PHP程序員) 重點:把LNMP搞熟練(核心是安裝配置基本操作) 目標:能夠完成基本的LNMP系統安裝,簡單配置維護;能夠做基本的簡單系統的PHP開發;能夠在P...

    genedna 評論0 收藏0
  • 分析Nginx 源碼 - ngx_module_t接口總結

    摘要:關于有一套設計良好的源碼,以供分析,本文從結構體來分析源碼結構??偨Y初次閱讀源碼,先從結構體開始學習,開篇之作,再接再厲。 關于 nginx有一套設計良好的源碼,以供分析,本文從ngx_module_t結構體來分析nginx源碼結構。ngx_module_t是整個nginx的關鍵,它提供了整個nginx的模塊化的基礎。因此,看懂ngx_module_t結構體才能開始入門nginx源碼閱...

    sunnyxd 評論0 收藏0
  • swoft| 源碼解讀系列一: 好難! swoft demo 都跑不起來怎么破? docker 了解

    摘要:源碼解讀系列一好難都跑不起來怎么破了解一下唄閱讀框架源碼第一步搞定環境小伙伴剛接觸的時候會感覺壓力有點大更直觀的說法是難開發組是不贊成難這個說法的的代碼都是實現的而又是世界上最好的語言的代碼閱讀起來是很輕松的開發組會用源碼解讀系列博客深 date: 2018-8-01 14:22:17title: swoft| 源碼解讀系列一: 好難! swoft demo 都跑不起來怎么破? doc...

    shenhualong 評論0 收藏0
  • swoft| 源碼解讀系列一: 好難! swoft demo 都跑不起來怎么破? docker 了解

    摘要:源碼解讀系列一好難都跑不起來怎么破了解一下唄閱讀框架源碼第一步搞定環境小伙伴剛接觸的時候會感覺壓力有點大更直觀的說法是難開發組是不贊成難這個說法的的代碼都是實現的而又是世界上最好的語言的代碼閱讀起來是很輕松的開發組會用源碼解讀系列博客深 date: 2018-8-01 14:22:17title: swoft| 源碼解讀系列一: 好難! swoft demo 都跑不起來怎么破? doc...

    rollback 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<