多進程單線程模型;
這類訪問模型, 每一個請求都對應(yīng)開辟一個新的進程, 在進程內(nèi)是單線程的白嘁。
優(yōu)點:
- 編程相對容易士修;通常不需要考慮鎖和同步資源的問題。
- 更強的容錯性:比起多線程的一個好處是一個進程崩潰了不會影響其他進程漆枚。
- 有內(nèi)核保證的隔離:數(shù)據(jù)和錯誤隔離。
對于使用如C/C++這些語言編寫的本地代碼抵知,錯誤隔離是非常有用的:采用多進程架構(gòu)的程序一般可以做到一定程度的自恢復(fù)墙基;(master守護進程監(jiān)控所有worker進程软族,發(fā)現(xiàn)進程掛掉后將其重啟)
缺點:
進程切換開銷大, 密集訪問帶會來的并發(fā)問題。
例子:
- php-fpm的fast-cgi進程管理模式, 每個線程只能處理一個客戶端連接残制。所以ningx+php-fpm一直被詬病, 靜態(tài)處理可以, 動態(tài)處理不行立砸。
- nginx主流工作模式是多進程單線程 & 多路IO復(fù)用模型(當然nginx也是支持多線程的方式的,只是我們主流的方式還是多進程的方式)初茶,但是每個線程可以處理多個客戶端的訪問,這也成就了它的并發(fā)性能颗祝。
- apache的prefork模式
- 幾乎所有的web server服務(wù)器服務(wù)都有多進程單線程模式。
單進程多線程模型恼布;
這類訪問模型, 服務(wù)器啟動時一個進程, 每個WEB項目是部署一個線程池, 每一個請求針對該項目的請求都對應(yīng)開辟一個新的線程存于線程池, 在線程內(nèi)又可以開辟子線程螺戳。
優(yōu)點:
創(chuàng)建速度快,方便高效的數(shù)據(jù)共享
共享數(shù)據(jù):多線程間可以共享同一虛擬地址空間桥氏;多進程間的數(shù)據(jù)共享就需要用到共享內(nèi)存温峭、信號量等IPC技術(shù);
較輕的上下文切換開銷 - 不用切換地址空間字支,不用更改寄存器凤藏,不用刷新TLB。
提供非均質(zhì)的服務(wù) , 如果全都是計算任務(wù)堕伪,但每個任務(wù)的耗時不都為1s揖庄,而是1ms-1s之間波動;這樣欠雌,多線程相比多進程的優(yōu)勢就體現(xiàn)出來蹄梢,它能有效降低“簡單任務(wù)被復(fù)雜任務(wù)壓住”的概率;
缺點:
只有一個進程富俄,一旦其中出現(xiàn)一個錯誤禁炒,整個進程都有可能掛掉。你當然可以為ta編寫一個“守護程序”來重啟霍比,但是重啟期間幕袱,你的服務(wù)器是真的“掛掉了”。
例子:
tomcat有三種工作模式, 在NIO模式下啟動一個tomcat就是一個進程, 每個針對項目的訪問都對應(yīng)一個線程,如果閑置線程占用滿了就會開辟新的線程,直到達到設(shè)定的最大線程悠瞬。
tomcat三種線程模型
詳解tomcat的連接數(shù)與線程池
服務(wù)器工作模式就是服務(wù)器在運行時候的內(nèi)存分配们豌,進程和線程的使用方式。
Apache工作模式詳解
Apache有一共有三種穩(wěn)定的MPM(Multi-Processing Module浅妆,多進程處理模塊)模式,其中 最常使用和最新的是prefork工作模式
在linux(centos)下使用#http –l 命令可以查看當前使用的工作模式望迎。也可以使用#apachectl -l命令。
- http –l
- apachectl –l
worker工作模式(與php配合不好凌外,或者說暫時用不上)
worker模式由于使用線程來進行處理請求辩尊,所以能夠處理海量請求,而系統(tǒng)資源的開銷要小于基于進程的服務(wù)器趴乡。同時worker模式也使用了多進程对省,每個進程又有著多個線程蝗拿,以獲得基于進程服務(wù)器的穩(wěn)定性晾捏。
event模式
event模式由于把服務(wù)進程從鏈接中分離出來蒿涎,在開啟KeepAlive場合下相對worker模式能夠承受的了更高的負載。event模式為 worker開發(fā)的變種模式惦辛,配置以及指令與worker完全相同劳秋。不過event模式不能很好的支持https的訪問,有時還會出現(xiàn)一系列的問題
prefork工作模式 ---主流
prefork工作模式是linux下apache安裝時候的默認工作模式胖齐,是使用最普遍的工作模式玻淑。為了能夠簡單的明白他的工作原理,下面是一個假設(shè):
有一臺正在運行的apache服務(wù)器呀伙,用戶A訪問該apache的時候apache建立一個新的進程1處理用戶A的請求补履。
這時又有一個用戶B訪問該apache,apache又建立一個新的進程2處理用戶B的請求剿另。
后來又有用戶C箫锤,D,E訪問該apache雨女,apache又建立三個進程3谚攒,4,5處理他們的請求氛堕。
那么如果有5個用戶同時訪問apache馏臭,apache第一次建立的5個進程全部用光了,所以apache就再從新在建立5個進程讼稚,等待下一批用戶的請求括儒。
prefork模式會根據(jù)服務(wù)器的硬件情況,設(shè)定apache最多只能同時建立256個進程锐想。再多的請求就只能等待前面的進程處理完畢在進行處理帮寻。
上面的假設(shè)就是prefork模式的工作原理。但是上面假設(shè)中具體的數(shù)字不是定死的痛倚,而是通過prefork模式的配置來設(shè)置的规婆。
Apache實現(xiàn)多進程模型的原理
服務(wù)器工作模式就是服務(wù)器在運行時候的內(nèi)存分配,進程和線程的使用方式蝉稳。
Nginx工作模式詳解
nginx是一個多進程/多線程高性能web服務(wù)器抒蚜,在linux系統(tǒng)中,nginx啟動后會以后臺守護進程(daemon)的方式去運行耘戚,后臺進程包含一個master進程和多個worker進程(這個數(shù)量可以在nginx.conf配置文件中worker_processes這個參數(shù)設(shè)置)嗡髓。
每個worker里面只有一個主線程,那能夠處理的并發(fā)數(shù)很有限啊收津,多少個worker就能處理多少個并發(fā)饿这,何來高并發(fā)呢浊伙?非也,這就是nginx的高明之處长捧,nginx采用了 異步非阻塞
的方式來處理請求嚣鄙,也就是說,nginx是可以同時處理成千上萬個請求的串结。
簡單的說,worker進程的主線程線程可以處理多個客戶端的訪問,這也成就了它的并發(fā)性能哑子。
master主進程
主要用來管理worker進程,主要作用是:讀取并驗正配置信息肌割,接收來自客戶端的的請求卧蜓,向各worker進程發(fā)送信號,監(jiān)控worker進程的運行狀態(tài)把敞,當worker進程退出后(異常情況下)弥奸,會自動重新啟動新的worker進程。而用戶的請求則是worker進程來響應(yīng)的奋早。
多個 worker子進程
將監(jiān)聽同一個端口盛霎,并行處理請求。
worker 進程數(shù)應(yīng)該設(shè)置為等于 CPU 的核數(shù)伸蚯,高流量并發(fā)場合也可以考慮將進程數(shù)提高至 CPU 核數(shù) * 2刃唐。
nginx與apache的比較
Nginx使用了最新的epoll(Linux 2.6內(nèi)核)和kqueue(freebsd)網(wǎng)絡(luò)I/O模型揩魂,而Apache則使用的是傳統(tǒng)的select模型果覆。
處理大量的連接的讀寫颓芭,Apache所采用的select網(wǎng)絡(luò)I/O模型非常低效。
Apache的優(yōu)點:
1挥萌、rewrite 绰姻,比nginx 的rewrite 強大;
2引瀑、模塊超多狂芋,基本想到的都可以找到;
3憨栽、bug少 帜矾,nginx的bug相對Apache較多;
4屑柔、超穩(wěn)定屡萤,最核心的區(qū)別在于apache是同步多進程模型,一個連接對應(yīng)一個進程掸宛;nginx是異步的死陆,多個連接(萬級別)可以對應(yīng)一個進程。
nginx的優(yōu)點:
1唧瘾、輕量級措译,同樣起web 服務(wù)别凤,比apache 占用更少的內(nèi)存及資源;
2领虹、抗并發(fā)规哪,nginx 處理請求是異步非阻塞的,而apache 則是阻塞型的掠械,在高并發(fā)下nginx 能保持低資源低消耗高性能由缆;
3注祖、高度模塊化的設(shè)計猾蒂,編寫模塊相對簡單;
4是晨、社區(qū)活躍肚菠,各種高性能模塊發(fā)布迅速。
總結(jié)
Nginx 靜態(tài)處理性能比 Apache 高 3倍以上
Apache 對 PHP 支持比較簡單罩缴,Nginx 需要配合其他后端用
Apache 的組件比 Nginx 多
nginx處理動態(tài)請求是雞肋蚊逢,一般動態(tài)請求要apache去做,nginx只適合靜態(tài)和反向箫章。
什么是動態(tài)請求和靜態(tài)請求烙荷?二者的區(qū)別在哪里?
靜態(tài)請求請求后綴html就是靜態(tài)的,直接請求網(wǎng)頁文件資源檬寂。
動態(tài)頁面是以ASP终抽、PHP、JSP桶至、Perl昼伴、或CGI等編程語言制作使用的, 有模板直接渲染前端頁面。動態(tài)頁面又叫動態(tài)鏈接镣屹,英文寫法是:Dynamic URL
我們經(jīng)常會看到,在地址欄里有一些網(wǎng)址特別長圃郊,而且還帶有“?”,這樣的鏈接一般是動態(tài)鏈接,其所對應(yīng)的頁面就是動態(tài)頁面女蜈。
注意, 動態(tài)請求并不代表是訪問后端獲取數(shù)據(jù)接口的請求, 而是由后端直接渲染前端頁面持舆。一般屬于前后端不分離項目的特征
所以,php前后端分離的項目, 首推Nginx+php-fpm。
現(xiàn)在 Nginx 才是 Web 服務(wù)器的首選
如果單臺服務(wù)器的話伪窖,NGINX+APACHE+PHP 純粹多此一舉逸寓,多了一次請求轉(zhuǎn)發(fā),效率肯定低惰许,而且現(xiàn)在FPM已經(jīng)足夠穩(wěn)定席覆。完全沒必要。
php+apache 和 php+nginx的區(qū)別
Nginx+PHP與Apache+PHP性能對比