如何寫一個web伺服器?

有沒有入門書籍或者相對簡單的開源項目?


推薦一下自己寫的一個http server:zyearn/zaver · GitHub

Zaver的目的是幫助開發者理解基於epoll的高性能伺服器是如何開發的。

Nginx是一個非常好的伺服器開發學習範例,但是它的代碼規模較大也較複雜,讓許多人望而卻步。

Zaver用非常少的代碼展示了像Nginx這類高性能伺服器的核心結構,為開發者進一步學習網路編程打下基礎。

如果各位有興趣,可以看看我的博文講述了Zaver的架構以及是如何一步步構建起來的:如何寫一個Web伺服器

-----

如果是從毫無任何基礎開始看,那麼 CSAPP(2nd edition) 11.5章是比較好的入門資料。

介紹了伺服器怎麼接受請求,處理請求,包括靜態內容和動態內容(CGI),最後發回response的全部過程和一些注意點。

最後作者實現了一個tiny server,非常簡單的實現方式,不支持高並發,但這個小型伺服器能正常work了。

代碼很短,一共200多行吧,附個鏈接:

http://csapp.cs.cmu.edu/public/ics2/code/netp/tiny/tiny.c

這個代碼有很多可以改進的地方,正好可以用來練手:

1. 如何支持高並發?(學一學epoll以及一些底層優化)

2. 如何支持日誌 ?(寫一個簡易的非同步日誌庫)

3. 如何從配置文件中讀配置?(寫一個讀配置文件的庫)

等等...自己寫完了再和別人的比比哪些地方不足

在造輪子的過程中學習。


最近在自學python,昨天剛好看到一個入門的栗子:

from http.server import HTTPServer, CGIHTTPRequestHandler

port = 8080

httpd = HTTPServer(("", port), CGIHTTPRequestHandler)

print("Starting simple_httpd on port: " + str(httpd.server_port))

httpd.serve_forever()

伺服器建好了~ 想進一步挖掘可以去看 HTTPServer,CGIHTTPRequestHandler還有socketserver的源代碼~ 在我一個沒寫過多少代碼的新手來看,這些源碼不是特別複雜,勉強能看懂~ 對照著百度google都能看下去~ 看完書上的這個栗子,我反正是第一次感受到了python的流弊

獻醜了~


http://msdn.microsoft.com/en-us/library/windows/desktop/aa364510(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/aa364640%28v=vs.85%29.aspx

看完就明白了


RFC 2616是需要讀的——了解HTTP協議。

簡單的開源Web伺服器推薦Mongoose——上手會比較容易。

生產環境的開源Web伺服器推薦Nginx——代碼寫得很漂亮。


直接上我們課件,最基本的web client 和 web server

http://www.cse.psu.edu/~djp284/cmpsc311-s14/slides/29-networking.pdf

應該很容易看懂


創建套接字監聽一個系統沒用的埠,獲取請求,根據請求響應,請求和響應就是tcp,按照什麼約定解析請求和響應就是http協議。


答案肯定時有的

有幾百行能實現基本功能的,也有20多萬行的,既然題主是想做個簡單的,那我們還是來討論幾百行的實現的(其實是看不太懂 C/C++ 的代碼)

webserver 基本由這些組成

  • 綁定TCP埠,監聽客戶端(瀏覽器)請求
  • 處理客戶端(瀏覽器)請求
  • 響應客戶端(瀏覽器)請求

是不是覺得很簡單,其實大多數互聯網請求都是這樣的,比如常見發郵件,和發郵件不同也僅僅是協議(方言)不同罷了

RFC2616 這個標準目前還是使用最為廣泛的一個版本,目前在 HTTP2.0 在國內還沒有大面積使用的情況下,看這個應該夠了


上面都比較廢話

我覺得還是直接看代碼來的快,無非就是那些東西,請求多了就epoll,單線程讀取(響應)HTTP請求慢就開多個線程來處理(netty reactor 模型)

於是貼個自己基於NIO實現的一個 webserver 吧,供Java程序員學習交流使用

[simplewebserver] - 3000代碼行實現的一個功能比較完整的webserver


rebuilding a web server 視頻下載:rebuilding_a_ruby_web_server_1280x720.mp4_免費高速下載macournoyer/tube · GitHub


《深入剖析tomcat》

這本書挺不錯的,最新在學習,由淺入深


network programming 課程的最終作業一般就是這個。

找個國外大學的同名課件看看即可。


推薦閱讀:

Web 伺服器與應用伺服器的區別是什麼?
如果伺服器所在的內網進行物理隔離(斷開互聯網連接),黑客有辦法突破並竊取到其中的信息嗎?
如何選擇國外的伺服器?
類似coc這種全球同服,並且註冊玩家與在線玩家龐大的遊戲,伺服器端架構該如何設計呢?
推薦一個持續監測伺服器cpu、內存、網路等的軟體(MS 系統)?

TAG:伺服器 | Web伺服器軟體 | Web伺服器 |