1. nginx 11 個處理階段nginx
nginx實際把請求處理流程劃分爲了11個階段,這樣劃分的緣由是將請求的執行邏輯細分,各階段按照處理時機定義了清晰的執行語義,開發者能夠很容易分辨本身須要開發的模塊應該定義在什麼階段,其定義在http/ngx_http_core_module.h中有定義:緩存
NGX_HTTP_POST_READ_PHASE:
接收完請求頭以後的第一個階段,它位於uri重寫以前,實際上不多有模塊會註冊在該階段,默認的狀況下,該階段被跳過併發
NGX_HTTP_SERVER_REWRITE_PHASE:
server級別的uri重寫階段,也就是該階段執行處於server塊內,location塊外的重寫指令,在讀取請求頭的過程當中nginx會根據host及端口找到對應的虛擬主機配置異步
NGX_HTTP_FIND_CONFIG_PHASE:
尋找location配置階段,該階段使用重寫以後的uri來查找對應的location,值得注意的是該階段可能會被執行屢次,由於也可能有location級別的重寫指令lua
NGX_HTTP_REWRITE_PHASE:
location級別的uri重寫階段,該階段執行location基本的重寫指令,也可能會被執行屢次代理
NGX_HTTP_POST_REWRITE_PHASE:
location級別重寫的後一階段,用來檢查上階段是否有uri重寫,並根據結果跳轉到合適的階段日誌
NGX_HTTP_PREACCESS_PHASE:
訪問權限控制的前一階段,該階段在權限控制階段以前,通常也用於訪問控制,好比限制訪問頻率,連接數等server
NGX_HTTP_ACCESS_PHASE:
訪問權限控制階段,好比基於ip黑白名單的權限控制,基於用戶名密碼的權限控制等接口
NGX_HTTP_POST_ACCESS_PHASE:
問權限控制的後一階段,該階段根據權限控制階段的執行結果進行相應處理ip
NGX_HTTP_TRY_FILES_PHASE:
try_files指令的處理階段,若是沒有配置try_files指令,則該階段被跳過
NGX_HTTP_CONTENT_PHASE:
內容生成階段,該階段產生響應,併發送到客戶端
NGX_HTTP_LOG_PHASE:
日誌記錄階段,該階段記錄訪問日誌
2. nginx lua 8個處理階段
init_by_lua httpset_by_lua server, server if, location, location ifrewrite_by_lua http, server, location, location ifaccess_by_lua http, server, location, location ifcontent_by_lua location, location ifheader_filter_by_lua http, server, location, location ifbody_filter_by_lua http, server, location, location iflog_by_lua http, server, location, location if{ set_by_lua: 流程分支處理判斷變量初始化 rewrite_by_lua: 轉發、重定向、緩存等功能(例如特定請求代理到外網) access_by_lua: IP准入、接口權限等狀況集中處理(例如配合iptable完成簡單防火牆) content_by_lua: 內容生成 header_filter_by_lua: 應答HTTP過濾處理(例如添加頭部信息) body_filter_by_lua: 應答BODY過濾處理(例如完成應答內容統一成大寫) log_by_lua: 會話完成後本地異步完成日誌記錄(日誌能夠記錄在本地,還能夠同步到其餘機器)}