如何用C++語言開發 tiny Nginx並真正鍛煉C++的使用?


其實做伺服器初期是不需要自己寫網路這塊的代碼的,主城都給你封裝好了,有的用的網路庫,有的自己寫的。我們使用的是c++11,很好用,你應該多學學c++語言本身,看看基本的演算法,了解基本的設計模式,以後的伺服器或多或少會用到的,至於通信,那就是一個比較專業的方向,雖然前期不用你寫,但是還要了解的,libevent可以看看,我們的通信跟這個很像,你先看明白socket的介面,明白epoll這些是前期要做的,想一下弄明白網路庫,是不現實的,因為裡面很多機制你都沒接觸過,只能邊做邊學,以後會看懂的。總之現在的建議是踏踏實實看看底層的socket和epoll,看看多線程(c++11)已經有了,看看c++primer和侯捷的那個新標準庫(c++11),看了你也不可能全明白,但是看了再做項目的時候會聯想到,再回頭反覆看,終究會明白大部分的,然後慢慢的你就能領會,這些都差不多了,你再研究網路庫會發現有些你看不懂的其實是約定俗成的方法,也就容易理解了,不要急,學習過程確實漫長,確實乏味,確實感覺做不出實際的東西,但是誰都要經理這段時間,努力下去,做著項目的時候就會好很多,進步也會很快


謝邀。。同問


我剛剛寫了一個 其實這個對c++的要求並不高,但是你要做的好並不簡單。有機會可以探討下


如果你想學網路編程的模型和設計模式,就去嘗試寫tiny nginx。

如果是想學c++,那就去把stl實現(特別是模板的組合使用)看懂,然後再造幾個輪子。

比如實現std::bind和std::function。

一樣一樣來。


雖然對Nginx的原理有過研究,但源碼研究不深,我就粗淺的回答一下。另外,你想用C++的目的具體是什麼,如果是想深度掌握C++的各種高級特性,我覺得Nginx這種偏底層的系統不太適合發揮C++的特點;如果你想用C++來體驗面向對象開發的話,沒有問題。

Nginx是C語言寫的,但這個不是改寫為C++的關鍵,關鍵是C語言開發時面向過程的思想,C++開發是面向對象的思想,兩者的差別還是很大的。通俗的講,面向過程開發就是設計好「第一步幹什麼」、「第二步幹什麼」、「第三步幹什麼」。。。。。而面向對象的開發就是設計好有哪些對象,例如編碼器、解碼器、HTTP協議解析器,這些對象在不同的步驟中可能都有涉及。

以Nginx處理HTTP為例(樣例,僅供參考,實際比這個複雜10倍不止):

C語言面向過程的處理方式:第一步:解析HTTP Method;第二步:解析HTTP Header;第三步:解析HTTP Body。。。。。。第X步:生成返回Header,第Y步:生成返回Body,第Z步:返迴響應;

C++面向對象的處理方式:Method、Header、Body三個對象,但不要簡單理解為一個步驟對應一個對象,而是一個對象可以在很多處理流程中出現。例如:Header對象可以用於第二步解析Header,也可以用於第X步生成具體的返回Header。

另外,Nginx的module設計,本質上其實就是面向對象的,一個module就是一個廣義上的對象。

所以,如果你想用C++來改寫Nginx,通過這個方式來實踐面向對象編程的話,首先要對Nginx的實現原理和機制非常熟悉,然後才能從中提取面向對象相關的對象和類,最後用C++還是Java實現,差別都不會很大。自己改完之後,可以對照Netty的設計,看看你的設計和Netty差別在哪裡。


謝邀

沒有研究過Nginx的代碼,僅僅提供幾個思路給題主

1、STL。當使用列表、樹的數據結構的時候,是否可以把這些數據結構改成使用STL的版本

2、抽象與多態。是否可以使用抽象和多態代替函數指針的使用?是否可以使用繼承來代替原來公共函數

3、模版。是否可以使用模版替代原來的高抽象函數


題主我也想寫 可以一塊,


謝邀。

看懂了nginx的流程自己模仿用cpp寫一遍就行了吧


由於C++向下兼容C語言,可以把Nginx的原版模塊和C++寫的模塊用C++的的鏈接器鏈接起來。

Nginx在Windows的效率不高,而Windows下的IOCP庫比epoll只好不差。

個人不專業的看法,時間多的話可以分幾步走:

1、用C++編寫模塊;

2、用C++的模塊逐步替代原版模塊;

3、寫一個IOCP模塊,提高Nginx在Windows下的效率(跟Linux無關?反正是C++、Nginx管他什麼平台)。

題外話,先考慮清楚,之前寫過多少代碼?C++和STL的坑還是不少的,要想寫一個十萬行級別的、穩定的軟體,會有很多瑣碎的事情,付出的代價肯定會影響到你的興趣。


比如看nginx我感覺看的同時要多思考,不要著重於它是怎麼實現。 要從ngin要解決什麼問題的再考慮如何實現。 然後寫web server才會思路清晰。 至於想鍛煉C++就看點那些經典的書,比如stl源碼,看看boost,想寫好代碼可以看看設計模式,重構。


說些會被被Nginx粉噴的看法,nginx 作者的c語言功底很強,但Nginx的設計不怎麼樣,這種以配置文件為核心的設計,用沒有反射功能的語言寫出來就是一坨翔,並且Nginx里每個模塊一個全局變數,有的互相依賴,怎麼也看不出這種設計的好處,用c或cpp 寫這種以配置文件為中心的軟體,第一件事就是造輪子實現反射。

PS以前寫過Nginx的插件,實現協議轉換和推模式,至今在公司伺服器上跑。


可以 研究muduo,然後在此基礎上實現一個http server


1. 你可以讓nginx支持cpp寫模塊的呀。

2. 你可以把nginx沒有用的模塊去掉,只留下框架。


那不如就試試poco c++


推薦閱讀:

作為軟體在校生,自己如何去找軟體項目並著手去編碼?
用c++寫https客戶端和伺服器大體步驟有哪些?
C++遊戲開發擇業前景?
使用cocos2D遊戲引擎開發遊戲的話,是選擇使用cocos2D-x使用C++來編寫,還是使用cocos2D-html5來編程,原因是什麼?
shell好難學,能用python替代shell嗎?

TAG:伺服器 | Nginx | C | 網路編程 | TCPIP |