Nginx已應用在Netflix、Wordpress.com、新浪、網易、騰訊、豆瓣等知名網站中。
Nginx是一款功能強大的高性能Web和反向代理伺服器,可以在大多數UNIX或類UNIX系統上編譯運行,官方還提供Windows
下的可執行版本。
本書是作者多年研讀Nginx代碼、深入思考和實踐的結晶,希望透過剖析Nginx的原始程式碼,探究其功能結構及其內部實現原理。
適合:系統程式師、軟體發展工程師、Nginx高級運維工程師、資訊科系學生參考。
作者簡介:
高群凱
電腦碩士,接觸Linux等自由/開源軟體多年,在技術領域的興趣主要包括Linux、高性能服務(如Lighttpd、Nginx、Apache、Mongodb等),以及x86、MIPS(Cavium、RMI、Tilera)等,專職從事Linux相關研究。
個人微博:http://lenky.info/
作者序
前言
Nginx 原始程式研究是早在2008 年的事情。當時我正為職業規劃與未來發展困惑不已,一籌莫展之際不知從哪裡得知高性能伺服器是一個很有「前途」的努力方向,幾經搜索又機緣偶合地得識Lighttpd 與Nginx。在逐步了解和熟悉它們的原始程式後,我開始感到自己的無知與淺薄,發現原來程式也可以寫得如此優雅。
Nginx 提供了一個安全、快速並且靈活的Web Server 環境。與其他Web
Servers 相比,其主要特點是佔有系統資源少、平行處理能力強、穩定性好,這些都是吸引網站架構人員特別關心以及廣泛應用的極大優點。然而,對於開發工程師而言,更有吸引力的地方卻是Nginx 是怎樣做到如此強勁的功能與效能的,這從網際網路上存在大量的Nginx 原始程式分析的部落格文章與討論區發文可見一斑。
既然網際網路上已有大量的Nginx 原始程式分析文章,那我現在撰寫這本書是否多此一舉?我會說不是,畢竟它較為完整地整理了Nginx 的相關核心流程。當然,這只是我列出的答案,最後還需要各位讀者來回答。本書的原始素材是我在最近幾年對Nginx 程式分析時斷斷續續地所做的筆記,只不過之前寫的筆記過細地逐行註釋程式,導致文件中充斥大量的程式。這次重新整理後,希望能從比較高的角度去解析Nginx,把握全域,弄清楚整體實現原理而非陷入細節。我認為只要看清楚了Nginx 整體的實現原理,對於一時間沒有觸及到的細節,在真正遇到那個點時再去了解也是毫不費力,最多只不過還需去查一下Man 手冊,了解一下系統API 而已。授人以魚不如授人以漁,為了達到這個目標,本書儘量少貼程式多畫圖,當然一些必要的程式仍然是不可或缺的,所以讀者還是會在本書看到原始程式碼。雖然我的最初出發點是好的,但是在解析Nginx 的某些功能時,我的確遇到了困難,特別是在解析到一大片程式卻並沒有孰輕孰重的情況下,實在讓我很糾結,把程式全部貼上將占去大量的版面,違背我少貼程式的初衷,不貼上又怕讀者不知我所云何物而看不懂。這不僅是因為Nginx 程式本身的耦合性較大,也在於我個人的文字描述能力有待加強,
還請各位讀者多多包涵。
適合讀者群
我面試過不少剛大學或所究所畢業的應屆生,問得比較多的一句是:寫過實際應用的程式嗎?答:沒有。我又問:看過什麼優秀的開放原始程式碼嗎?答:沒有。這種情況很糟糕。限於國內大學的環境,除了較為簡單的課程設計以外,很多大學生在校園內很少有機會寫程式或參與實作問題的解決。於針對這一點,至少我們可以去看一些有價值的優秀開放原始程式碼,畢竟在大學校園裡,我們有時間、有地點、有資源(教室、圖書館、電子閱覽室等)。所謂他山之石,可以攻玉,在了解這些開放原始程式碼的過程中,我們甚至可以嘗試寫一些擴充功能模組,逼迫自己去主動學習,培養紮實的理論基礎知識,鍛煉實際的動手程式設計能力,自己也會因此逐步成長許多。
本書的另一目標讀者群為軟體開發工程師,這是顯而易見的事情。短小精悍的Nginx 實現了如此強大的HTTP 服務、反向代理服務以及郵件代理服務等,這些功能值得每一位軟體開發工程師去學習和研究,況且也有不少專案在對Nginx 進行延伸開發或移植整合,有一本能幫助開發工程師快速開展工作的書籍也許能加快專案進度。
另外,鑑於對Nginx 的廣泛使用,雖然Nginx 官網上有不少針對設定使用的文件,但是限於文字描述的簡潔性與文件更新的落後性,對於運行維護工程師而言,一些設定指令的使用是靠逐步驗證來判斷其實際使用用法的。透過本書的介紹,我們能從原始程式碼上去找對應設定指令的用法並了解其真實的實際功能,即它讓原始程式碼本身就變成一本設定使用手冊。所以,對於那些具有強烈意願知其然又知其所以然的進階運行維護工程師,本書也是一個不錯的選擇。
我假設本書的讀者已經熟練了C 語言,並且對Linux 系統有某種程度的了解。不過,即使讀者在這些方面存在一些不足也無關緊要,我會盡可能地把相關擴充連結標記出來,讀者查詢一下相關資料即可。
本書的適合讀者群主要是以下三種:在校大學生;軟體開發工程師;Nginx 進階運行維護工程師。
本書的相關網站
我維護了一個包含本書相關資訊的網站:http://lenky.info/ngx_book/,其中主要包含了本書的勘誤表、內容擴充和修改;如果讀者有關於本書或Nginx 的任何問題,都可以在此頁面進行留言,我會儘量經常檢視並且及時回覆讀者提出的相關問題。另外,我的個人電子電子郵件為:lenky0401@gmail.com。
作為本書的作者,我以兢兢業業的態度力求做到準確無誤,但限於時間倉促和個人功力,書中難免會有一些紕漏、筆誤,有敘述不清楚的地方,請各位讀者和同行多多包涵,如果能提出寶貴的意見,我將洗耳恭聽,感激不盡。最後,也請大家關注一下上面提到的網址,有任何問題,我都會及時在那公佈。
前言
Nginx 原始程式研究是早在2008 年的事情。當時我正為職業規劃與未來發展困惑不已,一籌莫展之際不知從哪裡得知高性能伺服器是一個很有「前途」的努力方向,幾經搜索又機緣偶合地得識Lighttpd 與Nginx。在逐步了解和熟悉它們的原始程式後,我開始感到自己的無知與淺薄,發現原來程式也可以寫得如此優雅。
Nginx 提供了一個安全、快速並且靈活的Web Server 環境。與其他Web
Servers 相比,其主要特點是佔有系統資源少、平行處理能力強、穩定性好,這些都是吸引網站架構人員特別關心以及廣泛應用的極大優點。然而,對於開發工程師而言...
目錄
前言
Chapter01 原始程式分析的準備工作
1.1 主要特性
1.2 原始程式下載
1.3 原始程式目錄結構
1.4 原始程式分析工具
1.5 測試輔助工具
1.6 編譯與執行
1.7 其他準備
Chapter02 追蹤與偵錯
2.1 利用gdb 偵錯
2.2 利用記錄檔資訊追蹤Nginx
2.3 利用strace/pstack 偵錯Nginx
2.4 獲得Nginx 程式完整執行流程
2.5 額外偵錯
2.6 特殊應用邏輯的偵錯
Chapter03 處理程序模型
3.1 整體架構
3.2 核心處理程序模型
3.3 Cache 處理程序模型
3.4 處理程序通訊
3.5 共用記憶體
3.6 slab 機制
3.7 訊號處理
Chapter04 資料結構
4.1 記憶體池
4.2 Hash
4.3 Radix tree
Chapter05 設定解析
5.1 設定檔格式
5.2 設定項目解析準備
5.3 設定檔解析流程
5.4 設定資訊組織結構
5.5 設定資訊的繼承
Chapter06 模組綜述
6.1 Handler 模組
6.2 Filter 模組
6.3 Upstream 模組
6.4 Load-balance 模組
Chapter07 事件管理機制
7.1 I/O 多工模型
7.2 epoll 模型
7.3 事件處理
7.4 負載平衡
7.5 逾時管理
Chapter08 變數機制
8.1 初識變數
8.2 支撐機制
8.3 指令稿引擎
8.4 執行順序
Chapter09 請求處理與回應
9.1 建立監聽Socket 埠
9.2 建立連接Socket 埠
9.3 請求處理
9.4 資料回應
9.5 子請求
9.6 連接關閉
Chapter10 請求定位
10.1 Location 的產生
10.2 Location 的整理
10.3 Server 的定位
10.4 Location 的定位與使用
10.5 未命名location 的使用
10.6 try_file s 指令
Chapter11 動態頁面請求處理
11.1 測試環境
11.2 用戶端發起PHP 請求
11.3 請求轉發
11.4 資料回應
Chapter12 過濾模組
12.1 ngx_http_not_modified_filter_module
12.2 ngx_http_headers_filter_module
12.3 ngx_http_gzip_filter_module
12.4 ngx_http_range_filter_module
Chapter13 負載平衡
13.1 負載平衡策略
13.2 加權輪詢
13.3 IP 雜湊
13.4 兩種策略比較
Chapter14 存取控制
14.1 禁止指定IP 存取
14.2 密碼認證存取
14.3 其他存取控制措施
附錄A
附錄B
附錄C
前言
Chapter01 原始程式分析的準備工作
1.1 主要特性
1.2 原始程式下載
1.3 原始程式目錄結構
1.4 原始程式分析工具
1.5 測試輔助工具
1.6 編譯與執行
1.7 其他準備
Chapter02 追蹤與偵錯
2.1 利用gdb 偵錯
2.2 利用記錄檔資訊追蹤Nginx
2.3 利用strace/pstack 偵錯Nginx
2.4 獲得Nginx 程式完整執行流程
2.5 額外偵錯
2.6 特殊應用邏輯的偵錯
Chapter03 處理程序模型
3.1 整體架構
3.2 核心處理程序模型
3.3 Cache 處理程序模型
3.4 處理程序通訊
3.5 共用記憶體
3.6 slab 機制 ...