如何寫一個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 = 8080httpd = 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 serverhttp://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 系統)?