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),檔案訪問返回失敗(404)
- 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狀態碼。客戶端請求header中的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
非通用協議。客戶端請求header過大(large_header_buf已被分配完或者請求大於headerlarge_header_buf)
- 495
NGX_HTTPS_CERT_ERROR
非通用協議。客戶端以https協議請求但是程式對客戶端證書校驗失敗
- 496
NGX_HTTPS_NO_CERT
非通用協議。客戶端以https協議請求但是對應的server塊未配置證書資訊
- 497
NGX_HTTP_TO_HTTPS
非通用協議。客戶端以https協議請求但是對應的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佐柱
轉載請註明出處,也歡迎偶爾逛逛我的小站,謝謝 :)