本文的部分內容和圖片摘錄於http://tengine.taobao.org/download/nginx@taobao.pdf
為什么要使用nginx模塊?我個人覺得taobao這個ppt來做說明是最好不過了
從web服務器結構開始說起:
第一個模式(LAMP):
這個結構中,Apache的PHP模塊將所有動態網頁都使用php解析,所有邏輯結構都放在php中進行處理。
這個結構也是現在最多web網站的架構LAMP(Linux+Apache+PHP+Mysql)
Apache的強勁的市場占有率(12月全球市場份額報告)也說明了這個結構的好處是易於理解,開發上手快。存在就是理由,Apache的各種功能模塊已經實現很多了,基本上能想到的功能都已經實現了。
但是這個結構有其致命的弱點:
1 高並發下性能表現不佳
2 頁面主體內容(比如)圖片等靜態資源訪問浪費帶寬(當然這個后來大公司都改用CDN來處理)
3 存在慢連接攻擊(syn flood)風險
模式演變:
關於Apache和Nginx的優缺點的討論請看這里
Apache2.4剛剛發布,宣稱it’s “as fast, and even faster than Nginx”.
這里有一個blog對進行了測試實驗。
第二種模式(LNMP):
Nginx是個輕量級的HTTP server,必須借助第三方的FastCGI處理器才可以對PHP進行解析。現在使用最多的就是nginx+php-fpm+php這個模式了。
這里Apache被nginx取代,隨之帶來的解決優勢是:
1 提高並發服務能力
2 可以抵御慢連接攻擊
相對於上一個模型,還有其他的優點:
3 靜態內容(css,js,pic)等放到CDN上,避免了帶寬浪費
4 php對於這些大數據量的數據的處理驟減,減少了php的計算量
但是這個模式最大的問題就在於:Php+php-fpm對於nginx本身性能的限制。
nginx本身的極限測試:單機支持200萬連接以上(據說,未驗證),而php+php-fpm+nginx大概是3萬以上。(參考張宴的博客)。當然這個性能已經遠遠滿足了絕大部分的網站。但對於一些超大規模的項目(比如taobao)就必須考慮高並發的性能問題了。
好了,現在考慮,為什么一定要使用php呢,nginx是否能完成邏輯呢?
模式演變:
從nginx聊開(nginx中文維基):
nginx是輕量級web服務器,它代碼不多(v0.5.32才8w多行代碼)。Nginx本身做的工作實際很少,當它接到一個HTTP請求時,它僅僅是通過查找配置文件將此次請求映射到一個location block,而此location中所配置的各個指令則會啟動不同的模塊去完成工作,因此模塊可以看做Nginx真正的勞動工作者。
nginx中的模塊都是使用C語言編寫的。nginx中模塊分為Handler,filter和upstream三種類型。
第三種模型:
這種模型徹底放棄了php,邏輯不再依賴php腳本了,直接使用nginx的擴展來完成,這就意味着不需要開啟n個fastcgi,不需要使用php進行邏輯操作了,高並發的php的限制也消失了。
初次看到這個模型會產生幾個問題:
1 nginx如何高效訪問Mysql數據庫呢?
使用ngx_drizzle模塊(國人編寫)
2 要實現越來越多的nginx模塊,發現c語言開發效率太低了,是否有其他腳本引擎呢?
使用lua腳本,ngx_lua模塊(taobao兩位大神的傑作)
在nginx_at_taobao的ppt上說taobao在2010年已經在開發大量的nginx模塊了,並且在2011年推出了自己的web服務器Tengine(可以看做是nginx的super版本)(看來taobao在web服務器方面是非常強啊!!)
這第三種模型是taobao大力推薦和正在使用的:
使用lua腳本(巴西人發明的一種語言,相當高效簡易)寫nginx擴展
nginx直接連接數據庫
將靜態資源放到cdn上
保證高並發下的效率的提升
nginx的第三方模塊http://wiki.nginx.org/3rdPartyModules
----------------------
作者:yjf512(軒脈刃)
出處:http://www.cnblogs.com/yjf512/
本文版權歸yjf512和cnBlog共有,歡迎轉載,但未經作者同意必須保留此段聲明