自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

OpenResty實(shí)戰(zhàn)系列 | 執(zhí)行流程與階段詳解

開發(fā) 前端
Nginx處理請求的過程一共劃分為11個階段,按照執(zhí)行順序依次是post-read、server-rewrite、find-config、rewrite、post-rewrite、 preaccess、access、post-access、try-files、content、log。

場景

我們先定義一個location塊級指令phase_echo來處理客戶端發(fā)過來請求URI處理。

location /phase_echo {
    set $name "Tinywan";
    echo $name;
    set $name "開源技術(shù)小棧";
    echo $name;
    set $name "Tinywan 開源技術(shù)小棧";
    echo $name;
}

請求訪問輸出結(jié)果:

PS C:\Users\Tinywan\Desktop> curl -i http://openresty.tinywan.com/phase_echo
HTTP/1.1 200 OK
Server: openresty/1.17.8.2
Date: Sun, 14 Jul 2024 00:31:18 GMT
Content-Type: application/octet-stream
Transfer-Encoding: chunked
Connection: keep-alive

Tinywan 開源技術(shù)小棧
Tinywan 開源技術(shù)小棧
Tinywan 開源技術(shù)小棧

為什么輸出全部是Tinywan 開源技術(shù)小棧。也就是最后一個設(shè)置的變量值呢?前面設(shè)置的怎么都沒生效嗎?

這是因?yàn)镹ginx處理每一個用戶請求時,都是按照若干個不同階段依次處理的,而不是根據(jù)配置文件上的順序。以上配置涉及到了 兩個階段 rewrite和content階段。

  • set屬于rewrite階段
  • echo屬于content階段

而實(shí)際執(zhí)行執(zhí)行是 rewrite階段的指令在 content階段指令之前執(zhí)行。實(shí)際的執(zhí)行順序應(yīng)當(dāng)是以下這樣子的。

set $name "Tinywan";
set $name "開源技術(shù)小棧";
set $name "Tinywan 開源技術(shù)小棧";
echo $name;
echo $name;
echo $name;

所以這就是為什么最終會輸出Tinywan 開源技術(shù)小棧。帶著以上配置文件中執(zhí)行的指令,讓我們進(jìn)入Nginx執(zhí)行流程與階段詳解。

Nginx執(zhí)行階段

Nginx處理請求的過程一共劃分為11個階段,按照執(zhí)行順序依次是post-read、server-rewrite、find-config、rewrite、post-rewrite、 preaccess、access、post-access、try-files、content、log。

所以整個請求的過程,是按照不同的階段執(zhí)行的,在某個階段執(zhí)行完該階段的指令之后,再進(jìn)行下一個階段的指令執(zhí)行。

執(zhí)行階段示例

圖片圖片

  1. post-read:讀取請求內(nèi)容階段,nginx讀取并解析完請求頭之后就立即開始運(yùn)行。例如模塊 ngx_realip 就在 post-read 階段注冊了處理程序。它的功能是迫使 Nginx 認(rèn)為當(dāng)前請求的來源地址是指定的某一個請求頭的值。
  2. server-rewrite:server請求地址重寫階段,當(dāng)ngx_rewrite模塊的set配置指令直接書寫在server配置塊中時,基本上都是運(yùn)行在server-rewrite階段。
  3. find-config:配置查找階段,這個階段并不支持Nginx模塊注冊處理程序,而是由Nginx核心來完成當(dāng)前請求與location配置塊之間的配對工作。
  4. rewrite:location請求地址重寫階段,當(dāng)ngx_rewrite指令用于location中,就是再這個階段運(yùn)行的。另外ngx_set_misc(設(shè)置md5、encode_base64等)模塊的指令,還有ngx_lua模塊的set_by_lua指令和rewrite_by_lua指令也在此階段。
  5. post-rewrite:請求地址重寫提交階段,當(dāng)nginx完成rewrite階段所要求的內(nèi)部跳轉(zhuǎn)動作,如果rewrite階段有這個要求的話。
  6. preaccess:訪問權(quán)限檢查準(zhǔn)備階段,ngx_limit_req和ngx_limit_zone在這個階段運(yùn)行,ngx_limit_req可以控制請求的訪問頻率,ngx_limit_zone可以控制訪問的并發(fā)度;
  7. access:訪問權(quán)限檢查階段,標(biāo)準(zhǔn)模塊ngx_access、第三方模塊ngx_auth_request以及第三方模塊ngx_lua的access_by_lua 指令就運(yùn)行在這個階段。配置指令多是執(zhí)行訪問控制相關(guān)的任務(wù),如檢查用戶的訪問權(quán)限,檢查用戶的來源IP是否合法。
  8. post-access:訪問權(quán)限檢查提交階段;主要用于配合access階段實(shí)現(xiàn)標(biāo)準(zhǔn)ngx_http_core模塊提供的配置指令satisfy的功能。satisfy all(與關(guān)系),satisfy any(或關(guān)系)
  9. try-files:配置項(xiàng)try_files處理階段;專門用于實(shí)現(xiàn)標(biāo)準(zhǔn)配置指令try_files的功能,如果前N-1個參數(shù)所對應(yīng)的文件系統(tǒng)對象都不存在,try-files 階段就會立即發(fā)起內(nèi)部跳轉(zhuǎn)到最后一個參數(shù)(即第 N 個參數(shù))所指定的URI.
  10. content:內(nèi)容產(chǎn)生階段,是所有請求處理階段中最為重要的階段,因?yàn)檫@個階段的指令通常是用來生成HTTP響應(yīng)內(nèi)容并輸出 HTTP 響應(yīng)的使命.
  11. log:日志模塊處理階段,記錄日志

