lighttpd源碼分析
① 自己開發的Web伺服器如何解析php文件
WAMP、LAMP里,A是Apache,P是PHP,PHP在Apache下一般是以伺服器模塊方式安裝,這些模塊在Apache體系結構里屬於可選功能層,Apache用apr_proc_create()函數為每個模塊創建一個子進程,每個進程的內存空間獨立,可以防止互相干擾。
WNMP、LNMP里的N是Nginx,Nginx主要通過FastCGI介面調用PHP之類的外部程序。
FastCGI是一個編程介面,可以將HTTP伺服器和腳本解析伺服器分開。Apache、Nginx、Lighttpd都實現了FastCGI介面。
如果想找個實現FastCGI介面的例子,推薦看Nginx的源碼(ngx_http_fastcgi_mole.c)。
Apache源碼里跟FastCGI介面有關的大致是這幾個文件:
fcgistarter.c
fcgi_protocol.h
mod_proxy_fcgi.c
更多內容可以搜「Apache源碼分析」、「Nginx源碼分析」、「FastCGI」。
② Nginx /Lighttpd是否支持asp
1. nginx和lighttpd基本上是同質的,都是採用基於epoll/kqueue/select的全非同步事件模型,可以輕松地維持大量的連接,不懼怕 慢連接攻擊。兩者都提供了豐富的HTTP服務功能,例如壓縮、url rewrite、虛擬主機、SSL、proxy等等。
Nginx大量模仿了apache的設計風格,比如模塊的定義、裝配、以及配置數據的解析和組織方式等等。Lighttpd則是自己設計的一套。 和lighttpd相比,Nginx做事更加精細,它提供的一些比較特別。
Nginx的代碼入手更困難一些(主觀看法)。舉個例子,Nginx內部的HTTP狀態遷移是比較隱性的,它通過一系列的handler賦值來實現,如果 要完整地追蹤一次HTTP請求的處理過程,比較費勁。這個就說明,一旦出了問題,追查比較困難。而lighttpd的代碼中有一個顯式的HTTP狀態遷 移,一目瞭然,相比之下比較好看一些。
擴展模塊開發方面,nginx的mole模仿了apache的設計和實現方式,和lighttpd是完全不同的。主觀感覺上nginx模塊開發的入門門檻更高一些,因為必須弄清楚nginx的內部運行機制才好確認你寫的代碼到底有沒有問題和隱患。
和lighttpd一樣,nginx同樣存在著開發文檔很少的問題。最好的文檔還是源碼本身。
2. Nginx完全不支持動態庫so,所以它的模塊都必須靜態編譯,且不能動態載入。要載入哪些模塊,模塊按照怎樣的順序執行,都是在編譯期由 configure指定的,如果要調整,也只能重新編譯一遍,無法通過改配置來實現。在這方面,Lighttpd做得比nginx好。Lighttpd支 持動態so,並且可以在配置文件中調整各模塊的先後順序,在某些應用場景下,調整模塊的先後順序是很有用的。
條件配置語法的靈活性,lighttpd比nginx要好一些。
3. 根據簡單性能對比,Nginx的性能比lighttpd略好
③ lighttpd,nginx哪個好
nginx 比較流行,網上資料也多。
④ Lighttpd源碼分析的作者自序
作為最為優秀的輕量級Web Server之一,Lighttpd有著眾多的忠實擁護者和使用者。本書就是一本介紹分析Lighttpd源碼的初級讀本,其主要目標在於:一方面讓已經接觸過網路編程的讀者可以從Lighttpd這個開源項目中學習到更深入實際的網路編程知識,另一方面也可以讓使用Lighttpd作為自己管理站點Web伺服器的讀者能更有效地使用、優化甚至定製自己的Lighttpd伺服器應用程序。
目前對於學習網路編程最好的參考書籍當屬《UNIX網路編程》(第3版)1,但是其包含內容眾多,講解太過廣泛深入,不是在短期時間內就能很好領會並靈活運用的,因此它更適合當作我們桌邊的手冊或聖經。在實踐項目中學習,從實踐源碼中理解,這一直是我們學習的最好方法,雖然當前書市也有不少關於實踐項目介紹的書,但是由於實在太過龐大(比如Apache)或實踐項目不具有代表性,選擇性的講解使得許多細節被忽略,細節不明朗使得讀者也很難清楚地從整體上去把握。本書選擇的Lighttpd開源項目內容較少卻功能實現完整,是難得的學習網路編程的源碼材料。另外,我們在講解該項目源碼時緊密結合Web開發的相關RFC協議文檔(比如RFC 822、RFC 1034、RFC 1035、RFC 1738、RFC 2068、RFC 2396、RFC 2616、RFC 2732、RFC 3986等)對所分析的代碼為什麼這樣寫都做出了詳細的解釋,並指明了其依據的是哪個RFC的哪個部分,可以讓讀者明確查找方向,以快速、進一步地對其深入理解。
總的來說,Lighttpd源碼雖然代碼量不多,但是其設計巧妙,效率高,實現功能完備並且易擴展,因此能在眾多優秀Web Server中取得一席之地。Lighttpd編碼風格優美,C代碼簡潔明了,是學習linux/C網路編程、熟悉Http伺服器編寫的良好範例。另外,源碼把和Web有關的眾多國際標准或協議(如Http、Url、Html等)實現得恰如其分,閱讀Lighttpd源碼,不管是C基礎還是網路協議實現,都可以從中獲益良多。
本書針對的Lighttpd項目版本為最新(2008年12月16日)的穩定版本1.4.202,一共包含有137個文件。在本書的實際講解中,這些文件並不會被全部講到,這主要是由於Lighttpd插件太多,不可能一一講解到,但是由於這些插件有一個統一的骨架,因此對其中一個插件的理解自然可以類推到其他插件,而本書對Lighttpd插件的整體以及幾個具有代表性的插件進行了詳細講解,因此讀者完全不用擔心會影響自己對Lighttpd源碼的理解。除了源碼分析知識外,另外一些涉及的技巧(比如Linux操作技巧)、工具等也會給出提示和介紹,以便初學者也能順利閱讀本書。
本書的目標讀者定位在想要學習Linux/C網路編程或者想要提高自己網路編程水平以及對Web服務後台開發感興趣的計算機專業開發研究人員;對於使用Lighttpd作為自己管理站點Web伺服器的用戶閱讀本書也能獲取一定的相關幫助。
作為本書的作者,我把閱讀Lighttpd源碼的總結盡可能詳細地記錄下來,供大家學習參考。由於本人才疏學淺,又經驗不足,因此本書中會存在不足之上,請大家不吝賜教。
最後,感謝Jan Kneschke3大師為我們提供了這么優秀的開源項目,感謝曾經在CU、CSDN、BAIDU、LQ等論壇、網站直接或間接地幫助過我的各位熱心網友。
高群凱
⑤ Lighttpd源碼分析的圖書目錄
前言
第1章 Lighttpd介紹與分析准備工作 1
1.1 Lighttpd介紹 1
1.1.1 什麼是Lighttpd 1
1.1.2 Lighttpd功能概述 1
1.2 源碼分析的准備工作 3
1.2.1 Lighttpd源碼下載與組織結構 3
1.2.2 Lighttpd源碼分析工具 4
1.2.3 系統編譯環境 6
1.2.4 Lighttpd編譯運行 6
1.2.5 其他准備 7
1.3 本書內容綜述 7
1.4 本章總結 8
第2章 Lighttpd網路服務主模型 9
2.1 概述 9
2.2 Lighttpd主進程執行流程 10
2.2.1 Lighttpd進程守護化 10
2.2.2 Lighttpd多進程網路服務模型 14
2.3 Lighttpd信號處理機制 20
2.3.1 信號的概念 20
2.3.2 Lighttpd中信號處理機制 21
2.4 Lighttpd工作進程處理模型 25
2.5 本章總結 26
第3章 Lighttpd數據結構 27
3.1 概述 27
3.2 bitset數據結構 27
3.2.1 結構說明 27
3.2.2 結構定義 27
3.2.3 結構操作 30
3.3 buffer數據結構 32
3.3.1 結構說明 32
3.3.2 結構定義 32
3.3.3 結構操作 33
3.4 data_xxxxx數據結構 65
3.4.1 結構說明 65
3.4.2 結構定義 65
3.4.3 結構操作 67
3.5 array數據結構 67
3.5.1 結構說明 67
3.5.2 結構定義 68
3.5.3 結構操作 69
3.6 chunk數據結構 78
3.6.1 結構說明 78
3.6.2 結構定義 78
3.6.3 結構操作 80
3.7 keyvalue數據結構 88
3.7.1 結構說明 88
3.7.2 結構定義 88
3.7.3 結構操作 91
3.8 本章總結 92
第4章 伸展樹 93
4.1 概述 93
4.2 伸展樹基礎知識 93
4.2.1 伸展樹介紹 93
4.2.2 伸展樹的自底向上伸展 94
4.2.3 伸展樹的自頂向下伸展 98
4.3 Lighttpd中伸展樹實現源碼解析 101
4.3.1 結構定義 101
4.3.2 結構操作 102
4.4 本章總結 106
4.5 參考文獻 106
第5章 日誌系統 108
5.1 概述 108
5.2 日誌源碼解析 108
5.2.1 日誌系統頭文件 108
5.2.2 日誌系統實現文件 109
5.3 本章總結 124
第6章 文件狀態緩存器 125
6.1 概述 125
6.2 ETag知識 125
6.2.1 ETag的定義 125
6.2.2 ETag的功能 126
6.2.3 ETag的優勢 127
6.2.4 Lighttpd中ETag的實現 128
6.2.5 Lighttpd中ETag的使用 130
6.3 文件狀態緩存器 134
6.3.1 緩存器設計思路 134
6.3.2 緩存器結構定義 134
6.3.3 緩存器實現 137
6.4 本章總結 159
第7章 配置信息載入 160
7.1 概述 160
7.2 配置信息範例與程序載入結果 160
7.2.1 Lighttpd配置信息的範例 160
7.2.2 Lighttpd配置信息範例的載入結果 164
7.3 載入配置信息的源碼分析 167
7.3.1 Lighttpd配置信息存儲結構 167
7.3.2 Lighttpd配置信息載入的函數
調用流程 172
7.4 客戶端連接配置信息 203
7.4.1 條件配置信息緩存存儲結構 203
7.4.2 客戶端連接配置信息動態獲取 204
7.5 本章總結 215
第8章 I/O多路復用技術模型 216
8.1 概述 216
8.2 I/O模型基礎知識 216
8.2.1 I/O模型分類介紹 216
8.2.2 常見I/O多路復用實現技術 221
8.3 Lighttpd中多路復用技術模型應用 236
8.3.1 整合多種復用技術模型的數據結
構封裝 237
8.3.2 I/O多路復用技術模型的使用 250
8.3.3 六種I/O多路復用技術模型的實現 256
8.4 本章總結 279
第9章 插件鏈 280
9.1 概述 280
9.2 插件內部結構 280
9.2.1 數據結構 280
9.2.2 函數介面 283
9.3 插件組織結構 286
9.3.1 串鏈結構 286
9.3.2 插件組織結構源碼分析 286
9.4 本章總結 296
第10章 網路請求服務響應流程 297
10.1 概述 297
10.2 簡單網路服務通信模型 297
10.3 Lighttpd網路服務通信模型 298
10.3.1 通信模型總圖 298
10.3.2 通信模型源碼分析 299
10.4 本章總結 402
第11章 請求響應數據快速傳輸方式 403
11.1 概述 403
11.2 三種數據傳輸方式 403
11.2.1 內核系統調用架構 403
11.2.2 read/write數據讀寫傳輸方式 405
11.2.3 readv/writev數據讀寫傳輸方式 408
11.2.4 「零拷貝」(sendfile)數據讀
寫傳輸方式 409
11.3 傳輸方式程序實現 413
11.3.1 源碼network_write.c分析 413
11.3.2 源碼network_writev.c分析 417
11.3.3 源碼network_linux_sendfile.c
分析 423
11.4 本章總結 428
第12章 基本插件模塊 429
12.1 概述 429
12.2 mod_indexfile插件模塊 429
12.2.1 數據結構 429
12.2.2 函數介面 430
12.3 mod_dirlisting插件模塊 433
12.3.1 數據結構 433
12.3.2 梳子排序 439
12.4 mod_staticfile插件模塊 441
12.4.1 數據結構 442
12.4.2 函數介面 442
12.5 本章總結 443
後記 444
附錄一 ASCII碼字元表 445
附錄二 擴展ASCII碼字元表 446
附錄三 客戶端請求連接的有限狀態
機轉換圖 447
附錄四 HTTP狀態碼簡介 448
附錄五 參考資料 449
⑥ 如何讓lighttpd的spawn-fcgi自啟動
修改編譯spawn-fcgi因為用spawn-fcgi 啟動後不能喲 -u root 啟動FastCGI進程。所以修改了源代碼:下載代碼[plain]wget download/spawn-fcgi/releases-1.6.x/spawn-fcgi-1.6.3.tar.gz 解壓後進入目錄,在文件src/spawn-fcgi.c中注釋掉一段代碼:[plain]/* if (my_uid == 0) { fprintf(stderr, spawn-fcgi: I will not set uid to 0/n); return -1; } */ 類似的還有兩處要注釋。運行./configure然後編譯makemake installmake install 不大靈光,手動拷貝吧。現在再試試看,搞定了。