Nginx 入門指南(四)

2021-08-22 08:19:18 字數 3629 閱讀 6284

nginx 的配置系統由乙個主配置檔案和其他一些輔助的配置檔案構成。這些配置檔案均是純文字檔案,全部位於nginx 安裝目錄下的 conf 目錄下。

由於除主配置檔案 nginx.conf 以外的檔案都是在某些情況下才使用的,而只有主配置檔案是在任何情況下都被使用的。所以在這裡我們就以主配置檔案為例,來解釋 nginx 的配置系統。

在 nginx.conf 中,包含若干配置項。每個配置項由配置指令和指令引數 2 個部分構成。指令引數也就是配置指令對應的配置值。

配置指令是乙個字串,可以用單引號或者雙引號括起來,也可以不括。但是如果配置指令包含空格,一定要引起來。

指令的引數使用乙個或者多個空格或者 tab 字元與指令分開。指令的引數有乙個或者多個 token 串組成。token 串之間由空格或者 tab 鍵分隔。

token 串分為簡單字串或者是復合配置塊。復合配置塊即是由大括號括起來的一堆內容。乙個復合配置塊中可能包含若干其他的配置指令。

如果乙個配置指令的引數全部由簡單字串構成,也就是不包含復合配置塊,那麼我們就說這個配置指令是乙個簡單配置項,否則稱之為複雜配置項。例如下面這個是乙個簡單配置項:

error_page   500 502 503 504  /50x.html;
對於簡單配置,配置項的結尾使用分號結束。對於複雜配置項,包含多個 token 串的,一般都是簡單 token 串放在前面,復合配置塊一般位於最後,而且其結尾,並不需要再新增分號。例如下面這個複雜配置項:

location /
nginx.conf 中的配置資訊,根據其邏輯上的意義,對它們進行了分類,也就是分成了多個作用域,或者稱之為配置指令上下文。不同的作用域含有乙個或者多個配置項。

當前 nginx 支援的幾個指令上下文:

指令上下文,可能有包含的情況出現。例如:通常 http 上下文和 mail 上下文一定是出現在 main 上下文裡的。在乙個上下文裡,可能包含另外一種型別的上下文多次。例如:如果 http 服務,支援了多個虛擬主機,那麼在 http 上下文裡,就會出現多個 server 上下文。

我們來看乙個示例配置:

}在這個配置中,上面提到個五種配置指令上下文都存在。

存在於 main 上下文中的配置指令如下:

存在於 http 上下文中的指令如下:

存在於 mail 上下文中的指令如下:

存在於 server 上下文中的配置指令如下:

存在於 location 上下文中的指令如下:

當然,這裡只是一些示例。具體有哪些配置指令,以及這些配置指令可以出現在什麼樣的上下文中,需要參考 nginx 的使用文件。

nginx 的內部結構是由核心部分和一系列的功能模組所組成。這樣劃分是為了使得每個模組的功能相對簡單,便於開發,同時也便於對系統進行功能擴充套件。為了便於描述,下文中我們將使用 nginx core 來稱呼 nginx 的核心功能部分。

nginx 提供了 web 伺服器的基礎功能,同時提供了 web 服務反向**,email 服務反向**功能。nginx core實現了底層的通訊協議,為其他模組和 nginx 程序構建了基本的執行時環境,並且構建了其他各模組的協作基礎。除此之外,或者說大部分與協議相關的,或者應用相關的功能都是在這些模組中所實現的。

nginx 將各功能模組組織成一條鏈,當有請求到達的時候,請求依次經過這條鏈上的部分或者全部模組,進行處理。每個模組實現特定的功能。例如,實現對請求解壓縮的模組,實現 ssi 的模組,實現與上游伺服器進行通訊的模組,實現與 fastcgi 服務進行通訊的模組。

有兩個模組比較特殊,他們居於 nginx core 和各功能模組的中間。這兩個模組就是 http 模組和 mail 模組。這 2 個模組在 nginx core 之上實現了另外一層抽象,處理與 http 協議和 email 相關協議(smtp/pop3/imap)有關的事件,並且確保這些事件能被以正確的順序呼叫其他的一些功能模組。