OpenResty 的運(yùn)行機(jī)制

圖片圖片

圖片來源:https://yxudong.github.io。

OpenResty 執(zhí)行階段

OpenResty發(fā)起一個請求時,會有相應(yīng)的執(zhí)行流程,Nginx與Lua編寫腳本的基本構(gòu)建塊是指令執(zhí)行順序的。

圖片

從圖中可知OpenResty 處理請求大致分為4個大階段,11個小階段。

四個大階段

  • 初始化階段(Initialization Phase)  master進(jìn)程啟動預(yù)加載/生成worker進(jìn)程預(yù)加載
  • 重寫、轉(zhuǎn)發(fā)、訪問階段(Rewrite / Access Phase)  url轉(zhuǎn)發(fā),權(quán)限判斷
  • 內(nèi)容處理/生成階段(Content Phase)  內(nèi)容生成
  • 日志階段(Log Phase)日志記錄

七個小階段

  • init_by_lua_file:master-initing 階段,初始化全局配置或模塊
  • init_worker_by_lua_file:worker-initing 階段,初始化進(jìn)程專用功能
  • ssl_certificate_by_lua_file:ssl 階段,在握手時設(shè)置安全證書
  • set_by_lua_file:rewrite 階段,改寫 Nginx 變量
  • rewrite_by_lua_file:rewrite 階段,改寫 URI ,實(shí)現(xiàn)跳轉(zhuǎn)或重定向
  • access_by_lua_file:access 階段,訪問控制或限速
  • content_by_lua_file:content 階段,產(chǎn)生響應(yīng)內(nèi)容
  • balancer_by_lua_file:content 階段,反向代理時選擇后端服務(wù)器
  • header_filter_by_lua_file:filter 階段,加工處理響應(yīng)頭
  • body_filter_by_lua_file:filter 階段,加工處理響應(yīng)體
  • log_by_lua_file:log 階段,記錄日志或其他的收尾工作

這些指令通常有三種形式

  • xxx_by_lua:執(zhí)行字符串形式的 Lua 代碼:
  • xxx_by_lua_block:功能相同,但指令后是{ ...}的 Lua 代碼塊
  • xxx_by_lua_file:功能相同,但執(zhí)行磁盤上的 Lua 源碼文件。

這邊推薦使用 xxx_by_lua_file,它徹底分離了配置文件與業(yè)務(wù)代碼,讓兩者可以獨(dú)立部署,而且文件形式也讓我們更容易以模塊的方式管理組織 Lua 程序。

OpenResty 執(zhí)行階段和 Nginx 的對照

圖片圖片

圖片來源:https://blog.51cto.com/lisea/2425794。

