nginx 尋找index 原理

2021-08-20 19:08:52 字數 2022 閱讀 8834

1. nginx 是怎麼找index.php 檔案的

當nginx發現需要/web/echo/index.php檔案時, 就會向核心發起 io 系統呼叫(因為要跟硬體打交道, 這裡的硬體是指硬碟, 通常需要靠核心來操作, 而核心提供的這些功能是通過系統呼叫來實現的), 告訴核心, 我需要這個檔案, 核心從/開始找到web目錄, 再在web目錄下找到echo目錄, 最後在echo目錄下找到index.php檔案, 於是把這個index.php從硬碟上讀取到核心自身的記憶體空間, 然後再把這個檔案複製到nginx程序所在的記憶體空間, 於是 nginx就得到了自己想要的檔案了

2. 尋找檔案在檔案系統層面是怎麼操作的

如, nginx 需要得到/web/echo/index.php這個檔案

每個分割槽(像ext3 等檔案系統, block塊是檔案儲存的最小單元, 預設是4096位元組) 都是包含元資料區和資料區, 每個檔案在元資料區都有元資料條目(一般是128位元組大小), 每個條目都有乙個編號, 稱之為 inode(index node), 這個inode 裡包含 檔案型別, 許可權, 連線次數, 屬主和陣列的 id&時間戳, 這個檔案佔據了哪些磁碟塊也就是塊的編號(block, 每個檔案可以占用多個 block, 且 block 不一定是連續的, 每個 block 都有編號), 如下圖:

目錄其實也是普通檔案, 也需要占用磁碟塊, 目錄不是乙個容器. 預設建立的目錄大小為4096位元組, 即只需要占用乙個磁碟塊, 但這是不確定的. 所以要找到目錄也是需要到元資料區里找到對應的條目, 只要找到對應的inode就可以找到目錄所占用的磁碟塊.

目錄裡存著一張表(對映表), 裡面放著 目錄或檔案的名稱和對應的inode號, 如下:--

檔名稱(只是字串)

inode 號

test.txt

100

假如

/           在資料區佔據1, 2號 block, `/` 其實也是乙個目錄, 裡面有兩個目錄, web 和 111

web 佔據5號 block, 是目錄, 裡面有2個目錄 echo 和 data

echo 佔據11號 block, 是目錄, 裡面有乙個檔案 index.php

index.php 佔據15, 16號 block, 是檔案

其在檔案系統中分布如下圖:

那麼核心究竟是怎麼找到index.php這個檔案的呢?

核心拿到 nginx 的 io 系統呼叫要獲取/web/echo/index.php這個檔案請求之後,

1. 核心讀取元資料區 / 的inode, 從 inode 裡讀取 / 所對應的資料塊的編號, 然後在資料區找到其對應的塊(1, 2號塊), 讀取1號塊上的對映表找到 web 這個名稱在元資料區對應的 inode 號

2. 核心讀取 web 對應的 inode(3號), 從中得到 web 在資料區對應的塊是5號塊, 於是到資料區找到5號塊, 從中讀取對映表, 知道 echo 對應的 inode 是5號, 於是到元資料區找到5號 inode

3. 核心讀取5號 inode, 得到 echo 在資料區對應的事11號塊, 於是到資料區讀取11號塊得到對映表, 得到index.php 對應的 inode 事9號

4. 核心到元資料區讀取9號 inode, 得到 index.php 對應的事15號和16號資料塊, 於是就到資料區域找到15 16號塊, 讀取其中的內容, 得到 index.php 的完整內容

NGINX原理剖析

nginx之所以能夠支援高併發,是由於它採用非同步 事件驅動的方式處理連線。nginx有乙個master process,負責載入配置檔案,繫結埠等特權操作 有cache manage process和cache loader process兩個程序負責硬碟快取的處理,在nginx啟動時,將硬碟的快...

Nginx原理講解

location uri 規則模式含義a 開頭 表示精確匹配 b 開頭 表示uri以某個常規字串開頭,理解為匹配 url路徑即可。nginx不對url做編碼,因此請求為 static 20 aa,可以被規則 static aa匹配到 c 開頭 表示區分大小寫的正則匹配 d 開頭 表示不區分大小寫的正...

Nginx工作原理

nginx web伺服器主要是由各種模組協同工作,模組從結構上分為核心模組,基礎模 塊和第三方模組,其中三類模組分別如下 1 核心模組 http模組 event模組和mail模組等 2 基礎模組 http access模組 http fastcgi模組 http proxy模組和http rewri...