用於接收外部信號發送給worker進程,如stop、restart、reload等html
監控worker進程運行狀態,worker異常退出後從新啓動新的worker進程node
緩存管理nginx
- 處理基本網絡事件,如http、mail請求等
調試狀況下使用,直接使用單進程處理網絡事件git
- 配置塊:main
- 值類型:flag
- 默認值:1
- 可選範圍:on、off
- 說明:是否使用守護進程模式開啓服務
- 配置塊:main
- 值類型:flag
- 默認值:1
- 可選範圍:on、off
- 說明:是否開啓master管理進程,主要用於nginx開發調試,關閉狀態下不會開啓accept互斥鎖
- 配置塊:main
- 值類型:time
- 默認值:0
- 可選範圍:y、M、w、d、h、m、s、ms,解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]
- 說明:用於控制gettimeofday()的系統調用時機,未設置的狀況下每次系統事件都將調用gettimeofday(),設置後將以該時間調用gettimeofday()
- 配置塊:main
- 值類型:string
- 默認值:logs/nginx.pid(根據編譯時設置,未設置則爲該值)
- 可選範圍:—
- 說明:用於設置主進程pid的存放路徑
- 配置塊:main
- 值類型:string
- 默認值:logs/nginx.lock(根據編譯時設置,未設置則爲該值)
- 可選範圍:—
- 說明:用於不支持原子操做的系統使用文件鎖做爲accept互斥鎖,支持原子操做的系統將忽略該值
- 配置塊:main
- 值類型:unit|string(auto)
- 默認值:1
- 可選範圍:1-[32位:2147483647;64位:9223372036854775807;]
- 說明:設置worker進程數,建議使用auto由程序根據當前系統環境CPU核數設置(等於CPU核數,若是小於1則設置爲1)
- 配置塊:main
- 值類型:uint
- 默認值:0
- 可選範圍:1-[32位:2147483647;64位:9223372036854775807;]
- 說明:用於監測到內部錯誤時停止或中止進程以進行進一步的調試
- 配置塊:main
- 值類型:string
- 默認值:nobody [nobody]
- 可選範圍:-
- 說明:設置worker進程使用什麼用戶和用戶組身份啓動
- 配置塊:main
- 值類型:int
- 默認值:0
- 可選範圍:-20-20
- 說明:設置worker進程的調度優先級,數值越小表示優先級越高
- 配置塊:main
- 值類型:umask|string(auto)
- 默認值:—
- 可選範圍:—
- 說明:將工做進程綁定到CPU組用以減小CPU上下文切換,默認狀況下不綁定,設置不存在的CPU掩碼將被忽略
- 配置塊:main
- 值類型:uint
- 默認值:—
- 可選範圍:—
- 說明:修改worker進程的最大文件描述符限制,用於在不從新啓動master進程的狀況下修改限制
- 配置塊:main
- 值類型:uint
- 默認值:—
- 可選範圍:—
- 說明:修改worker進程的核心文件最大限制,用於在不從新啓動master進程的狀況下修改限制
- 配置塊:main
- 值類型:time
- 默認值:0
- 可選範圍:y、M、w、d、h、m、s、ms,解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]
- 說明:設置worker進程的結束等待時間(收到結束信號後worker可能還有未處理完的請求,默認系統將等待全部請求處理完成後退出),設置該時間後worker將在到期時直接關閉全部持有的鏈接
- 配置塊:main
- 值類型:string
- 默認值:—
- 可選範圍:—
- 說明:設置工做目錄
- 配置塊:main
- 值類型:string
- 默認值:TZ
- 可選範圍:—
- 說明:默認狀況下程序在啓動時將移除除了時區外的全部環境變量,可用該參數設置須要的環境變量
- 配置塊:main
- 值類型:string
- 默認值:—
- 可選範圍:—
- 說明:用於加載動態模塊
- 初始化日誌格式
- 打開日誌文件獲取文件句柄(讀寫刪共享鎖)
SSL初始化github
保存啓動參數編程
解析配置文件路徑瀏覽器
運行環境系統初始化緩存
- 獲取cpu緩存塊大小(若是有一級CPU緩存則使用一級緩存大小)ngx_cacheline_size
- 獲取內存頁大小 ngx_pagesize
- 獲取CPU核數(若是小於一核則設置爲1核)
壓縮表初始化服務器
若是爲繼承關係則繼承原socket信息cookie
模塊預初始化(將所需加載的模塊信息加入全局變量,程序所需加載的模塊列表在程序編譯時根據配置輸出至ngx_modules全局變量中)
輪訓初始化
- 加載配置
- 加載模塊
- 建立共享內存
- 關閉無用socket和已打開文件
- socket監聽及配置
- 設置信號處理器(阻塞部分系統信號,接收到系統信號後轉由信號處理函數處理,避免master在處理事件過程當中被系統直接kill。在循環管理狀態中經過sigsuspend進行阻塞等待信號,子進程退出會接收到CHLD信號)
- 啓動worker進程
- 檢查是否有模塊使用緩存服務若有則啓動緩存管理進程
- 進入循環管理狀態(處理nginx和系統信號,監控worker進程)
- 設置進程執行優先級
- 設置進程可打開的最大文件描述符
- 若是以root身份啓動進程則根據nginx.conf配置設置進程運行的用戶、用戶組
- 若是有配置嘗試設置CPU親緣性(限定進程在某個特定的CPU中調度,減小CPU上下文切換,均衡CPU利用率)
- 解除阻塞系統信號
- 執行各模塊init_process
- 設置通道讀事件回調
- 從定時事件紅黑樹中查找出最近須要執行的定時器時間
- 執行各模塊事件初始化
- 檢查當前worker是否繁忙(todo),不繁忙則嘗試獲取事件監聽鎖(避免驚羣效應),若是獲取不到則退出本次處理,也可經過配置忽略鎖
- 等待I/O事件喚起(若是超時仍未接收到事件則),保存I/O事件相關信息,將讀寫事件放入隊列等待後續處理
- 處理accept事件中接收的post數據
- 釋放事件監聽鎖(容許其餘worker繼續獲取監聽鎖處理事件)
- 處理時間到達的定時器
- 處理普通事件(非accept事件)中接收的post數據
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數據
- create_conf
- command->set
- init_conf
- init_module
- init_event(actions.init)
- init_process(init_thread)
- add_event
- 事件喚起
- process_events
- event_handle
- exit_process
- 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_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])
- 進程數設置大於1且配置開啓競爭鎖(默認禁用)則使用 accept 競爭鎖
- ngx_posted_accept_events隊列、ngx_posted_events隊列、事件定時器、鏈接池 等資源初始化
- event_init
- 移除舊cycle事件
- 添加監聽事件
- 對配置參數進行初始化
- 判斷當前使用的I/O事件(epoll、devpoll、kqueue、select)
- 對部分未設置值的參數默認值
- 新增讀事件
- 從等待鏈接的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)
- 嘗試獲取共享accept鎖
- 若是鎖獲取成功則添加accept事件
- 若是獲取鎖失敗且成功添加過accept事件則移除accept事件
- 從待鏈接池中(根據規則)獲取一個可用的鏈接對象
- 建立空白socket
- 從鏈接池獲取一個空閒的鏈接資源
- 設置socket爲非阻塞
- 若是爲 stream_proxy 則綁定本地端口
- 創建遠端(upstream、proxy等)鏈接
- 添加讀寫事件
- 從上游讀取數據寫入下游
- 爲上游添加讀事件,若是沒有設置過讀延遲標識項則添加或刪除讀超時定時器
- 爲下游添加寫事件,若是沒有設置過寫延遲標識項則添加或刪除寫超時定時器
- 若是上游發生錯誤、讀取完成或讀事件還沒有就緒則返回
- 若是爲預讀事件則從預讀緩衝區獲取數據
- 若是有配置帶寬控制策略則計算當前是否超過限制(limit = limit_rate * (now_sec - start_sec + 1) - read_length),如超過則加入定時器延時讀取
- 根據條件從各種管道緩衝區中選取合適的讀取
- 對上游輸入數據進行過濾(input_filter)
- 若是設置有緩存項則將讀取的上游數據存儲至臨時文件中
- 對將向下遊數據輸出及下游輸入的數據進行過濾(output_filter)
- 若是循環池內的緩衝區佔用大於所設置大小則輸出數據
- 緩衝區資源回收
- 若是連續輸出超過10次則返回系統繁忙
- 若是全部緩衝區數據均已輸出則重置臨時文件遊標
- 將空閒的緩衝拷貝放回空閒緩衝區中
- 若是事件已經到達執行時間則添加到accept事件
- 設置對應的消息控制器
- 從socket獲取消息
- 若是還沒有有任何消息到達則返回
- 若是消息有截斷則循環屢次獲取
- 從消息中提取其餘輔助信息(如socket的頭字段、拓展的錯誤描述等)
- 查找鏈接是否已經存在udp鏈接池中,若是存在則執行事件的處理程序,不然將socket信息保存至當前進程udp鏈接池中再則執行事件的處理程序
- 計算當前進程的忙碌指數
ngx_process_events_and_timers(詳見:worker處理流程-循環處理事件及定時器)
ngx_handle_write_event
- 若是有設置緩衝區最小發送值則添加設置到寫socket(寫入緩衝區的數據大小超過最小值後纔將數據傳到協議層)
- 根據事件標識和事件狀態添加或移除對應寫事件
- 配置塊:events
- 值類型:uint
- 默認值:512
- 可選範圍:1-[32位:2147483647;64位:9223372036854775807;select事件模型:FD_SETSIZE;同時受限於系統設置的單進程最大文件描述符,若是設置超過將忽略設置值]
- 說明:設置單worker可同時處理的最大鏈接數(包括接收的請求以及upstream之類對外的請求),已經在運行的nginx減少此值設置小於已經監聽的鏈接數可能引起錯誤
- 配置塊:events
- 值類型:string
- 默認值:根據當前系統支持的I/O事件通知機制按前後順序選擇(epoll、/dev/poll、kqueue、select)
- 可選範圍:epoll、/dev/poll、kqueue、select
- 說明:設置使用特定I/O事件通知機制,不一樣的事件通知機制可能影響程序運行效率;需在程序編譯時加入對應可選參數以支持事件,不然沒法設置
- 配置塊:events
- 值類型:string
- 默認值:0(off)
- 可選範圍:on、off
- 說明:設置同一worker是否儘量多的(在一次accept後繼續)接收等待監聽隊列中的socket,若是程序使用kqueue事件機制強制關閉
- 配置塊:events
- 值類型:string
- 默認值:0(off)
- 可選範圍:on、off
- 說明:設置是否開啓accept互斥鎖,用於控制是否多個worker同時accept(避免驚羣效應可是會下降必定效率,因爲worker數通常與CPU核數一致進程數少影響較小故默認關閉),若是worker數小於等於1或Win32環境下強制關閉
- 配置塊:events
- 值類型:uint
- 默認值:500(毫秒)
- 可選範圍:1-[32位:2147483647;64位:9223372036854775807;]
- 說明:設置accept互斥鎖延遲時間,當某個worker超過文件最大描述符且未啓用互斥鎖時下一次嘗試accept事件的等待時間,以及I/O事件的最大等待時間
- 配置塊:events
- 值類型:string
- 默認值:無
- 可選範圍:
- 說明:設置開啓debug日誌的鏈接,需編譯時開啓debug參數方可設置生效
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、http二、http)
若是讀事件還沒有準備就緒則將鏈接放回隊列並添加讀事件
若是讀事件(數據)已經準備就緒則執行對應讀控制器(對應https、http二、http)
嘗試從socket中讀取數據,沒有則添加讀事件後返回
建立ssl鏈接並和客戶端完成握手,若還沒有完成則返回等待下次處理
若是客戶端使用的是http2協議則進入http2處理流程,不然進入http處理流程
發送http2的headers frame
設置單個stream的流量控制
接收客戶端請求數據
確認客戶端請求數據包含http2鏈接序言,提取sid等信息並根據請求的frame類型調用對應處理方法
HEADERS frame處理
- 檢查客戶端發送的frame數據是否有錯誤(包括數據大小是否超過限制、當前處理中的請求是否超過限制等),有錯誤則發送停止stream推送信號或關閉鏈接返回錯誤
- 若是有設置優先級則根據權重及依賴流構建依賴樹以肯定每一個流的發送次序
- 根據stream狀態字段格式(壓縮或者非壓縮)處理狀態值
- 若是狀態字段未處理完成則繼續處理CONTINUATION frame
- 處理header相關信息
- 檢查cookie是否有變更,有則緩存cookie
- 進入請求處理流程
添加讀事件
處理輸出隊列
處理已經創建的鏈接
- 若是輸出緩衝區中有數據添加到輸出隊列中
- 若是請求還沒有處理完成則返回繼續處理
- 清理臨時資源佔用,將鏈接放回鏈接池中以待複用
- 添加鏈接閒置超時關閉事件
若是爲https請求則檢查客戶端證書是否正確
執行各階段檢查器
讀取請求內容階段
根據配置從請求header的x_real_ip、x_forwarded_for、代理請求來源IP或請求來源IP中獲取客戶端真實IP
server級別的uri重寫階段
根據rewrite命令(rewrite、return、break、if、set、rewrite_log、uninitialized_variable_warn)執行對應命令的方法(在ngx_http_rewrite_commands中映射)
尋找location配置階段,該階段使用重寫以後的uri來查找對應的location,由於location級別可能有重寫指令因此可能會被執行屢次
- 不能添加外部檢查器
- 優先靜態location、後正則匹配location
- 檢查客戶端將要發送的body大小是否超過限制,超過則丟棄body數據結束請求
location級別的uri重寫階段,該階段執行location基本的重寫指令,也可能會被執行屢次
location級別重寫的最後處理階段
- 不能添加外部檢查器
- 用來檢查上階段是否有uri重寫,並根據結果跳轉到合適的階段
訪問權限控制的前一階段,該階段在權限控制階段以前,通常用於訪問控制
當可用內存低於配置閥值時提供降級處理方式(返回204或444 http狀態碼)
最大鏈接數限制
請求頻率限制
訪問權限控制階段
根據配置綜合其餘權限控制階段的結果決定是否拒絕訪問
基於IP黑白名單權限控制
基於Basic的用戶密碼權限控制
使用外部服務進行權限控制,當外部服務返回2xx時容許訪問,當外部服務返回401或403則限制訪問
訪問權限控制的最後處理階段
- 不能添加外部檢查器
- 根據權限控制階段的執行結果進行相應處理
開始內容生成前的階段
將當前接收到的請求鏡像一份(建立一份相同的子請求)異步請求第三方服務,可用於流量放大壓測、跨環境測試等,第三方服務的返回將被忽略
檢查指定順序的文件是否存在,並使用第一個找到的文件進行請求處理,若是未找到任何文件則內部重定向到最後一個參數指定的uri
內容生成階段,該階段產生響應,併發送到客戶端
- 若是該請求對應location有設置內容控制器(如fastcgi、grpc、proxy等)則使用對應內容控制器生成內容,不然輪詢其餘內容生成階段控制器
- 最終若是沒有任何內容生成階段控制器響應該請求則根據訪問資源類型,目錄訪問返回失敗(403),文件訪問返回失敗(404)
處理以 '/' 結尾的GET、HEAD請求,並生成目錄列表。 當ngx_http_index_module模塊找不到索引文件時,一般會將請求傳遞給ngx_http_autoindex_module模塊
用於經過WebDAV協議進行文件管理,默認未編譯該模塊,需使用 --with-http_dav_module 編譯啓用
用於發送帶有".gz"文件擴展名的預壓縮文件,只處理GET、HEAD請求,默認未編譯該模塊,需使用 --with-http_gzip_static_module 編譯啓用
處理以 '/' 結尾的GET、POST、HEAD請求,能夠觸發內部重定向至其餘location
處理以 '/' 結尾的GET、POST、HEAD請求,並在目錄中選擇一個隨機文件做爲索引文件,在ngx_http_index_module模塊處理以前,默認未編譯該模塊,需使用 --with-http_random_index_module 編譯啓用
用於讀取靜態文件,只處理GET、POST、HEAD請求
日誌記錄階段
- 不能添加外部檢查器
- 記錄訪問日誌
- 配置塊:http
- 值類型:uint
- 默認值:1024
- 可選範圍:1-[32位:2147483647;64位:9223372036854775807;]
- 說明:設置變量哈希表的最大大小
- 配置塊:http
- 值類型:uint
- 默認值:64
- 可選範圍:1-[32位:2147483647;64位:9223372036854775807;]
- 說明:設置變量哈希表的桶大小
- 配置塊:http
- 值類型:uint
- 默認值:512
- 可選範圍:1-[32位:2147483647;64位:9223372036854775807;]
- 說明:設置服務器名稱哈希表的最大大小
- 配置塊:http
- 值類型:uint
- 默認值:ngx_cacheline_size
- 可選範圍:1-[32位:2147483647;64位:9223372036854775807;]
- 說明:設置服務器名稱哈希表的存儲桶大小
- 配置塊:http
- 值類型:配置塊
- 默認值:無
- 可選範圍:無
- 說明:設置虛擬服務器的配置
- 配置塊:mainhttp、server
- 值類型:string
- 默認值:64 * 指針長度
- 可選範圍:k、K、M、m
- 說明:精確調整每一個鏈接的內存分配
- 配置塊:http、server
- 值類型:string
- 默認值:4096
- 可選範圍:k、K、M、m
- 說明:精確調整每一個請求的內存分配
- 配置塊:http、server
- 值類型:time
- 默認值:60000
- 可選範圍:y、M、w、d、h、m、s、ms,解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]
- 說明:設置讀取客戶端請求頭信息的超時時間
- 配置塊:http、server
- 值類型:string
- 默認值:1024
- 可選範圍:k、K、M、m
- 說明:設置緩衝區大小以讀取客戶端請求頭信息,當請求頭大於此值時將嘗試使用large_client_header_buffers用以緩衝信息(但large_client_header_buffers的可用數量通常較小)
- 配置塊:http、server
- 值類型:uint size
- 默認值:4 8192
- 可選範圍:1-[32位:2147483647;64位:9223372036854775807;];k、K、M、m
- 說明:設置用於讀取客戶端大請求頭信息緩衝區的最大數量和大小
- 配置塊:http、server
- 值類型:flag
- 默認值:1
- 可選範圍:on、off
- 說明:控制是否應忽略具備無效名稱的請求頭字段(有效名稱由英文字母、數字、連字符、下劃線組成)
- 配置塊:http、server
- 值類型:flag
- 默認值:1
- 可選範圍:on、off
- 說明:設置是否將請求URI中重複的 '/' 壓縮成單個
- 配置塊:http、server
- 值類型:flag
- 默認值:0
- 可選範圍:on、off
- 說明:設置是否禁用請求頭中包含下劃線字段的使用
- 配置塊:server
- 值類型:配置塊
- 默認值:無
- 可選範圍:無
- 說明:根據請求URI單獨設置配置(支持正則)
- 配置塊:http、server
- 值類型:string
- 默認值:*:80(以超級用戶權限運行)、*:8000
- 可選範圍:無
- 說明:設置監聽請求的地址(IP、端口、Unix域套接字)
- 配置塊:http、server
- 值類型:string
- 默認值:""
- 可選範圍:無
- 說明:設置虛擬服務器的名稱(支持正則)
- 配置塊:http、server、location
- 值類型:uint
- 默認值:1024
- 可選範圍:1-[32位:2147483647;64位:9223372036854775807;]
- 說明:設置類型哈希表的最大大小
- 配置塊:http、server、location
- 值類型:uint
- 默認值:64
- 可選範圍:1-[32位:2147483647;64位:9223372036854775807;]
- 說明:設置類型哈希表的存儲桶大小
- 配置塊:http、server、location
- 值類型:配置塊
- 默認值:NULL
- 可選範圍:無
- 說明:將文件擴展名映射到對應的MIME類型
- 配置塊:http、server、location
- 值類型:string
- 默認值:text/plain
- 可選範圍:types中配置的映射
- 說明:定義默認響應的MIME類型
- 配置塊:http、server、location、location=>if
- 值類型:string
- 默認值:{ 0, NULL }
- 可選範圍:無
- 說明:設置請求根目錄
- 配置塊:location
- 值類型:string
- 默認值:無
- 可選範圍:無
- 說明:爲特定location定義別名路徑,如alias /www/www.mudoom.com/,uri爲 mudoom.icon,則實際訪問 /www/www.mudoom.com/mudoom.icon 資源
- 配置塊:location
- 值類型:配置塊
- 默認值:無
- 可選範圍:無
- 說明:爲特定location增長對某種HTTP請求方法的特殊限制,如限制GET請求只容許某些IP訪問
- 配置塊:http、server、location
- 值類型:buf
- 默認值:1 * 1024 * 1024
- 可選範圍:k、K、M、m、g、G
- 說明:設置客戶端請求體的最大大小,Content-Length大於此值的請求將被拒絕,設爲0則不限制大小
- 配置塊:http、server、location
- 值類型:size
- 默認值:2 * ngx_pagesize
- 可選範圍:k、K、M、m、g、G
- 說明:設置客戶端請求體的緩衝區大小
- 配置塊:http、server、location
- 值類型:time
- 默認值:60000
- 可選範圍:y、M、w、d、h、m、s、ms,解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]
- 說明:設置讀取客戶端請求頭信息的超時時間
- 配置塊:http、server、location
- 值類型:string
- 默認值:NGX_HTTP_CLIENT_TEMP_PATH(編譯時設置)
- 可選範圍:無
- 說明:設置用於存儲客戶端請求信息的臨時文件的目錄
- 配置塊:http、server、location
- 值類型:flag
- 默認值:0
- 可選範圍:on、clean、off
- 說明:設置是否將請求體保存至文件中,on爲保存且請求結束後不刪除臨時文件,clean則在請求結束後刪除臨時文件
- 配置塊:http、server、location
- 值類型:flag
- 默認值:0
- 可選範圍:on、off
- 說明:設置是否將整個客戶端請求體保存在單個緩衝區中
- 配置塊:http、server、location、location=>if
- 值類型:flag
- 默認值:0
- 可選範圍:on、off
- 說明:設置是否使用sendfile發送文件數據
- 配置塊:http、server、location
- 值類型:size
- 默認值:0
- 可選範圍:k、K、M、m
- 說明:設置單個sendfile最大傳輸量,設置爲0表示無限制,無限制的狀況下一個快速鏈接可能致使整個worker進程被佔用
- 配置塊:http、server、location
- 值類型:size
- 默認值:ngx_pagesize
- 可選範圍:k、K、M、m
- 說明:設置用於存儲子請求輸出緩衝區大小
- 配置塊: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事件類型中有效
- 配置塊:http、server、location
- 值類型:flag
- 默認值:0
- 可選範圍:on、off
- 說明:設置是否使用異步I/O寫數據,需再aio開啓下使用,且僅用於寫入從代理服務模塊接收的臨時文件數據
- 配置塊:http、server、location
- 值類型:size
- 默認值:0
- 可選範圍:k、K、M、m
- 說明:設置讀取文件時內核的預讀取量
- 配置塊:http、server、location
- 值類型:flag|size
- 默認值:NGX_OPEN_FILE_DIRECTIO_OFF
- 可選範圍:off、k、K、M、m
- 說明:設置使用異步I/O仍是sendfile的臨界點
- 配置塊:http、server、location
- 值類型:size
- 默認值:512
- 可選範圍:k、K、M、m
- 說明:設置directio的對齊大小,在Linux下使用XFS時,須要將其增長到4K
- 配置塊:http、server、location
- 值類型:flag
- 默認值:0
- 可選範圍:on、off
- 說明:設置在socket中是否設置(Linux中)TCP_CORK或(FreeBSD中)TCP_NOPUSH參數,僅在sendfile開啓有可用。該設置可能會致使數據不會當即發送給客戶端,而是等待待發送數據長度超過設定值或手動取消阻塞後發送,能夠有助於提升大數據量的發送效率
- 配置塊:http、server、location
- 值類型:flag
- 默認值:1
- 可選範圍:on、off
- 說明:設置在socket中是否設置TCP_NODELAY參數,僅在長鏈接、無緩衝代理、WebSocket代理中啓用。該設置會當即將數據發送給客戶端而無需等待到指定長度或時間,能夠有助於提升小數據量的發送效率
- 配置塊:http、server、location
- 值類型:time
- 默認值:60000
- 可選範圍:y、M、w、d、h、m、s、ms,解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]
- 說明:設置將響應數據發送給客戶端的超時時間,該設置用於兩次寫操做時間的超時時間而非整個請求響應的時間,客戶端在這個時間內若是未響應任何信息則鏈接將被關閉
- 配置塊:http、server、location
- 值類型:size
- 默認值:0
- 可選範圍:k、K、M、m
- 說明:設置socket最小讀寫數據量,僅在kqueue I/O事件模型中生效。該設置會使內核在讀、寫緩衝區中數據量達到該值時才通知進程可讀寫,能夠有助於內核喚起進程次數提升CPU利用率
- 配置塊:http、server、location
- 值類型:size
- 默認值:1460
- 可選範圍:k、K、M、m
- 說明:設置向客戶端傳輸響應數據的最小值,當請求未結束、程序未強制執行刷寫指令且待傳輸數據大於該值時纔開始向客戶端傳輸響應數據
- 配置塊:http、server、location
- 值類型:size
- 默認值:0
- 可選範圍:k、K、M、m
- 說明:設置向客戶端每一個鏈接傳輸響應數據的速率(bytes/second),爲0時表示無限制
- 配置塊:http、server、location
- 值類型:size
- 默認值:0
- 可選範圍:k、K、M、m
- 說明:設置初始無響應速率限制閥值,超過該值後開始按limit_rate限制
- 配置塊:http、server、location
- 值類型:time [time]
- 默認值:75000
- 可選範圍:y、M、w、d、h、m、s、ms,解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]
- 說明:第一個值用於控制程序長鏈接超時時間,第二個值用於向客戶端響應的header中添加長鏈接超時時間,部分瀏覽器會根據該header控制長鏈接
- 配置塊:http、server、location
- 值類型:uint
- 默認值:100
- 可選範圍:1-[32位:2147483647;64位:9223372036854775807;]
- 說明:設置一個長鏈接的最大請求數,當請求數超過該值則關閉該長鏈接
- 配置塊:http、server、location
- 值類型:string
- 默認值:NGX_CONF_BITMASK_SET | NGX_HTTP_KEEPALIVE_DISABLE_MSIE6
- 可選範圍:user_agent中配置的映射
- 說明:設置在某些瀏覽器下禁用長鏈接
- 配置塊:http、server、location
- 值類型:flag
- 默認值:0
- 可選範圍:all、any
- 說明:設置訪問權限控制中是知足任意模塊仍是知足全部模塊才容許訪問
- 配置塊:location
- 值類型:無
- 默認值:0
- 可選範圍:無
- 說明:設置特定location只容許內部(重定向)請求,其餘請求均返回404,且每一個請求最多容許10次(NGX_HTTP_MAX_URI_CHANGES)內部重定向
- 配置塊:http、server、location
- 值類型:flag
- 默認值:1
- 可選範圍:on、off、always
- 說明:控制程序如何關閉客戶端鏈接,on爲若是客戶端正在發送數據則等待數據接收完成後關閉鏈接,always爲無條件等待指定時間(受lingering_time、lingering_timeout綜合影響)後關閉鏈接,off爲當即關閉鏈接
- 配置塊:http、server、location
- 值類型:time
- 默認值:30000
- 可選範圍:y、M、w、d、h、m、s、ms,解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]
- 說明:設置延遲關閉客戶端鏈接等待時間
- 配置塊:http、server、location
- 值類型:time
- 默認值:5000
- 可選範圍:y、M、w、d、h、m、s、ms,解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]
- 說明:設置延遲關閉鏈接每次接收數據的超時時間(每次超時時間內接收到數據都將進入下一次超時計算,但最長不會超過lingering_time)
- 配置塊:http、server、location
- 值類型:flag
- 默認值:0
- 可選範圍:on、off
- 說明:設置是否重置鏈接超時,在socket關閉後tcp將向客戶端RST以引導客戶端從新創建鏈接
- 配置塊:http、server、location
- 值類型:flag
- 默認值:1
- 可選範圍:on、off
- 說明:設置是否爲絕對(路徑)重定向,on爲絕對(路徑)重定向,off爲相對(路徑)重定向
- 配置塊:http、server、location
- 值類型:flag
- 默認值:0
- 可選範圍:on、off
- 說明:設置是否根據客戶端請求的host返回重定向,on爲使用實際請求host重定向,off爲使用客戶端請求host重定向
- 配置塊:http、server、location
- 值類型:flag
- 默認值:1
- 可選範圍:on、off
- 說明:設置是否在絕對(路徑)重定向中返回端口
- 配置塊:http、server、location
- 值類型:flag
- 默認值:1
- 可選範圍:on、off
- 說明:設置是否向IE客戶端請求http狀態碼大於400的響應中添加空白填充以達到512字節
- 配置塊:http、server、location
- 值類型:flag
- 默認值:0
- 可選範圍:on、off
- 說明:設置是否向IE客戶端請求發送refreshes(而非重定向)命令
- 配置塊:http、server、location
- 值類型:flag
- 默認值:1
- 可選範圍:on、off
- 說明:設置收否記錄文件不存在錯誤日誌
- 配置塊:http、server、location
- 值類型:flag
- 默認值:0
- 可選範圍:on、off
- 說明:設置收否記錄子請求日誌
- 配置塊:http、server、location
- 值類型:flag
- 默認值:0
- 可選範圍:on、off
- 說明:設置是否使用error_page重定向請求
- 配置塊:http、server、location
- 值類型:flag|string
- 默認值:1
- 可選範圍:off、on、build
- 說明:設置是否在請求響應header中添加nginx版本號等信息
- 配置塊:http、server、location
- 值類型:flag
- 默認值:1
- 可選範圍:off、exact、before
- 說明:設置如何根據請求header中的If-Modified-Since響應請求,off爲忽略請求頭,exact爲精確匹配,before爲小於或等於
- 配置塊:http、server、location
- 值類型:uint
- 默認值:0x7fffffff
- 可選範圍:1-[32位:2147483647;64位:9223372036854775807;]
- 說明:設置請求header中Ranges容許接收的最大值
- 配置塊:http、server、location
- 值類型:flag
- 默認值:1
- 可選範圍:off、on
- 說明:設置禁用 HTTP/1.1 的數據分片傳輸
- 配置塊:http、server、location
- 值類型:flag
- 默認值:1
- 可選範圍:off、on
- 說明:設置是否自動在請求響應header中根據返回的靜態文件類型添加ETag類型
- 配置塊:http、server、location
- 值類型:code uri
- 默認值:無
- 可選範圍:無
- 說明:根據http錯誤碼響應指定URI資源(能夠爲變量)
- 配置塊:http、server、location
- 值類型:string
- 默認值:{ 0, NULL }
- 可選範圍:無
- 說明:內容生成階段結束後程序將請求內部重定向至指定的location處理(可用於請求統計之類用途)
- 配置塊:http、server、location
- 值類型:file level
- 默認值:logs/error.log error
- 可選範圍:無
- 說明:設置日誌記錄路徑
- 配置塊:http、server、location
- 值類型:flag
- 默認值:NULL
- 可選範圍:off、max、inactive
- 說明:設置文件(讀取時)信息緩存,off關閉緩存,max設置最大緩存數,inactive設置緩存過時時間
- 配置塊:http、server、location
- 值類型:time
- 默認值:60(秒)
- 可選範圍:解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]
- 說明:設置文件信息緩存後再次驗證文件信息的時間
- 配置塊:http、server、location
- 值類型:uint
- 默認值:1
- 可選範圍:1-[32位:2147483647;64位:9223372036854775807;]
- 說明:設置文件描述符保存進文件信息緩存的最小訪問次數
- 配置塊:http、server、location
- 值類型:flag
- 默認值:0
- 可選範圍:on、off
- 說明:設置是否保存文件訪問錯誤進文件信息緩存
- 配置塊:http、server、location
- 值類型:flag
- 默認值:0
- 可選範圍:on、off
- 說明:暫未發現使用用途
- 配置塊:http、server、location
- 值類型:address ... [valid=time] [ipv6=on|off]
- 默認值:建立虛擬解析器
- 可選範圍:無
- 說明:配置特定的DNS服務做爲解析
- 配置塊:http、server、location
- 值類型:time
- 默認值:30000
- 可選範圍:y、M、w、d、h、m、s、ms,解析出的毫秒值 1-[32位:2147483647;64位:9223372036854775807;]
- 說明:設置DNS解析超時時間
- 配置塊:http、server、location
- 值類型:flag
- 默認值:0
- 可選範圍:off、on
- 說明:是否禁用符號鏈接類資源
NGX_HTTP_CONTINUE
目前爲止一切正常, 客戶端應該繼續請求, 若是已完成請求則忽略。程序中定義未使用
NGX_HTTP_SWITCHING_PROTOCOLS
服務器應客戶端升級協議的請求(Upgrade請求頭)正在進行協議切換。程序中proxy、uwsgi、scgi模塊將進行協議切換(http2目前不支持該協議協商只支持指定協議請求)
NGX_HTTP_PROCESSING
非通用協議,程序中定義未使用
NGX_HTTP_OK
請求成功
NGX_HTTP_CREATED
請求已經被成功處理,而且建立了新的資源。WebDAV模塊中使用,表示(move、overwrite)文件或集合(mkcol)建立成功
NGX_HTTP_ACCEPTED
服務器端已經收到請求消息,可是還沒有進行處理。程序中定義未使用
NGX_HTTP_NO_CONTENT
目前請求成功,但客戶端不須要更新其現有頁面。
NGX_HTTP_PARTIAL_CONTENT
請求已成功,而且主體包含所請求的數據區間,該數據區間是在請求的 Range 首部指定的。
NGX_HTTP_SPECIAL_RESPONSE
表示重定向的響應狀態碼,表示該請求擁有多種可能的響應。用戶代理或者用戶自身應該從中選擇一個。程序中做爲特殊響應碼的分界值
NGX_HTTP_MOVED_PERMANENTLY
被請求的資源已永久移動到新位置,而且未來任何對此資源的引用都應該使用本響應返回的若干個 URI 之一。
NGX_HTTP_MOVED_TEMPORARILY
請求的資源如今臨時從不一樣的 URI 響應請求。因爲這樣的重定向是臨時的,客戶端應當繼續向原有地址發送之後的請求。
NGX_HTTP_SEE_OTHER
對應當前請求的響應能夠在另外一個 URI 上被找到,並且客戶端應當採用 GET 的方式訪問那個資源。程序定義未使用
NGX_HTTP_NOT_MODIFIED
若是客戶端發送了一個帶條件的 GET 請求且該請求已被容許,而文檔的內容(自上次訪問以來或者根據請求的條件)並無改變,則服務器應當返回這個狀態碼。
NGX_HTTP_TEMPORARY_REDIRECT
請求的資源如今臨時從不一樣的URI 響應請求。因爲這樣的重定向是臨時的,客戶端應當繼續向原有地址發送之後的請求。程序定義未使用
NGX_HTTP_PERMANENT_REDIRECT
這意味着資源如今永久位於由 Location: HTTP Response 標頭指定的另外一個 URI。程序定義未使用
NGX_HTTP_BAD_REQUEST
語義有誤,當前請求沒法被服務器理解。客戶端請求信息有誤或請求host不存在
NGX_HTTP_UNAUTHORIZED
當前請求須要用戶驗證。該響應必須包含一個適用於被請求資源的 WWW-Authenticate 信息頭用以詢問用戶信息。auth_basic模塊權限校驗失敗或upstream上游返回
NGX_HTTP_FORBIDDEN
服務器已經理解請求,可是拒絕執行它。訪問權限控制階段被限制、請求的資源無讀取權限、upstream上游返回
NGX_HTTP_NOT_FOUND
請求失敗,請求所但願獲得的資源未被在服務器上發現。
NGX_HTTP_NOT_ALLOWED
請求行中指定的請求方法不能被用於請求相應的資源。
NGX_HTTP_REQUEST_TIME_OUT
請求超時。接收客戶端請求數據超時(客戶端指定的Content-Length在指定時間內未能接收完成)
NGX_HTTP_CONFLICT
因爲和被請求的資源的當前狀態之間存在衝突,請求沒法完成。WebDAV模塊中部分請求操做失敗
NGX_HTTP_LENGTH_REQUIRED
服務器拒絕在沒有定義 Content-Length 頭的狀況下接受請求。程序定義未使用
NGX_HTTP_PRECONDITION_FAILED
服務器在驗證在請求的頭字段中給出先決條件時,沒能知足其中的一個或多個。WebDAV模塊中overwrite發生錯誤或not_modified模塊中客戶端請求的判斷條件沒有知足
NGX_HTTP_REQUEST_ENTITY_TOO_LARGE
服務器拒絕處理當前請求,由於該請求提交的實體數據大小超過了服務器願意或者可以處理的範圍。
NGX_HTTP_REQUEST_URI_TOO_LARGE
請求的URI 長度超過了服務器可以解釋的長度,所以服務器拒絕對該請求提供服務。
NGX_HTTP_UNSUPPORTED_MEDIA_TYPE
對於當前請求的方法和所請求的資源,請求中提交的實體並非服務器中所支持的格式,所以請求被拒絕。客戶端請求時使用請求體訪問WebDAV模塊部分方法或image_filter模塊中圖片資源數據異常
NGX_HTTP_RANGE_NOT_SATISFIABLE
若是請求中包含了 Range 請求頭,而且 Range 中指定的任何數據範圍都與當前資源的可用範圍不重合,同時請求中又沒有定義 If-Range 請求頭,那麼服務器就應當返回416狀態碼。客戶端請求header中的Range不合法(格式不正確)
NGX_HTTP_MISDIRECTED_REQUEST
該請求針對的是沒法產生響應的服務器。 客戶端嘗試https請求的host於server配置中host不一致
NGX_HTTP_TOO_MANY_REQUESTS
用戶在給定的時間內請求過於頻繁。upstream模塊中根據上游服務的返回而返回
NGX_HTTP_CLOSE
非通用協議。程序定義未使用
NGX_HTTP_NGINX_CODES
非通用協議。程序定義未使用
NGX_HTTP_REQUEST_HEADER_TOO_LARGE
非通用協議。客戶端請求header過大(large_header_buf已被分配完或者請求大於headerlarge_header_buf)
NGX_HTTPS_CERT_ERROR
非通用協議。客戶端以https協議請求可是程序對客戶端證書校驗失敗
NGX_HTTPS_NO_CERT
非通用協議。客戶端以https協議請求可是對應的server塊未配置證書信息
NGX_HTTP_TO_HTTPS
非通用協議。客戶端以https協議請求可是對應的server塊未開啓ssl
NGX_HTTP_CLIENT_CLOSED_REQUEST
非通用協議。客戶端在程序響應前斷開了鏈接
NGX_HTTP_INTERNAL_SERVER_ERROR
服務器遇到了不知道如何處理的狀況。程序發生內部錯誤(如配置錯誤、重定向錯誤等)時使用
NGX_HTTP_NOT_IMPLEMENTED
此請求方法不被服務器支持且沒法被處理。WebDAV模塊客戶端PUT請求header中使用Range、http客戶端請求header中的Transfer-Encoding沒法識別時使用
NGX_HTTP_BAD_GATEWAY
此錯誤響應代表服務器做爲網關須要獲得一個處理這個請求的響應,可是獲得一個錯誤的響應。upstream模塊中上游服務響應錯誤時使用
NGX_HTTP_SERVICE_UNAVAILABLE
服務器沒有準備好處理請求。 limit_conn(觸發請求數限制)、limit_req(觸發速率限制)、upstream模塊中使用
NGX_HTTP_GATEWAY_TIME_OUT
當服務器做爲網關,不能及時獲得響應時返回此錯誤代碼。upstream模塊中上游服務響應超時時使用
NGX_HTTP_VERSION_NOT_SUPPORTED
服務器不支持請求中所使用的HTTP協議版本。
NGX_HTTP_INSUFFICIENT_STORAGE
服務器有內部配置錯誤。WebDAV模塊中發生NGX_ENOSPC錯誤時使用
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鏈接並和客戶端完成握手,若還沒有完成則添加超時定時器後返回等待下次處理
檢查客戶端證書
若是當前server配置中的STARTTLS命令未關閉則執行對應協議(imap、pop三、smtp)的init_protocol方法後返回
不然進入session初始化流程
- 添加讀(ngx_mail_imap_init_protocol)寫(ngx_mail_send)事件
- 若是server配置有apop、cram-md5兩種身份驗證方式則爲請求輸出加鹽(避免暴露破解)
- 添加讀(ngx_mail_imap_init_protocol)寫(ngx_mail_send)事件
- 添加讀(ngx_mail_imap_init_protocol)寫(ngx_mail_send)事件
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事件)隊列中
進入請求處理流程
讀取請求內容階段
獲取客戶端真實IP
訪問權限控制的前一階段,該階段在權限控制階段以前,通常用於訪問控制
最大鏈接數限制
訪問權限控制階段
基於IP黑白名單權限控制
訪問創建ssl階段
創建ssl鏈接
請求數據預讀階段
- 建立臨時緩衝區
- 讀取客戶端請求數據
- 若是客戶端數據請求還沒有接收完成則添加讀事件後返回等待下次處理
讀取SSL請求數據
內容生成階段,該階段產生響應,併發送到客戶端
- 轉發客戶端請求至對應上游服務,並將上游服務的響應返回給客戶端
日誌記錄階段
- 不能添加外部檢查器
- 記錄訪問日誌
源地址 By佐柱
轉載請註明出處,也歡迎偶爾逛逛個人小站,謝謝 :)