目前 http 協議是被實現在 http 模組中的,但是有可能將來被剝離到乙個單獨的模組中,以擴充套件 nginx 支援 spdy 協議。

nginx 的模組根據其功能基本上可以分為以下幾種型別:

nginx 使用乙個多程序模型來對外提供服務,其中乙個 master 程序,多個 worker 程序。master 程序負責管理 nginx 本身和其他 worker 程序。

所有實際上的業務處理邏輯都在 worker 程序。worker 程序中有乙個函式,執行無限迴圈,不斷處理收到的來自客戶端的請求,並進行處理,直到整個 nginx 服務被停止。

worker 程序中,ngx_worker_process_cycle()函式就是這個無限迴圈的處理函式。在這個函式中,乙個請求的簡單處理流程如下:

為了讓大家更好的了解 nginx 中請求處理過程,我們以 http request 為例,來做一下詳細地說明。

從 nginx 的內部來看,乙個 http request 的處理過程涉及到以下幾個階段。

在這裡,我們需要了解一下 phase handler 這個概念。phase 字面的意思,就是階段。所以 phase handlers 也就好理解了,就是包含若干個處理階段的一些 handler。

在每乙個階段,包含有若干個 handler,再處理到某個階段的時候,依次呼叫該階段的 handler 對 http request 進行處理。

通常情況下,乙個 phase handler 對這個 request 進行處理,並產生一些輸出。通常 phase handler 是與定義在配置檔案中的某個 location 相關聯的。

乙個 phase handler 通常執行以下幾項任務:

當 nginx 讀取到乙個 http request 的 header 的時候,nginx 首先查詢與這個請求關聯的虛擬主機的配置。如果找到了這個虛擬主機的配置,那麼通常情況下,這個 http request 將會經過以下幾個階段的處理(phase handlers):

在內容產生階段,為了給乙個 request 產生正確的響應,nginx 必須把這個 request 交給乙個合適的 content handler 去處理。如果這個 request 對應的 location 在配置檔案中被明確指定了乙個 content handler,那麼nginx 就可以通過對 location 的匹配,直接找到這個對應的 handler,並把這個 request 交給這個 content handler 去處理。這樣的配置指令包括像,perl,flv,proxy_pass,mp4等。

如果乙個 request 對應的 location 並沒有直接有配置的 content handler,那麼 nginx 依次嘗試:

內容產生階段完成以後,生成的輸出會被傳遞到 filter 模組去進行處理。filter 模組也是與 location 相關的。所有的 fiter 模組都被組織成一條鏈。輸出會依次穿越所有的 filter,直到有乙個 filter 模組的返回值表明已經處理完成。

這裡列舉幾個常見的 filter 模組,例如:

在所有的 filter 中,有幾個 filter 模組需要關注一下。按照呼叫的順序依次說明如下:

python入門指南 Python 入門指南

python 入門指南 release 3.6.3 date dec 10,2017 python 是一門簡單易學且功能強大的程式語言。它擁有高效的高階資料結構,並且能夠用簡單而又高效的方式進行物件導向程式設計。python 優雅的語法和動態型別,再結合它的解釋性,使其在大多數平台的許多領域成為編寫...

Nginx配置指南

對nginx的學習並不多,但使用起來特別順手且心中莫名放心,本文分享乙份自己的nginx配置,並選擇其中的一些配置項做些說明。nginx配置檔案預設存放在 etc nginx nginx.conf,裡面主要是http上下文的配置內容,而server等內容常被拆分成子檔案通過include引入,以下是...

入門指南 雷射切管快速入門指南

本文是有關管材和雷射管切割的思考的快速入門指南。要求 首先,需要確定對管材尺寸的要求。考慮以下問題 將要加工的管材最大和最小直徑是多少?切割這些管材需要多大功率?它們是薄壁還是厚壁?原材料和成品零件的長度是多少?這些要求將確定所需的雷射切割機型別。管材切割基礎知識 儘管板材和管材是用相似的材料製成的...