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