摘要:源碼閱讀前言源碼版本本文主要描述環(huán)境下的流程,與環(huán)境下類似,環(huán)境下可能會減少部分流程等類系統(tǒng)使用多進(jìn)程方式運(yùn)行,而使用多線程方式運(yùn)行開頭的變量多為全局變量多為處理配置中相應(yīng)模塊的配置處理,多為該模塊的核心通用處理邏輯架構(gòu)進(jìn)程工作模式多
NGINX源碼閱讀 前言
源碼版本:2018-10-02 nginx-1.15.5
本文主要描述Darwin環(huán)境下的流程,與Linux環(huán)境下類似,Win32環(huán)境下可能會減少部分流程
Darwin/Linux等*nix類系統(tǒng)使用多進(jìn)程方式運(yùn)行,而Win32使用多線程方式運(yùn)行
ngx_ 開頭的變量多為全局變量
ngx_model_name.c 多為處理nginx配置中相應(yīng)模塊的配置處理,ngx_model_name_core_module.c 多為該模塊的核心(通用)處理邏輯
nginx架構(gòu) 進(jìn)程工作模式 多進(jìn)程master進(jìn)程
用于接收外部信號發(fā)送給worker進(jìn)程,如stop、restart、reload等
監(jiān)控worker進(jìn)程運(yùn)行狀態(tài),worker異常退出后重新啟動新的worker進(jìn)程
緩存管理
worker進(jìn)程
單進(jìn)程處理基本網(wǎng)絡(luò)事件,如http、mail請求等
調(diào)試情況下使用,直接使用單進(jìn)程處理網(wǎng)絡(luò)事件配置
daemon
配置塊:main
值類型:flag
默認(rèn)值:1
可選范圍:on、off
說明:是否使用守護(hù)進(jìn)程模式開啟服務(wù)
master_process
配置塊:main
值類型:flag
默認(rèn)值:1
可選范圍:on、off
說明:是否開啟master管理進(jìn)程,主要用于nginx開發(fā)調(diào)試,關(guān)閉狀態(tài)下不會開啟accept互斥鎖
timer_resolution
配置塊:main
值類型:time
默認(rèn)值:0
可選范圍:y、M、w、d、h、m、s、ms,解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]
說明:用于控制gettimeofday()的系統(tǒng)調(diào)用時機(jī),未設(shè)置的情況下每次系統(tǒng)事件都將調(diào)用gettimeofday(),設(shè)置后將以該時間調(diào)用gettimeofday()
pid
配置塊:main
值類型:string
默認(rèn)值:logs/nginx.pid(根據(jù)編譯時設(shè)置,未設(shè)置則為該值)
可選范圍:—
說明:用于設(shè)置主進(jìn)程pid的存放路徑
lock_file
配置塊:main
值類型:string
默認(rèn)值:logs/nginx.lock(根據(jù)編譯時設(shè)置,未設(shè)置則為該值)
可選范圍:—
說明:用于不支持原子操作的系統(tǒng)使用文件鎖作為accept互斥鎖,支持原子操作的系統(tǒng)將忽略該值
worker_processes
配置塊:main
值類型:unit|string(auto)
默認(rèn)值:1
可選范圍:1-[32位:2147483647;64位:9223372036854775807;]
說明:設(shè)置worker進(jìn)程數(shù),建議使用auto由程序根據(jù)當(dāng)前系統(tǒng)環(huán)境CPU核數(shù)設(shè)置(等于CPU核數(shù),如果小于1則設(shè)置為1)
debug_points
配置塊:main
值類型:uint
默認(rèn)值:0
可選范圍:1-[32位:2147483647;64位:9223372036854775807;]
說明:用于監(jiān)測到內(nèi)部錯誤時中止或停止進(jìn)程以進(jìn)行進(jìn)一步的調(diào)試
user
配置塊:main
值類型:string
默認(rèn)值:nobody [nobody]
可選范圍:-
說明:設(shè)置worker進(jìn)程使用什么用戶和用戶組身份啟動
worker_priority
配置塊:main
值類型:int
默認(rèn)值:0
可選范圍:-20-20
說明:設(shè)置worker進(jìn)程的調(diào)度優(yōu)先級,數(shù)值越小表示優(yōu)先級越高
worker_cpu_affinity
配置塊:main
值類型:umask|string(auto)
默認(rèn)值:—
可選范圍:—
說明:將工作進(jìn)程綁定到CPU組用以減少CPU上下文切換,默認(rèn)情況下不綁定,設(shè)置不存在的CPU掩碼將被忽略
worker_rlimit_nofile
配置塊:main
值類型:uint
默認(rèn)值:—
可選范圍:—
說明:修改worker進(jìn)程的最大文件描述符限制,用于在不重新啟動master進(jìn)程的情況下修改限制
worker_rlimit_core
配置塊:main
值類型:uint
默認(rèn)值:—
可選范圍:—
說明:修改worker進(jìn)程的核心文件最大限制,用于在不重新啟動master進(jìn)程的情況下修改限制
worker_shutdown_timeout
配置塊:main
值類型:time
默認(rèn)值:0
可選范圍:y、M、w、d、h、m、s、ms,解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]
說明:設(shè)置worker進(jìn)程的結(jié)束等待時間(收到結(jié)束信號后worker可能還有未處理完的請求,默認(rèn)系統(tǒng)將等待所有請求處理完成后退出),設(shè)置該時間后worker將在到期時直接關(guān)閉所有持有的連接
working_directory
配置塊:main
值類型:string
默認(rèn)值:—
可選范圍:—
說明:設(shè)置工作目錄
env
配置塊:main
值類型:string
默認(rèn)值:TZ
可選范圍:—
說明:默認(rèn)情況下程序在啟動時將移除除了時區(qū)外的所有環(huán)境變量,可用該參數(shù)設(shè)置需要的環(huán)境變量
load_module
啟動階段 master處理流程配置塊:main
值類型:string
默認(rèn)值:—
可選范圍:—
說明:用于加載動態(tài)模塊
日志初始化
初始化日志格式
打開日志文件獲取文件句柄(讀寫刪共享鎖)
SSL初始化
保存啟動參數(shù)
解析配置文件路徑
運(yùn)行環(huán)境系統(tǒng)初始化
獲取cpu緩存塊大?。ㄈ绻幸患塁PU緩存則使用一級緩存大?。﹏gx_cacheline_size
獲取內(nèi)存頁大小 ngx_pagesize
獲取CPU核數(shù)(如果小于一核則設(shè)置為1核)
壓縮表初始化
如果為繼承關(guān)系則繼承原socket信息
模塊預(yù)初始化(將所需加載的模塊信息加入全局變量,程序所需加載的模塊列表在程序編譯時根據(jù)配置輸出至ngx_modules全局變量中)
輪訓(xùn)初始化
加載配置
加載模塊
創(chuàng)建共享內(nèi)存
關(guān)閉無用socket和已打開文件
socket監(jiān)聽及配置
如果是檢查配置文件錯誤則返回結(jié)果
如果有接收到nginx信號則轉(zhuǎn)發(fā)外部信號給worker進(jìn)程(通過跨進(jìn)程事件OpenEvent/SetEvent)
注冊信號處理器
守護(hù)進(jìn)程模式下fork出子進(jìn)程(當(dāng)前進(jìn)程結(jié)束),重定向子進(jìn)程輸入、輸出至/dev/null(通過tup2)
創(chuàng)建pid文件
啟動worker進(jìn)程循環(huán)
worker處理流程設(shè)置信號處理器(阻塞部分系統(tǒng)信號,接收到系統(tǒng)信號后轉(zhuǎn)由信號處理函數(shù)處理,避免master在處理事件過程中被系統(tǒng)直接kill。在循環(huán)管理狀態(tài)中通過sigsuspend進(jìn)行阻塞等待信號,子進(jìn)程退出會接收到CHLD信號)
啟動worker進(jìn)程
檢查是否有模塊使用緩存服務(wù)如有則啟動緩存管理進(jìn)程
進(jìn)入循環(huán)管理狀態(tài)(處理nginx和系統(tǒng)信號,監(jiān)控worker進(jìn)程)
初始化
設(shè)置進(jìn)程執(zhí)行優(yōu)先級
設(shè)置進(jìn)程可打開的最大文件描述符
如果以root身份啟動進(jìn)程則根據(jù)nginx.conf配置設(shè)置進(jìn)程運(yùn)行的用戶、用戶組
如果有配置嘗試設(shè)置CPU親緣性(限定進(jìn)程在某個特定的CPU中調(diào)度,減少CPU上下文切換,均衡CPU利用率)
解除阻塞系統(tǒng)信號
執(zhí)行各模塊init_process
設(shè)置通道讀事件回調(diào)
循環(huán)處理事件及定時器
從定時事件紅黑樹中查找出最近需要執(zhí)行的定時器時間
執(zhí)行各模塊事件初始化
檢查當(dāng)前worker是否繁忙(todo),不繁忙則嘗試獲取事件監(jiān)聽鎖(避免驚群效應(yīng)),如果獲取不到則退出本次處理,也可通過配置忽略鎖
等待I/O事件喚起(如果超時仍未接收到事件則),保存I/O事件相關(guān)信息,將讀寫事件放入隊列等待后續(xù)處理
處理accept事件中接收的post數(shù)據(jù)
釋放事件監(jiān)聽鎖(允許其他worker繼續(xù)獲取監(jiān)聽鎖處理事件)
處理時間到達(dá)的定時器
處理普通事件(非accept事件)中接收的post數(shù)據(jù)
循環(huán)處理master通知信號
緩存管理處理流程ngx_exiting 檢查定時器中是否仍有未處理的事件,沒有則退出worker
ngx_terminate 直接退出worker
ngx_quit 關(guān)閉定時器、關(guān)閉socket監(jiān)聽、關(guān)閉閑置連接
ngx_reopen rotate logs
備注:緩存分為manager和loader
設(shè)置進(jìn)程類型為helper
關(guān)閉當(dāng)前進(jìn)程的socket監(jiān)聽
重置當(dāng)前進(jìn)程的最大連接數(shù)為512
初始化
設(shè)置進(jìn)程執(zhí)行優(yōu)先級
設(shè)置進(jìn)程可打開的最大文件描述符
如果以root身份啟動進(jìn)程則根據(jù)nginx.conf配置設(shè)置進(jìn)程運(yùn)行的用戶、用戶組
解除阻塞系統(tǒng)信號
執(zhí)行各模塊init_process
設(shè)置通道讀事件回調(diào)
設(shè)置定時器
循環(huán)處理事件及定時器
事件模塊 加載流程從定時事件紅黑樹中查找出最近需要執(zhí)行的定時器時間
執(zhí)行各模塊事件初始化
檢查當(dāng)前worker是否繁忙(todo),不繁忙則嘗試獲取事件監(jiān)聽鎖(避免驚群效應(yīng)),如果獲取不到則退出本次處理,也可通過配置忽略鎖
等待I/O事件喚起(如果超時仍未接收到事件則),保存I/O事件相關(guān)信息,將讀寫事件放入隊列等待后續(xù)處理
處理accept事件中接收的post數(shù)據(jù)
釋放事件監(jiān)聽鎖(允許其他worker繼續(xù)獲取監(jiān)聽鎖處理事件)
處理時間到達(dá)的定時器(manager目前ngx_http_file_cache_manager僅一個事件,主要用于清理過期的緩存文件;cache目前僅ngx_http_file_cache_loader一個事件,主要用于緩存數(shù)據(jù)到緩存文件和記錄最新訪問時間便于LRU)
處理普通事件(非accept事件)中接收的post數(shù)據(jù)
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
主要函數(shù)解析exit_master
事件結(jié)構(gòu)
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 */ } };
模塊結(jié)構(gòu)
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
檢查進(jìn)程允許打開的最大文件描述符
分配進(jìn)程間共享內(nèi)存(空間=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
進(jìn)程數(shù)設(shè)置大于1且配置開啟競爭鎖(默認(rèn)禁用)則使用 accept 競爭鎖
ngx_posted_accept_events隊列、ngx_posted_events隊列、事件定時器、連接池 等資源初始化
event_init
移除舊cycle事件
添加監(jiān)聽事件
ngx_event_core_create_conf
對配置參數(shù)進(jìn)行初始化
ngx_event_core_init_conf
判斷當(dāng)前使用的I/O事件(epoll、devpoll、kqueue、select)
對部分未設(shè)置值的參數(shù)默認(rèn)值
ngx_event_accept
新增讀事件
從等待連接的socket隊列中獲取第一個連接請求(非阻塞)
如果連接尚未準(zhǔn)備就緒則直接返回
如果當(dāng)前進(jìn)程可用最大文件描述符超過限制則刪除讀事件,標(biāo)記當(dāng)前進(jìn)程暫時停止接收新請求
重新計算當(dāng)前進(jìn)程的忙碌指數(shù)(ngx_cycle->connection_n / 8 - ngx_cycle->free_connection_n)
將socket信息保存至當(dāng)前進(jìn)程連接池中
設(shè)置I/O事件處理函數(shù)
監(jiān)聽函數(shù)處理(ngx_http_init_connection、ngx_mail_init_connection、ngx_stream_init_connection)
ngx_trylock_accept_mutex
嘗試獲取共享accept鎖
如果鎖獲取成功則添加accept事件
如果獲取鎖失敗且成功添加過accept事件則移除accept事件
ngx_event_connect_peer
從待連接池中(根據(jù)規(guī)則)獲取一個可用的連接對象
創(chuàng)建空白socket
從連接池獲取一個空閑的連接資源
設(shè)置socket為非阻塞
如果為 stream_proxy 則綁定本地端口
建立遠(yuǎn)端(upstream、proxy等)連接
添加讀寫事件
ngx_event_pipe
從上游讀取數(shù)據(jù)寫入下游
為上游添加讀事件,如果沒有設(shè)置過讀延遲標(biāo)識項則添加或刪除讀超時定時器
為下游添加寫事件,如果沒有設(shè)置過寫延遲標(biāo)識項則添加或刪除寫超時定時器
ngx_event_pipe_read_upstream
如果上游發(fā)生錯誤、讀取完成或讀事件尚未就緒則返回
如果為預(yù)讀事件則從預(yù)讀緩沖區(qū)獲取數(shù)據(jù)
如果有配置帶寬控制策略則計算當(dāng)前是否超過限制(limit = limit_rate * (now_sec - start_sec + 1) - read_length),如超過則加入定時器延時讀取
根據(jù)條件從各類管道緩沖區(qū)中選取合適的讀取
對上游輸入數(shù)據(jù)進(jìn)行過濾(input_filter)
如果設(shè)置有緩存項則將讀取的上游數(shù)據(jù)存儲至臨時文件中
ngx_event_pipe_write_to_downstream
對將向下游數(shù)據(jù)輸出及下游輸入的數(shù)據(jù)進(jìn)行過濾(output_filter)
如果循環(huán)池內(nèi)的緩沖區(qū)占用大于所設(shè)置大小則輸出數(shù)據(jù)
緩沖區(qū)資源回收
如果連續(xù)輸出超過10次則返回系統(tǒng)繁忙
如果所有緩沖區(qū)數(shù)據(jù)均已輸出則重置臨時文件游標(biāo)
將空閑的緩沖拷貝放回空閑緩沖區(qū)中
ngx_event_recvmsg
如果事件已經(jīng)到達(dá)執(zhí)行時間則添加到accept事件
設(shè)置對應(yīng)的消息控制器
從socket獲取消息
如果尚未有任何消息到達(dá)則返回
如果消息有截斷則循環(huán)多次獲取
從消息中提取其他輔助信息(如socket的頭字段、拓展的錯誤描述等)
查找連接是否已經(jīng)存在udp連接池中,如果存在則執(zhí)行事件的處理程序,否則將socket信息保存至當(dāng)前進(jìn)程udp連接池中再則執(zhí)行事件的處理程序
計算當(dāng)前進(jìn)程的忙碌指數(shù)
ngx_process_events_and_timers(詳見:worker處理流程-循環(huán)處理事件及定時器)
ngx_handle_write_event
配置如果有設(shè)置緩沖區(qū)最小發(fā)送值則添加設(shè)置到寫socket(寫入緩沖區(qū)的數(shù)據(jù)大小超過最小值后才將數(shù)據(jù)傳到協(xié)議層)
根據(jù)事件標(biāo)識和事件狀態(tài)添加或移除對應(yīng)寫事件
worker_connections
配置塊:events
值類型:uint
默認(rèn)值:512
可選范圍:1-[32位:2147483647;64位:9223372036854775807;select事件模型:FD_SETSIZE;同時受限于系統(tǒng)設(shè)置的單進(jìn)程最大文件描述符,如果設(shè)置超過將忽略設(shè)置值]
說明:設(shè)置單worker可同時處理的最大連接數(shù)(包括接收的請求以及upstream之類對外的請求),已經(jīng)在運(yùn)行的nginx減小此值設(shè)置小于已經(jīng)監(jiān)聽的連接數(shù)可能引發(fā)錯誤
use
配置塊:events
值類型:string
默認(rèn)值:根據(jù)當(dāng)前系統(tǒng)支持的I/O事件通知機(jī)制按先后順序選擇(epoll、/dev/poll、kqueue、select)
可選范圍:epoll、/dev/poll、kqueue、select
說明:設(shè)置使用特定I/O事件通知機(jī)制,不同的事件通知機(jī)制可能影響程序運(yùn)行效率;需在程序編譯時加入對應(yīng)可選參數(shù)以支持事件,否則無法設(shè)置
multi_accept
配置塊:events
值類型:string
默認(rèn)值:0(off)
可選范圍:on、off
說明:設(shè)置同一worker是否盡可能多的(在一次accept后繼續(xù))接收等待監(jiān)聽隊列中的socket,如果程序使用kqueue事件機(jī)制強(qiáng)制關(guān)閉
accept_mutex
配置塊:events
值類型:string
默認(rèn)值:0(off)
可選范圍:on、off
說明:設(shè)置是否開啟accept互斥鎖,用于控制是否多個worker同時accept(避免驚群效應(yīng)但是會降低一定效率,由于worker數(shù)一般與CPU核數(shù)一致進(jìn)程數(shù)少影響較小故默認(rèn)關(guān)閉),如果worker數(shù)小于等于1或Win32環(huán)境下強(qiáng)制關(guān)閉
accept_mutex_delay
配置塊:events
值類型:uint
默認(rèn)值:500(毫秒)
可選范圍:1-[32位:2147483647;64位:9223372036854775807;]
說明:設(shè)置accept互斥鎖延遲時間,當(dāng)某個worker超過文件最大描述符且未啟用互斥鎖時下一次嘗試accept事件的等待時間,以及I/O事件的最大等待時間
debug_connection
配置塊:events
值類型:string
默認(rèn)值:無
可選范圍:
說明:設(shè)置開啟debug日志的連接,需編譯時開啟debug參數(shù)方可設(shè)置生效
devpoll_changes
devpoll_events
epoll_events
worker_aio_requests
eventport_events
iocp_threads
post_acceptex
acceptex_read
kqueue_changes
kqueue_events
ssl_engine
http服務(wù) 初始化流程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
建立連接流程優(yōu)化server信息列表
添加各server所需地址的監(jiān)聽
設(shè)置監(jiān)聽參數(shù)(如:backlog、reuseport等),并將監(jiān)聽處理器設(shè)置為ngx_http_init_connection
查找請求對應(yīng)的server配置
設(shè)置當(dāng)前server的讀控制器(根據(jù)配置可能為:ssl、http2、http)
如果讀事件尚未準(zhǔn)備就緒則將連接放回隊列并添加讀事件
如果讀事件(數(shù)據(jù))已經(jīng)準(zhǔn)備就緒則執(zhí)行對應(yīng)讀控制器(對應(yīng)https、http2、http)
嘗試從socket中讀取數(shù)據(jù),沒有則添加讀事件后返回
創(chuàng)建ssl連接并和客戶端完成握手,若尚未完成則返回等待下次處理
如果客戶端使用的是http2協(xié)議則進(jìn)入http2處理流程,否則進(jìn)入http處理流程
發(fā)送http2的headers frame
設(shè)置單個stream的流量控制
接收客戶端請求數(shù)據(jù)
確認(rèn)客戶端請求數(shù)據(jù)包含http2連接序言,提取sid等信息并根據(jù)請求的frame類型調(diào)用對應(yīng)處理方法
HEADERS frame處理
檢查客戶端發(fā)送的frame數(shù)據(jù)是否有錯誤(包括數(shù)據(jù)大小是否超過限制、當(dāng)前處理中的請求是否超過限制等),有錯誤則發(fā)送中止stream推送信號或關(guān)閉連接返回錯誤
如果有設(shè)置優(yōu)先級則根據(jù)權(quán)重及依賴流構(gòu)建依賴樹以確定每個流的發(fā)送次序
根據(jù)stream狀態(tài)字段格式(壓縮或者非壓縮)處理狀態(tài)值
如果狀態(tài)字段未處理完成則繼續(xù)處理CONTINUATION frame
處理header相關(guān)信息
檢查cookie是否有變動,有則緩存cookie
進(jìn)入請求處理流程
添加讀事件
處理輸出隊列
處理已經(jīng)建立的連接
如果輸出緩沖區(qū)中有數(shù)據(jù)添加到輸出隊列中
如果請求尚未處理完成則返回繼續(xù)處理
清理臨時資源占用,將連接放回連接池中以待復(fù)用
添加連接閑置超時關(guān)閉事件
讀取socket中已接收信息,如果信息尚未接收完成則添加讀事件后返回
從復(fù)用連接池中移除當(dāng)前連接
處理header相關(guān)信息(host合法性檢查、解析uri、header數(shù)據(jù)是否超過大小限制等)
進(jìn)入請求處理流程
添加輸出寫事件
請求處理流程如果為https請求則檢查客戶端證書是否正確
執(zhí)行各階段檢查器
讀取請求內(nèi)容階段
ngx_http_realip_handler
根據(jù)配置從請求header的x_real_ip、x_forwarded_for、代理請求來源IP或請求來源IP中獲取客戶端真實(shí)IP
server級別的uri重寫階段
ngx_http_rewrite_handler
根據(jù)rewrite命令(rewrite、return、break、if、set、rewrite_log、uninitialized_variable_warn)執(zhí)行對應(yīng)命令的方法(在ngx_http_rewrite_commands中映射)
尋找location配置階段,該階段使用重寫之后的uri來查找對應(yīng)的location,因為location級別可能有重寫指令所以可能會被執(zhí)行多次
ngx_http_core_find_config_phase
不能添加外部檢查器
優(yōu)先靜態(tài)location、后正則匹配location
檢查客戶端將要發(fā)送的body大小是否超過限制,超過則丟棄body數(shù)據(jù)結(jié)束請求
location級別的uri重寫階段,該階段執(zhí)行l(wèi)ocation基本的重寫指令,也可能會被執(zhí)行多次
ngx_http_rewrite_handler
location級別重寫的最后處理階段
ngx_http_core_post_rewrite_phase
不能添加外部檢查器
用來檢查上階段是否有uri重寫,并根據(jù)結(jié)果跳轉(zhuǎn)到合適的階段
訪問權(quán)限控制的前一階段,該階段在權(quán)限控制階段之前,一般用于訪問控制
ngx_http_degradation_handler
當(dāng)可用內(nèi)存低于配置閥值時提供降級處理方式(返回204或444 http狀態(tài)碼)
ngx_http_limit_conn_handler
最大連接數(shù)限制
ngx_http_limit_req_handler
請求頻率限制
ngx_http_realip_handler
訪問權(quán)限控制階段
ngx_http_core_access_phase
根據(jù)配置綜合其他權(quán)限控制階段的結(jié)果決定是否拒絕訪問
ngx_http_access_handler
基于IP黑白名單權(quán)限控制
ngx_http_auth_basic_handler
基于Basic的用戶密碼權(quán)限控制
ngx_http_auth_request_handler
使用外部服務(wù)進(jìn)行權(quán)限控制,當(dāng)外部服務(wù)返回2xx時允許訪問,當(dāng)外部服務(wù)返回401或403則限制訪問
訪問權(quán)限控制的最后處理階段
ngx_http_core_post_access_phase
不能添加外部檢查器
根據(jù)權(quán)限控制階段的執(zhí)行結(jié)果進(jìn)行相應(yīng)處理
開始內(nèi)容生成前的階段
ngx_http_mirror_handler
將當(dāng)前接收到的請求鏡像一份(創(chuàng)建一份相同的子請求)異步請求第三方服務(wù),可用于流量放大壓測、跨環(huán)境測試等,第三方服務(wù)的返回將被忽略
ngx_http_try_files_handler
檢查指定順序的文件是否存在,并使用第一個找到的文件進(jìn)行請求處理,如果未找到任何文件則內(nèi)部重定向到最后一個參數(shù)指定的uri
內(nèi)容生成階段,該階段產(chǎn)生響應(yīng),并發(fā)送到客戶端
ngx_http_core_content_phase
如果該請求對應(yīng)location有設(shè)置內(nèi)容控制器(如fastcgi、grpc、proxy等)則使用對應(yīng)內(nèi)容控制器生成內(nèi)容,否則輪詢其他內(nèi)容生成階段控制器
最終如果沒有任何內(nèi)容生成階段控制器響應(yīng)該請求則根據(jù)訪問資源類型,目錄訪問返回失敗(403),文件訪問返回失敗(404)
ngx_http_autoindex_handler
處理以 "/" 結(jié)尾的GET、HEAD請求,并生成目錄列表。 當(dāng)ngx_http_index_module模塊找不到索引文件時,通常會將請求傳遞給ngx_http_autoindex_module模塊
ngx_http_dav_handler
用于通過WebDAV協(xié)議進(jìn)行文件管理,默認(rèn)未編譯該模塊,需使用 --with-http_dav_module 編譯啟用
ngx_http_gzip_static_handler
用于發(fā)送帶有".gz"文件擴(kuò)展名的預(yù)壓縮文件,只處理GET、HEAD請求,默認(rèn)未編譯該模塊,需使用 --with-http_gzip_static_module 編譯啟用
ngx_http_index_handler
處理以 "/" 結(jié)尾的GET、POST、HEAD請求,可以觸發(fā)內(nèi)部重定向至其他location
ngx_http_random_index_handler
處理以 "/" 結(jié)尾的GET、POST、HEAD請求,并在目錄中選擇一個隨機(jī)文件作為索引文件,在ngx_http_index_module模塊處理之前,默認(rèn)未編譯該模塊,需使用 --with-http_random_index_module 編譯啟用
ngx_http_static_handler
用于讀取靜態(tài)文件,只處理GET、POST、HEAD請求
日志記錄階段
ngx_http_log_handler
配置不能添加外部檢查器
記錄訪問日志
variables_hash_max_size
配置塊:http
值類型:uint
默認(rèn)值:1024
可選范圍:1-[32位:2147483647;64位:9223372036854775807;]
說明:設(shè)置變量哈希表的最大大小
variables_hash_bucket_size
配置塊:http
值類型:uint
默認(rèn)值:64
可選范圍:1-[32位:2147483647;64位:9223372036854775807;]
說明:設(shè)置變量哈希表的桶大小
server_names_hash_max_size
配置塊:http
值類型:uint
默認(rèn)值:512
可選范圍:1-[32位:2147483647;64位:9223372036854775807;]
說明:設(shè)置服務(wù)器名稱哈希表的最大大小
server_names_hash_bucket_size
配置塊:http
值類型:uint
默認(rèn)值:ngx_cacheline_size
可選范圍:1-[32位:2147483647;64位:9223372036854775807;]
說明:設(shè)置服務(wù)器名稱哈希表的存儲桶大小
server
配置塊:http
值類型:配置塊
默認(rèn)值:無
可選范圍:無
說明:設(shè)置虛擬服務(wù)器的配置
connection_pool_size
配置塊:mainhttp、server
值類型:string
默認(rèn)值:64 * 指針長度
可選范圍:k、K、M、m
說明:精確調(diào)整每個連接的內(nèi)存分配
request_pool_size
配置塊:http、server
值類型:string
默認(rèn)值:4096
可選范圍:k、K、M、m
說明:精確調(diào)整每個請求的內(nèi)存分配
client_header_timeout
配置塊:http、server
值類型:time
默認(rèn)值:60000
可選范圍:y、M、w、d、h、m、s、ms,解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]
說明:設(shè)置讀取客戶端請求頭信息的超時時間
client_header_buffer_size
配置塊:http、server
值類型:string
默認(rèn)值:1024
可選范圍:k、K、M、m
說明:設(shè)置緩沖區(qū)大小以讀取客戶端請求頭信息,當(dāng)請求頭大于此值時將嘗試使用large_client_header_buffers用以緩沖信息(但large_client_header_buffers的可用數(shù)量一般較?。?/p>
large_client_header_buffers
配置塊:http、server
值類型:uint size
默認(rèn)值:4 8192
可選范圍:1-[32位:2147483647;64位:9223372036854775807;];k、K、M、m
說明:設(shè)置用于讀取客戶端大請求頭信息緩沖區(qū)的最大數(shù)量和大小
ignore_invalid_headers
配置塊:http、server
值類型:flag
默認(rèn)值:1
可選范圍:on、off
說明:控制是否應(yīng)忽略具有無效名稱的請求頭字段(有效名稱由英文字母、數(shù)字、連字符、下劃線組成)
merge_slashes
配置塊:http、server
值類型:flag
默認(rèn)值:1
可選范圍:on、off
說明:設(shè)置是否將請求URI中重復(fù)的 "/" 壓縮成單個
underscores_in_headers
配置塊:http、server
值類型:flag
默認(rèn)值:0
可選范圍:on、off
說明:設(shè)置是否禁用請求頭中包含下劃線字段的使用
location
配置塊:server
值類型:配置塊
默認(rèn)值:無
可選范圍:無
說明:根據(jù)請求URI多帶帶設(shè)置配置(支持正則)
listen
配置塊:http、server
值類型:string
默認(rèn)值:*:80(以超級用戶權(quán)限運(yùn)行)、*:8000
可選范圍:無
說明:設(shè)置監(jiān)聽請求的地址(IP、端口、Unix域套接字)
server_name
配置塊:http、server
值類型:string
默認(rèn)值:""
可選范圍:無
說明:設(shè)置虛擬服務(wù)器的名稱(支持正則)
types_hash_max_size
配置塊:http、server、location
值類型:uint
默認(rèn)值:1024
可選范圍:1-[32位:2147483647;64位:9223372036854775807;]
說明:設(shè)置類型哈希表的最大大小
types_hash_bucket_size
配置塊:http、server、location
值類型:uint
默認(rèn)值:64
可選范圍:1-[32位:2147483647;64位:9223372036854775807;]
說明:設(shè)置類型哈希表的存儲桶大小
types
配置塊:http、server、location
值類型:配置塊
默認(rèn)值:NULL
可選范圍:無
說明:將文件擴(kuò)展名映射到對應(yīng)的MIME類型
default_type
配置塊:http、server、location
值類型:string
默認(rèn)值:text/plain
可選范圍:types中配置的映射
說明:定義默認(rèn)響應(yīng)的MIME類型
root
配置塊:http、server、location、location=>if
值類型:string
默認(rèn)值:{ 0, NULL }
可選范圍:無
說明:設(shè)置請求根目錄
alias
配置塊:location
值類型:string
默認(rèn)值:無
可選范圍:無
說明:為特定location定義別名路徑,如alias /www/www.mudoom.com/,uri為 mudoom.icon,則實(shí)際訪問 /www/www.mudoom.com/mudoom.icon 資源
limit_except
配置塊:location
值類型:配置塊
默認(rèn)值:無
可選范圍:無
說明:為特定location增加對某種HTTP請求方法的特殊限制,如限制GET請求只允許某些IP訪問
client_max_body_size
配置塊:http、server、location
值類型:buf
默認(rèn)值:1 1024 1024
可選范圍:k、K、M、m、g、G
說明:設(shè)置客戶端請求體的最大大小,Content-Length大于此值的請求將被拒絕,設(shè)為0則不限制大小
client_body_buffer_size
配置塊:http、server、location
值類型:size
默認(rèn)值:2 * ngx_pagesize
可選范圍:k、K、M、m、g、G
說明:設(shè)置客戶端請求體的緩沖區(qū)大小
client_body_timeout
配置塊:http、server、location
值類型:time
默認(rèn)值:60000
可選范圍:y、M、w、d、h、m、s、ms,解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]
說明:設(shè)置讀取客戶端請求頭信息的超時時間
client_body_temp_path
配置塊:http、server、location
值類型:string
默認(rèn)值:NGX_HTTP_CLIENT_TEMP_PATH(編譯時設(shè)置)
可選范圍:無
說明:設(shè)置用于存儲客戶端請求信息的臨時文件的目錄
client_body_in_file_only
配置塊:http、server、location
值類型:flag
默認(rèn)值:0
可選范圍:on、clean、off
說明:設(shè)置是否將請求體保存至文件中,on為保存且請求結(jié)束后不刪除臨時文件,clean則在請求結(jié)束后刪除臨時文件
client_body_in_single_buffer
配置塊:http、server、location
值類型:flag
默認(rèn)值:0
可選范圍:on、off
說明:設(shè)置是否將整個客戶端請求體保存在單個緩沖區(qū)中
sendfile
配置塊:http、server、location、location=>if
值類型:flag
默認(rèn)值:0
可選范圍:on、off
說明:設(shè)置是否使用sendfile發(fā)送文件數(shù)據(jù)
sendfile_max_chunk
配置塊:http、server、location
值類型:size
默認(rèn)值:0
可選范圍:k、K、M、m
說明:設(shè)置單個sendfile最大傳輸量,設(shè)置為0表示無限制,無限制的情況下一個快速連接可能導(dǎo)致整個worker進(jìn)程被占用
subrequest_output_buffer_size
配置塊:http、server、location
值類型:size
默認(rèn)值:ngx_pagesize
可選范圍:k、K、M、m
說明:設(shè)置用于存儲子請求輸出緩沖區(qū)大小
aio
配置塊:http、server、location
值類型:flag|string
默認(rèn)值:0
可選范圍:on、off、threads[=pool](pool為所使用的線程池名稱)
說明:設(shè)置是否啟用異步I/O,僅在FreeBSD和Linux中生效,當(dāng)在Linux上同時啟用AIO和sendfile時,AIO用于大于或等于directio設(shè)置中指定大小的文件,而sendfile用于小于該大小的文件或禁用directio被禁用時。默認(rèn)情況下程序只啟用單線程異步I/O,如需啟用多線程則在編譯時添加參數(shù) --with-threads ,僅在epoll、kqueue、eventport I/O事件類型中有效
aio_write
配置塊:http、server、location
值類型:flag
默認(rèn)值:0
可選范圍:on、off
說明:設(shè)置是否使用異步I/O寫數(shù)據(jù),需再aio開啟下使用,且僅用于寫入從代理服務(wù)模塊接收的臨時文件數(shù)據(jù)
read_ahead
配置塊:http、server、location
值類型:size
默認(rèn)值:0
可選范圍:k、K、M、m
說明:設(shè)置讀取文件時內(nèi)核的預(yù)讀取量
directio
配置塊:http、server、location
值類型:flag|size
默認(rèn)值:NGX_OPEN_FILE_DIRECTIO_OFF
可選范圍:off、k、K、M、m
說明:設(shè)置使用異步I/O還是sendfile的臨界點(diǎn)
directio_alignment
配置塊:http、server、location
值類型:size
默認(rèn)值:512
可選范圍:k、K、M、m
說明:設(shè)置directio的對齊大小,在Linux下使用XFS時,需要將其增加到4K
tcp_nopush
配置塊:http、server、location
值類型:flag
默認(rèn)值:0
可選范圍:on、off
說明:設(shè)置在socket中是否設(shè)置(Linux中)TCP_CORK或(FreeBSD中)TCP_NOPUSH參數(shù),僅在sendfile開啟有可用。該設(shè)置可能會導(dǎo)致數(shù)據(jù)不會立即發(fā)送給客戶端,而是等待待發(fā)送數(shù)據(jù)長度超過設(shè)定值或手動取消阻塞后發(fā)送,可以有助于提高大數(shù)據(jù)量的發(fā)送效率
tcp_nodelay
配置塊:http、server、location
值類型:flag
默認(rèn)值:1
可選范圍:on、off
說明:設(shè)置在socket中是否設(shè)置TCP_NODELAY參數(shù),僅在長連接、無緩沖代理、WebSocket代理中啟用。該設(shè)置會立即將數(shù)據(jù)發(fā)送給客戶端而無需等待到指定長度或時間,可以有助于提高小數(shù)據(jù)量的發(fā)送效率
send_timeout
配置塊:http、server、location
值類型:time
默認(rèn)值:60000
可選范圍:y、M、w、d、h、m、s、ms,解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]
說明:設(shè)置將響應(yīng)數(shù)據(jù)發(fā)送給客戶端的超時時間,該設(shè)置用于兩次寫操作時間的超時時間而非整個請求響應(yīng)的時間,客戶端在這個時間內(nèi)如果未響應(yīng)任何信息則連接將被關(guān)閉
send_lowat
配置塊:http、server、location
值類型:size
默認(rèn)值:0
可選范圍:k、K、M、m
說明:設(shè)置socket最小讀寫數(shù)據(jù)量,僅在kqueue I/O事件模型中生效。該設(shè)置會使內(nèi)核在讀、寫緩沖區(qū)中數(shù)據(jù)量達(dá)到該值時才通知進(jìn)程可讀寫,可以有助于內(nèi)核喚起進(jìn)程次數(shù)提高CPU利用率
postpone_output
配置塊:http、server、location
值類型:size
默認(rèn)值:1460
可選范圍:k、K、M、m
說明:設(shè)置向客戶端傳輸響應(yīng)數(shù)據(jù)的最小值,當(dāng)請求未結(jié)束、程序未強(qiáng)制執(zhí)行刷寫指令且待傳輸數(shù)據(jù)大于該值時才開始向客戶端傳輸響應(yīng)數(shù)據(jù)
limit_rate
配置塊:http、server、location
值類型:size
默認(rèn)值:0
可選范圍:k、K、M、m
說明:設(shè)置向客戶端每個連接傳輸響應(yīng)數(shù)據(jù)的速率(bytes/second),為0時表示無限制
limit_rate_after
配置塊:http、server、location
值類型:size
默認(rèn)值:0
可選范圍:k、K、M、m
說明:設(shè)置初始無響應(yīng)速率限制閥值,超過該值后開始按limit_rate限制
keepalive_timeout
配置塊:http、server、location
值類型:time [time]
默認(rèn)值:75000
可選范圍:y、M、w、d、h、m、s、ms,解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]
說明:第一個值用于控制程序長連接超時時間,第二個值用于向客戶端響應(yīng)的header中添加長連接超時時間,部分瀏覽器會根據(jù)該header控制長連接
keepalive_requests
配置塊:http、server、location
值類型:uint
默認(rèn)值:100
可選范圍:1-[32位:2147483647;64位:9223372036854775807;]
說明:設(shè)置一個長連接的最大請求數(shù),當(dāng)請求數(shù)超過該值則關(guān)閉該長連接
keepalive_disable
配置塊:http、server、location
值類型:string
默認(rèn)值:NGX_CONF_BITMASK_SET | NGX_HTTP_KEEPALIVE_DISABLE_MSIE6
可選范圍:user_agent中配置的映射
說明:設(shè)置在某些瀏覽器下禁用長連接
satisfy
配置塊:http、server、location
值類型:flag
默認(rèn)值:0
可選范圍:all、any
說明:設(shè)置訪問權(quán)限控制中是滿足任意模塊還是滿足所有模塊才允許訪問
internal
配置塊:location
值類型:無
默認(rèn)值:0
可選范圍:無
說明:設(shè)置特定location只允許內(nèi)部(重定向)請求,其他請求均返回404,且每個請求最多允許10次(NGX_HTTP_MAX_URI_CHANGES)內(nèi)部重定向
lingering_close
配置塊:http、server、location
值類型:flag
默認(rèn)值:1
可選范圍:on、off、always
說明:控制程序如何關(guān)閉客戶端連接,on為如果客戶端正在發(fā)送數(shù)據(jù)則等待數(shù)據(jù)接收完成后關(guān)閉連接,always為無條件等待指定時間(受lingering_time、lingering_timeout綜合影響)后關(guān)閉連接,off為立即關(guān)閉連接
lingering_time
配置塊:http、server、location
值類型:time
默認(rèn)值:30000
可選范圍:y、M、w、d、h、m、s、ms,解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]
說明:設(shè)置延遲關(guān)閉客戶端連接等待時間
lingering_timeout
配置塊:http、server、location
值類型:time
默認(rèn)值:5000
可選范圍:y、M、w、d、h、m、s、ms,解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]
說明:設(shè)置延遲關(guān)閉連接每次接收數(shù)據(jù)的超時時間(每次超時時間內(nèi)接收到數(shù)據(jù)都將進(jìn)入下一次超時計算,但最長不會超過lingering_time)
reset_timedout_connection
配置塊:http、server、location
值類型:flag
默認(rèn)值:0
可選范圍:on、off
說明:設(shè)置是否重置連接超時,在socket關(guān)閉后tcp將向客戶端RST以引導(dǎo)客戶端重新建立連接
absolute_redirect
配置塊:http、server、location
值類型:flag
默認(rèn)值:1
可選范圍:on、off
說明:設(shè)置是否為絕對(路徑)重定向,on為絕對(路徑)重定向,off為相對(路徑)重定向
server_name_in_redirect
配置塊:http、server、location
值類型:flag
默認(rèn)值:0
可選范圍:on、off
說明:設(shè)置是否根據(jù)客戶端請求的host返回重定向,on為使用實(shí)際請求host重定向,off為使用客戶端請求host重定向
port_in_redirect
配置塊:http、server、location
值類型:flag
默認(rèn)值:1
可選范圍:on、off
說明:設(shè)置是否在絕對(路徑)重定向中返回端口
msie_padding
配置塊:http、server、location
值類型:flag
默認(rèn)值:1
可選范圍:on、off
說明:設(shè)置是否向IE客戶端請求http狀態(tài)碼大于400的響應(yīng)中添加空白填充以達(dá)到512字節(jié)
msie_refresh
配置塊:http、server、location
值類型:flag
默認(rèn)值:0
可選范圍:on、off
說明:設(shè)置是否向IE客戶端請求發(fā)送refreshes(而非重定向)命令
log_not_found
配置塊:http、server、location
值類型:flag
默認(rèn)值:1
可選范圍:on、off
說明:設(shè)置收否記錄文件不存在錯誤日志
log_subrequest
配置塊:http、server、location
值類型:flag
默認(rèn)值:0
可選范圍:on、off
說明:設(shè)置收否記錄子請求日志
recursive_error_pages
配置塊:http、server、location
值類型:flag
默認(rèn)值:0
可選范圍:on、off
說明:設(shè)置是否使用error_page重定向請求
server_tokens
配置塊:http、server、location
值類型:flag|string
默認(rèn)值:1
可選范圍:off、on、build
說明:設(shè)置是否在請求響應(yīng)header中添加nginx版本號等信息
if_modified_since
配置塊:http、server、location
值類型:flag
默認(rèn)值:1
可選范圍:off、exact、before
說明:設(shè)置如何根據(jù)請求header中的If-Modified-Since響應(yīng)請求,off為忽略請求頭,exact為精確匹配,before為小于或等于
max_ranges
配置塊:http、server、location
值類型:uint
默認(rèn)值:0x7fffffff
可選范圍:1-[32位:2147483647;64位:9223372036854775807;]
說明:設(shè)置請求header中Ranges允許接收的最大值
chunked_transfer_encoding
配置塊:http、server、location
值類型:flag
默認(rèn)值:1
可選范圍:off、on
說明:設(shè)置禁用 HTTP/1.1 的數(shù)據(jù)分片傳輸
etag
配置塊:http、server、location
值類型:flag
默認(rèn)值:1
可選范圍:off、on
說明:設(shè)置是否自動在請求響應(yīng)header中根據(jù)返回的靜態(tài)文件類型添加ETag類型
error_page
配置塊:http、server、location
值類型:code uri
默認(rèn)值:無
可選范圍:無
說明:根據(jù)http錯誤碼響應(yīng)指定URI資源(可以為變量)
post_action
配置塊:http、server、location
值類型:string
默認(rèn)值:{ 0, NULL }
可選范圍:無
說明:內(nèi)容生成階段結(jié)束后程序?qū)⒄埱髢?nèi)部重定向至指定的location處理(可用于請求統(tǒng)計之類用途)
error_log
配置塊:http、server、location
值類型:file level
默認(rèn)值:logs/error.log error
可選范圍:無
說明:設(shè)置日志記錄路徑
open_file_cache
配置塊:http、server、location
值類型:flag
默認(rèn)值:NULL
可選范圍:off、max、inactive
說明:設(shè)置文件(讀取時)信息緩存,off關(guān)閉緩存,max設(shè)置最大緩存數(shù),inactive設(shè)置緩存過期時間
open_file_cache_valid
配置塊:http、server、location
值類型:time
默認(rèn)值:60(秒)
可選范圍:解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]
說明:設(shè)置文件信息緩存后再次驗證文件信息的時間
open_file_cache_min_uses
配置塊:http、server、location
值類型:uint
默認(rèn)值:1
可選范圍:1-[32位:2147483647;64位:9223372036854775807;]
說明:設(shè)置文件描述符保存進(jìn)文件信息緩存的最小訪問次數(shù)
open_file_cache_errors
配置塊:http、server、location
值類型:flag
默認(rèn)值:0
可選范圍:on、off
說明:設(shè)置是否保存文件訪問錯誤進(jìn)文件信息緩存
open_file_cache_events
配置塊:http、server、location
值類型:flag
默認(rèn)值:0
可選范圍:on、off
說明:暫未發(fā)現(xiàn)使用用途
resolver
配置塊:http、server、location
值類型:address ... [valid=time] [ipv6=on|off]
默認(rèn)值:創(chuàng)建虛擬解析器
可選范圍:無
說明:配置特定的DNS服務(wù)作為解析
resolver_timeout
配置塊:http、server、location
值類型:time
默認(rèn)值:30000
可選范圍:y、M、w、d、h、m、s、ms,解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]
說明:設(shè)置DNS解析超時時間
disable_symlinks
http狀態(tài)碼配置塊:http、server、location
值類型:flag
默認(rèn)值:0
可選范圍:off、on
說明:是否禁用符號連接類資源
100
NGX_HTTP_CONTINUE目前為止一切正常, 客戶端應(yīng)該繼續(xù)請求, 如果已完成請求則忽略。程序中定義未使用
101
NGX_HTTP_SWITCHING_PROTOCOLS服務(wù)器應(yīng)客戶端升級協(xié)議的請求(Upgrade請求頭)正在進(jìn)行協(xié)議切換。程序中proxy、uwsgi、scgi模塊將進(jìn)行協(xié)議切換(http2目前不支持該協(xié)議協(xié)商只支持指定協(xié)議請求)
102
NGX_HTTP_PROCESSING非通用協(xié)議,程序中定義未使用
200
NGX_HTTP_OK請求成功
201
NGX_HTTP_CREATED請求已經(jīng)被成功處理,并且創(chuàng)建了新的資源。WebDAV模塊中使用,表示(move、overwrite)文件或集合(mkcol)創(chuàng)建成功
202
NGX_HTTP_ACCEPTED服務(wù)器端已經(jīng)收到請求消息,但是尚未進(jìn)行處理。程序中定義未使用
204
NGX_HTTP_NO_CONTENT目前請求成功,但客戶端不需要更新其現(xiàn)有頁面。
206
NGX_HTTP_PARTIAL_CONTENT請求已成功,并且主體包含所請求的數(shù)據(jù)區(qū)間,該數(shù)據(jù)區(qū)間是在請求的 Range 首部指定的。
300
NGX_HTTP_SPECIAL_RESPONSE表示重定向的響應(yīng)狀態(tài)碼,表示該請求擁有多種可能的響應(yīng)。用戶代理或者用戶自身應(yīng)該從中選擇一個。程序中作為特殊響應(yīng)碼的分界值
301
NGX_HTTP_MOVED_PERMANENTLY被請求的資源已永久移動到新位置,并且將來任何對此資源的引用都應(yīng)該使用本響應(yīng)返回的若干個 URI 之一。
302
NGX_HTTP_MOVED_TEMPORARILY請求的資源現(xiàn)在臨時從不同的 URI 響應(yīng)請求。由于這樣的重定向是臨時的,客戶端應(yīng)當(dāng)繼續(xù)向原有地址發(fā)送以后的請求。
303
NGX_HTTP_SEE_OTHER對應(yīng)當(dāng)前請求的響應(yīng)可以在另一個 URI 上被找到,而且客戶端應(yīng)當(dāng)采用 GET 的方式訪問那個資源。程序定義未使用
304
NGX_HTTP_NOT_MODIFIED如果客戶端發(fā)送了一個帶條件的 GET 請求且該請求已被允許,而文檔的內(nèi)容(自上次訪問以來或者根據(jù)請求的條件)并沒有改變,則服務(wù)器應(yīng)當(dāng)返回這個狀態(tài)碼。
307
NGX_HTTP_TEMPORARY_REDIRECT請求的資源現(xiàn)在臨時從不同的URI 響應(yīng)請求。由于這樣的重定向是臨時的,客戶端應(yīng)當(dāng)繼續(xù)向原有地址發(fā)送以后的請求。程序定義未使用
308
NGX_HTTP_PERMANENT_REDIRECT這意味著資源現(xiàn)在永久位于由 Location: HTTP Response 標(biāo)頭指定的另一個 URI。程序定義未使用
400
NGX_HTTP_BAD_REQUEST語義有誤,當(dāng)前請求無法被服務(wù)器理解??蛻舳苏埱笮畔⒂姓`或請求host不存在
401
NGX_HTTP_UNAUTHORIZED當(dāng)前請求需要用戶驗證。該響應(yīng)必須包含一個適用于被請求資源的 WWW-Authenticate 信息頭用以詢問用戶信息。auth_basic模塊權(quán)限校驗失敗或upstream上游返回
403
NGX_HTTP_FORBIDDEN服務(wù)器已經(jīng)理解請求,但是拒絕執(zhí)行它。訪問權(quán)限控制階段被限制、請求的資源無讀取權(quán)限、upstream上游返回
404
NGX_HTTP_NOT_FOUND請求失敗,請求所希望得到的資源未被在服務(wù)器上發(fā)現(xiàn)。
405
NGX_HTTP_NOT_ALLOWED請求行中指定的請求方法不能被用于請求相應(yīng)的資源。
408
NGX_HTTP_REQUEST_TIME_OUT請求超時。接收客戶端請求數(shù)據(jù)超時(客戶端指定的Content-Length在指定時間內(nèi)未能接收完成)
409
NGX_HTTP_CONFLICT由于和被請求的資源的當(dāng)前狀態(tài)之間存在沖突,請求無法完成。WebDAV模塊中部分請求操作失敗
411
NGX_HTTP_LENGTH_REQUIRED服務(wù)器拒絕在沒有定義 Content-Length 頭的情況下接受請求。程序定義未使用
412
NGX_HTTP_PRECONDITION_FAILED服務(wù)器在驗證在請求的頭字段中給出先決條件時,沒能滿足其中的一個或多個。WebDAV模塊中overwrite發(fā)生錯誤或not_modified模塊中客戶端請求的判斷條件沒有滿足
413
NGX_HTTP_REQUEST_ENTITY_TOO_LARGE服務(wù)器拒絕處理當(dāng)前請求,因為該請求提交的實(shí)體數(shù)據(jù)大小超過了服務(wù)器愿意或者能夠處理的范圍。
414
NGX_HTTP_REQUEST_URI_TOO_LARGE請求的URI 長度超過了服務(wù)器能夠解釋的長度,因此服務(wù)器拒絕對該請求提供服務(wù)。
415
NGX_HTTP_UNSUPPORTED_MEDIA_TYPE對于當(dāng)前請求的方法和所請求的資源,請求中提交的實(shí)體并不是服務(wù)器中所支持的格式,因此請求被拒絕??蛻舳苏埱髸r使用請求體訪問WebDAV模塊部分方法或image_filter模塊中圖片資源數(shù)據(jù)異常
416
NGX_HTTP_RANGE_NOT_SATISFIABLE如果請求中包含了 Range 請求頭,并且 Range 中指定的任何數(shù)據(jù)范圍都與當(dāng)前資源的可用范圍不重合,同時請求中又沒有定義 If-Range 請求頭,那么服務(wù)器就應(yīng)當(dāng)返回416狀態(tài)碼。客戶端請求header中的Range不合法(格式不正確)
421
NGX_HTTP_MISDIRECTED_REQUEST該請求針對的是無法產(chǎn)生響應(yīng)的服務(wù)器。 客戶端嘗試https請求的host于server配置中host不一致
429
NGX_HTTP_TOO_MANY_REQUESTS用戶在給定的時間內(nèi)請求過于頻繁。upstream模塊中根據(jù)上游服務(wù)的返回而返回
444
NGX_HTTP_CLOSE非通用協(xié)議。程序定義未使用
494
NGX_HTTP_NGINX_CODES非通用協(xié)議。程序定義未使用
NGX_HTTP_REQUEST_HEADER_TOO_LARGE
非通用協(xié)議。客戶端請求header過大(large_header_buf已被分配完或者請求大于headerlarge_header_buf)
495
NGX_HTTPS_CERT_ERROR非通用協(xié)議??蛻舳艘詇ttps協(xié)議請求但是程序?qū)蛻舳俗C書校驗失敗
496
NGX_HTTPS_NO_CERT非通用協(xié)議??蛻舳艘詇ttps協(xié)議請求但是對應(yīng)的server塊未配置證書信息
497
NGX_HTTP_TO_HTTPS非通用協(xié)議??蛻舳艘詇ttps協(xié)議請求但是對應(yīng)的server塊未開啟ssl
499
NGX_HTTP_CLIENT_CLOSED_REQUEST非通用協(xié)議??蛻舳嗽诔绦蝽憫?yīng)前斷開了連接
500
NGX_HTTP_INTERNAL_SERVER_ERROR服務(wù)器遇到了不知道如何處理的情況。程序發(fā)生內(nèi)部錯誤(如配置錯誤、重定向錯誤等)時使用
501
NGX_HTTP_NOT_IMPLEMENTED此請求方法不被服務(wù)器支持且無法被處理。WebDAV模塊客戶端PUT請求header中使用Range、http客戶端請求header中的Transfer-Encoding無法識別時使用
502
NGX_HTTP_BAD_GATEWAY此錯誤響應(yīng)表明服務(wù)器作為網(wǎng)關(guān)需要得到一個處理這個請求的響應(yīng),但是得到一個錯誤的響應(yīng)。upstream模塊中上游服務(wù)響應(yīng)錯誤時使用
503
NGX_HTTP_SERVICE_UNAVAILABLE服務(wù)器沒有準(zhǔn)備好處理請求。 limit_conn(觸發(fā)請求數(shù)限制)、limit_req(觸發(fā)速率限制)、upstream模塊中使用
504
NGX_HTTP_GATEWAY_TIME_OUT當(dāng)服務(wù)器作為網(wǎng)關(guān),不能及時得到響應(yīng)時返回此錯誤代碼。upstream模塊中上游服務(wù)響應(yīng)超時時使用
505
NGX_HTTP_VERSION_NOT_SUPPORTED服務(wù)器不支持請求中所使用的HTTP協(xié)議版本。
507
NGX_HTTP_INSUFFICIENT_STORAGEmail服務(wù) 初始化流程服務(wù)器有內(nèi)部配置錯誤。WebDAV模塊中發(fā)生NGX_ENOSPC錯誤時使用
create_main_conf
create_srv_conf
init_main_conf
merge_srv_conf
ngx_mail_add_ports
ngx_mail_optimize_servers
建立連接流程優(yōu)化監(jiān)聽列表,如果相同端口有泛IP監(jiān)聽則忽略其他指定IP地址的監(jiān)聽
添加各server所需地址的監(jiān)聽
設(shè)置監(jiān)聽參數(shù)(如:backlog、rcvbuf等),并將監(jiān)聽處理器設(shè)置為ngx_mail_init_connection
查找請求對應(yīng)的server配置(根據(jù)server配置可確定當(dāng)前請求對應(yīng)的mail協(xié)議)
設(shè)置當(dāng)前server的讀控制器(根據(jù)配置可能為:ssl、非ssl)
執(zhí)行對應(yīng)讀控制器(對應(yīng)ssl、非ssl)
創(chuàng)建ssl連接并和客戶端完成握手,若尚未完成則添加超時定時器后返回等待下次處理
檢查客戶端證書
如果當(dāng)前server配置中的STARTTLS命令未關(guān)閉則執(zhí)行對應(yīng)協(xié)議(imap、pop3、smtp)的init_protocol方法后返回
否則進(jìn)入session初始化流程
進(jìn)入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)事件
檢查請求是否超時,超時則關(guān)閉連接
創(chuàng)建臨時緩沖區(qū)
讀取客戶端請求命令(一次無法讀取完則添加讀事件返回等待下次處理)
如果客戶端發(fā)送命令數(shù)據(jù)過大則退出本次請求
解析客戶端請求命令并根據(jù)命令提取相應(yīng)鑒權(quán)驗證信息
將授權(quán)驗證信息發(fā)送至上游身份驗證服務(wù)(根據(jù)auth_http配置)
檢查上游身份驗證服務(wù)的返回結(jié)果,如果失敗則根據(jù)配置絕對是否返回錯誤信息給客戶端,否則將嚴(yán)重服務(wù)器身份驗證服務(wù)返回的郵件服務(wù)地址及授權(quán)信息(授權(quán)密鑰)存儲于輸出緩沖區(qū)
如果輸出緩沖區(qū)存在數(shù)據(jù)則向客戶端發(fā)送數(shù)據(jù)
stream服務(wù) 初始化流程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
建立連接流程優(yōu)化監(jiān)聽列表,如果相同端口有泛IP監(jiān)聽則忽略其他指定IP地址的監(jiān)聽
添加各server所需地址的監(jiān)聽
設(shè)置監(jiān)聽參數(shù)(如:backlog、keepalive等)
查找請求對應(yīng)的server配置
如果有配置使用accept互斥鎖則將讀事件添加到普通事件(非accept事件)隊列中
進(jìn)入請求處理流程
請求處理流程讀取請求內(nèi)容階段
ngx_stream_realip_handler
獲取客戶端真實(shí)IP
訪問權(quán)限控制的前一階段,該階段在權(quán)限控制階段之前,一般用于訪問控制
ngx_stream_limit_conn_handler
最大連接數(shù)限制
訪問權(quán)限控制階段
ngx_stream_access_handler
基于IP黑白名單權(quán)限控制
訪問建立ssl階段
ngx_stream_ssl_handler
建立ssl連接
請求數(shù)據(jù)預(yù)讀階段
ngx_stream_core_preread_phase
創(chuàng)建臨時緩沖區(qū)
讀取客戶端請求數(shù)據(jù)
如果客戶端數(shù)據(jù)請求尚未接收完成則添加讀事件后返回等待下次處理
ngx_stream_ssl_preread_handler
讀取SSL請求數(shù)據(jù)
內(nèi)容生成階段,該階段產(chǎn)生響應(yīng),并發(fā)送到客戶端
ngx_stream_core_content_phase
轉(zhuǎn)發(fā)客戶端請求至對應(yīng)上游服務(wù),并將上游服務(wù)的響應(yīng)返回給客戶端
日志記錄階段
ngx_stream_log_handler
參考文檔不能添加外部檢查器
記錄訪問日志
Nginx開發(fā)從入門到精通
CPU緩存 - 維基百科
Page (computer memory))
OpenEvent
Linux管道編程技術(shù):dup函數(shù),dup2函數(shù),open函數(shù)詳解
Nginx Caching
紅黑樹
nginx documentation
Hypertext Transfer Protocol Version 2 (HTTP/2)
HTTP 響應(yīng)代碼
Configuring NGINX as a Mail Proxy Server
源地址 By佐柱
轉(zhuǎn)載請注明出處,也歡迎偶爾逛逛我的小站,謝謝 :)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/40272.html
摘要:每個模塊由以下幾部分構(gòu)成結(jié)構(gòu)體代表模塊本身,其指針被放入數(shù)組中。結(jié)構(gòu)體用來表示模塊的配置內(nèi)容,其中部分成員可以通過配置文件進(jìn)行配置。調(diào)用該中的函數(shù),該函數(shù)最終初始化模塊對應(yīng)的結(jié)構(gòu)體,完成配置。因此,分析源碼中的配置指令,就是分析結(jié)構(gòu)體。 本篇的上篇 Nginx 源碼分析:從模塊到配置(上),建議閱讀本篇前先閱讀上篇。 關(guān)于模塊 Nginx的架構(gòu)高度模塊化。每個模塊各司其職,組合在一...
摘要:第一階段基礎(chǔ)階段基礎(chǔ)程序員重點(diǎn)把搞熟練核心是安裝配置基本操作目標(biāo)能夠完成基本的系統(tǒng)安裝,簡單配置維護(hù)能夠做基本的簡單系統(tǒng)的開發(fā)能夠在中型系統(tǒng)中支持某個功能模塊的開發(fā)。本項不做重點(diǎn)學(xué)習(xí),除非對前端有興趣。 第一階段:基礎(chǔ)階段(基礎(chǔ)PHP程序員) 重點(diǎn):把LNMP搞熟練(核心是安裝配置基本操作) 目標(biāo):能夠完成基本的LNMP系統(tǒng)安裝,簡單配置維護(hù);能夠做基本的簡單系統(tǒng)的PHP開發(fā);能夠在P...
摘要:關(guān)于有一套設(shè)計良好的源碼,以供分析,本文從結(jié)構(gòu)體來分析源碼結(jié)構(gòu)??偨Y(jié)初次閱讀源碼,先從結(jié)構(gòu)體開始學(xué)習(xí),開篇之作,再接再厲。 關(guān)于 nginx有一套設(shè)計良好的源碼,以供分析,本文從ngx_module_t結(jié)構(gòu)體來分析nginx源碼結(jié)構(gòu)。ngx_module_t是整個nginx的關(guān)鍵,它提供了整個nginx的模塊化的基礎(chǔ)。因此,看懂ngx_module_t結(jié)構(gòu)體才能開始入門nginx源碼閱...
摘要:源碼解讀系列一好難都跑不起來怎么破了解一下唄閱讀框架源碼第一步搞定環(huán)境小伙伴剛接觸的時候會感覺壓力有點(diǎn)大更直觀的說法是難開發(fā)組是不贊成難這個說法的的代碼都是實(shí)現(xiàn)的而又是世界上最好的語言的代碼閱讀起來是很輕松的開發(fā)組會用源碼解讀系列博客深 date: 2018-8-01 14:22:17title: swoft| 源碼解讀系列一: 好難! swoft demo 都跑不起來怎么破? doc...
摘要:源碼解讀系列一好難都跑不起來怎么破了解一下唄閱讀框架源碼第一步搞定環(huán)境小伙伴剛接觸的時候會感覺壓力有點(diǎn)大更直觀的說法是難開發(fā)組是不贊成難這個說法的的代碼都是實(shí)現(xiàn)的而又是世界上最好的語言的代碼閱讀起來是很輕松的開發(fā)組會用源碼解讀系列博客深 date: 2018-8-01 14:22:17title: swoft| 源碼解讀系列一: 好難! swoft demo 都跑不起來怎么破? doc...
閱讀 3275·2023-04-25 22:47
閱讀 3790·2021-10-11 10:59
閱讀 2317·2021-09-07 10:12
閱讀 4274·2021-08-11 11:15
閱讀 3442·2019-08-30 13:15
閱讀 1760·2019-08-30 13:00
閱讀 979·2019-08-29 14:02
閱讀 1698·2019-08-26 13:57