如何一步步學習開發伺服器(nginx)?

在校大學生,現在大三,目前學習nginx源碼和網路編程,並欲自己開發一個伺服器(當然不會如Tengine般複雜)?求實際做伺服器開發的大神指教,並求有意願的大神可以一起做這個項目?You can email me @ http://iamwgliang@gmail.com/ liangcszzu@163.com


因為題目中提到了Nginx和Tengine,所以這裡假設是Linux下面的HTTP伺服器的開發。

HTTP伺服器開發是個漫長的體力活,如果真的想做下去,必須要有強烈的興趣支撐。但是除此之外,HTTP伺服器開發並沒有什麼特別高深的演算法在裡面,好好努力的話,做出來自己的HTTP伺服器也並不是一件太難的事。

需要準備的有:

  1. 紮實 的C語言編程基礎。相信到了大三的時候,你已經有了幾年的變成經驗,但是對於開發HTTP伺服器來說,還是遠遠不夠。課本中會給你C語言的一個大概講解,但是在現實世界中,還是會有很多課本中覆蓋不到的地方。因為你已經在閱讀Nginx的代碼了,所以建議你首先檢查一下代碼中是否有不認識的C語言語法和用法。如果有,那麼就自己Google學習一下。如果沒有,那麼說明你的C語言學的足夠好,不存在語言層面上的問題。接下來,非常推薦學習一下這本經典的The Practice of Programming。學校里學習到的知識太書本化,代碼又太專業,不好懂。這本書能幫你在兩者之間找一個平衡,讀了之後就會知道很多地方為什麼要這麼做。

  2. C語言準備的差不多了之後,可以開始準備網路編程的知識。Unix Network Programming的確是本好書,但是問題在於,它太厚了。對於初學者來說,它提供的東西太多了。從實用的角度,我更推薦Beej』s Guide to Network Programming,不太長,但是涵蓋了網路編程的基本上所有常用的內容。全部讀完也不過幾個小時的時間。UNP可以用來在修鍊的差不多了之後用來做參考書。或者用來學習網路編程中具體某個細節的知識。

  3. 接下來,因為是要寫HTTP伺服器,所以對HTTP協議需要有很深入的了解。當然最權威的資料就是一系列的RFC,比如HTTP 1.1的https://www.ietf.org/rfc/rfc2616.txt。這時候就到了最開始講的體力活的地方。不斷的仔細閱讀RFC,然後把它講到的內容全部用代碼實現一遍。當然,也有偷懶的辦法,直接使用現有的HTTP解析庫,比如h2o/picohttpparser · GitHub。

另外,關於Nginx的架構設計,Andrew Alexeev在 The Architecture of Open Source Applications (Volume 2): nginx裡面講的很清楚。這個會對你讀代碼有很大的幫助。


看HTTP RFC,然後看UNP,然後寫代碼。

您這連『伺服器』和『HTTP伺服器』都沒分清呢。就想寫自己的伺服器。


做這件事一開始不要老是去想參考別人的做法

編寫網路伺服器一開始只要思考「如何利用一個不100%可靠的雙向byte流接受和發送有意義的數據」這個問題就好了。我認為聰明的高中生也能考慮清楚

當然,寫出bug free和高性能的代碼需要一些經驗,但是最核心的邏輯如果自己獨立想清楚的話比看什麼書都有用。畢竟最好的工具是自己的大腦


&<深入理解nginx:模塊開發與架構解析&>,學習nginx好書中的好書,強烈推薦!講框架、講代碼,非常深入。初學者會感覺比較吃力,但是越看越感嘆其經典。網上有電子版,很容易搜到。


github上http伺服器項目一大堆,題主隨便關注幾個唄

當年剛剛看完《unp》時寫的一個簡易的http伺服器zouxiaohang/webserver · GitHub 當時也是作為初學者的狀態寫的,題主也可以參考參考 :)


推薦閱讀剛剛上架的新書:《精通Nginx》([瑞士]艾維利(Dimitri,Aivaliotis))

剛剛上傳了本書中Nginx配置指南的章節,可以看一下。Nginx配置指南


源碼,最好的教材~


你可以到技術宅福利吧http://www.jishuzai.cn這個網站下載相關專業視頻,有很多主流培訓班的教學視頻,多下載幾個,然後看看哪個老師的講課更適合你,找到後就按視頻進程學習就行了。

跟視頻學習的好處

第一,省錢。報名培訓班往往一萬多,看這些視頻是不用錢的。

第二,工作學習兩不誤。專業培訓班往往需要全日制去學習,而跟視頻學習進度自己掌握。


推薦閱讀:

TAG:計算機網路 | Nginx | Web伺服器 | nginx-concat |