server {
    listen 80;
    server_name openresty.tinywan.com;

    location /run_phase {
        set_by_lua_block $a {
            ngx.log(ngx.ERR, "Tinywan is set_by_lua_block phase")
        }

        rewrite_by_lua_block {
            ngx.log(ngx.ERR, "Tinywan is rewrite_by_lua_block phase")
        }

        access_by_lua_block {
            ngx.log(ngx.ERR, "Tinywan is access_by_lua_block phase")
        }

        content_by_lua_block {
            ngx.log(ngx.ERR, "Tinywan is content_by_lua_block phase")
        }

        header_filter_by_lua_block {
            ngx.log(ngx.ERR, "Tinywan is header_filter_by_lua_block phase")
        }

        body_filter_by_lua_block {
            ngx.log(ngx.ERR, "Tinywan is body_filter_by_lua_block phase")
        }

        log_by_lua_block {
            ngx.log(ngx.ERR, "Tinywan is log_by_lua_block phase")
        }
    }
}

執(zhí)行請求訪問:

curl -i http://openresty.tinywan.com/run_phase

查看錯誤日志文件內(nèi)容:

2024/07/13 12:38:43 [error] 7#7: *2 [lua] set_by_lua:2: Tinywan is set_by_lua_block phase, client: 172.18.0.1, server: openresty.tinywan.com, request: "GET /run_phase HTTP/1.1", host: "openresty.tinywan.com"
2024/07/13 12:38:43 [error] 7#7: *2 [lua] rewrite_by_lua(openresty.tinywan.com.conf:18):2: Tinywan is rewrite_by_lua_block phase, client: 172.18.0.1, server: openresty.tinywan.com, request: "GET /run_phase HTTP/1.1", host: "openresty.tinywan.com"
2024/07/13 12:38:43 [error] 7#7: *2 [lua] access_by_lua(openresty.tinywan.com.conf:22):2: Tinywan is access_by_lua_block phase, client: 172.18.0.1, server: openresty.tinywan.com, request: "GET /run_phase HTTP/1.1", host: "openresty.tinywan.com"
2024/07/13 12:38:43 [error] 7#7: *2 [lua] content_by_lua(openresty.tinywan.com.conf:26):2: Tinywan is content_by_lua_block phase, client: 172.18.0.1, server: openresty.tinywan.com, request: "GET /run_phase HTTP/1.1", host: "openresty.tinywan.com"
2024/07/13 12:38:43 [error] 7#7: *2 [lua] header_filter_by_lua:2: Tinywan is header_filter_by_lua_block phase, client: 172.18.0.1, server: openresty.tinywan.com, request: "GET /run_phase HTTP/1.1", host: "openresty.tinywan.com"
2024/07/13 12:38:43 [error] 7#7: *2 [lua] body_filter_by_lua:2: Tinywan is body_filter_by_lua_block phase, client: 172.18.0.1, server: openresty.tinywan.com, request: "GET /run_phase HTTP/1.1", host: "openresty.tinywan.com"
2024/07/13 12:38:43 [error] 7#7: *2 [lua] log_by_lua(openresty.tinywan.com.conf:38):2: Tinywan is log_by_lua_block phase while logging request, client: 172.18.0.1, server: openresty.tinywan.com, request: "GET /run_phase HTTP/1.1", host: "openresty.tinywan.com"

通過日志文件記錄可以看到執(zhí)行是按照階段順序進(jìn)行輸出。

責(zé)任編輯:武曉燕 來源: 開源技術(shù)小棧
相關(guān)推薦

2021-09-08 10:47:33

Flink執(zhí)行流程

2025-01-02 15:40:23

2025-01-06 13:04:21

2009-12-29 10:43:31

PPPOE協(xié)議

2022-02-06 22:13:47

VueVue3.0Vue項(xiàng)目

2025-04-25 08:30:00

前端后端用戶登錄

2019-09-18 10:39:08

負(fù)載均衡反向代理TCP

2009-07-08 10:30:57

WebWork

2023-12-14 13:28:00

Spring流程Web

2020-09-16 12:23:37

TypeScript

2009-04-29 10:00:25

SQL邏輯查詢優(yōu)化

2017-06-07 12:25:37

Shuffle代碼Map階段處理

2015-12-30 10:29:40

Git協(xié)作流程詳解

2010-08-04 13:23:29

Flex事件

2011-09-07 09:21:04

2021-10-20 10:04:47

鴻蒙HarmonyOS應(yīng)用

2017-05-26 11:00:38

Python算法

2024-12-16 08:10:00

Spring開發(fā)

2017-05-04 11:09:21

互聯(lián)網(wǎng)

2022-02-07 07:48:17

MyBatisJavaORM
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號