Nginx處理懲罰每一個用戶請求時,都是憑據若干個差異階段(phase)依次處理懲罰的,而不是按照設置文件上的順序。
Nginx處理懲罰請求的進程一共分別為11個階段,憑據執行順序依次是post-read、server-rewrite、find-config、rewrite、post-rewrite、 preaccess、access、post-access、try-files、content、log.
1、post-read
讀取請求內容階段,nginx讀取并理會完請求頭之后就當即開始運行;譬喻模塊 ngx_realip 就在 post-read
階段注冊了處理懲罰措施,它的成果是迫使 Nginx 認為當前請求的來歷地點是指定的某一個請求頭的值。
2、server-rewrite
server請求地點重寫階段;當ngx_rewrite模塊的set設置指令直接書寫在server設置塊中時,根基上都是運行在server-rewrite
階段
3、find-config
設置查找階段,這個階段并不支持Nginx模塊注冊處理懲罰措施,而是由Nginx焦點來完成當前請求與location設置塊之間的配對事情。
4、rewrite
location請求地點重寫階段,當ngx_rewrite指令用于location中,就是再這個階段運行的;別的ngx_set_misc(配置md5、encode_base64等)模塊的指令,尚有ngx_lua模塊的set_by_lua指令和rewrite_by_lua指令也在此階段。
5、post-rewrite
請求地點重寫提交階段,當nginx完成rewrite階段所要求的內部跳動彈作,假如rewrite階段有這個要求的話;
6、preaccess
會見權限查抄籌備階段,ngx_limit_req和ngx_limit_zone在這個階段運行,ngx_limit_req可以節制請求的會見頻率,ngx_limit_zone可以節制會見的并發度;
7、access
會見權限查抄階段,尺度模塊ngx_access、第三方模塊ngx_auth_request以及第三方模塊ngx_lua的access_by_lua指令就運行在這個階段。設置指令多是執行會見節制相關的任務,如查抄用戶的會見權限,查抄用戶的來歷IP是否正當;
8、post-access
會見權限查抄提交階段;主要用于共同access階段實現尺度ngx_http_core模塊提供的設置指令satisfy的成果。satisfy
all(與干系),satisfy any(或干系)
9、try-files
設置項try_files處理懲罰階段;專門用于實現尺度設置指令try_files的成果,假如前 N-1
個參數所對應的文件系統工具都不存在,try-files 階段就會當即提倡“內部跳轉”到最后一個參數(即第 N
個參數)所指定的URI.
10、content
內容發生階段,是所有請求處理懲罰階段中最為重要的階段,因為這個階段的指令凡是是用來生成HTTP響應內容并輸出 HTTP
響應的使命;
11、log
日志模塊處理懲罰階段;記錄日志
二、Nginx下Lua處理懲罰階段與利用范疇:
init_by_lua http
set_by_lua server, server if, location, location if
rewrite_by_lua http, server, location, location if
access_by_lua http, server, location, location if
content_by_lua location, location if
header_filter_by_lua http, server, location, location if
body_filter_by_lua http, server, location, location if
log_by_lua http, server, location, location if
timer
init_by_lua:
在nginx從頭加載設置文件時,運行內里lua劇本,常用于全局變量的申請。
譬喻lua_shared_dict共享內存的申請,只有當nginx重起后,共享內存數據才清空,這常用于統計。
set_by_lua:
配置一個變量,常用與計較一個邏輯,然后返回功效
該階段不能運行Output API、Control API、Subrequest API、Cosocket API
rewrite_by_lua:
在access階段前運行,主要用于rewrite
access_by_lua:
主要用于會見節制,能收集到大部門變量,雷同status需要在log階段才有。
這條指令運行于nginx access階段的末端,因此老是在 allow 和 deny 這樣的指令之后運行,固然它們同屬 access
階段。
content_by_lua:
階段是所有請求處理懲罰階段中最為重要的一個,運行在這個階段的設置指令一般都負擔著生成內容(content)并輸出HTTP響應。
header_filter_by_lua:
一般只用于配置Cookie和Headers等
該階段不能運行Output API、Control API、Subrequest API、Cosocket API