在Nginx中,由Master進(jìn)程管理多個Worker進(jìn)程,而每一個連接是由一個Worker進(jìn)程處理的。Nginx沒有像PHP-FPM那樣才用Master進(jìn)程分發(fā)請求,而是由操作系統(tǒng)內(nèi)核機(jī)制完成(內(nèi)置負(fù)載均衡算法),再通過Mutex來避免“驚群”現(xiàn)象。
Worker進(jìn)程的數(shù)量一般會和機(jī)器CPU核數(shù)一致。每個進(jìn)程通過Reactor的事件處理機(jī)制,實(shí)現(xiàn)了循環(huán)處理多個準(zhǔn)備好的事件。這樣處理的優(yōu)點(diǎn)在于無需創(chuàng)建線程,沒有上下文切換,最大化利用CPU。這樣處理方式的缺點(diǎn)在于,Reactor是同步的處理方式,因此服務(wù)器在處理長時間IO操作時會阻塞其他鏈接。
Nginx在1.7.11中引入了AIO線程池技術(shù),如此大文件可以用AIO線程池,小文件可以直接sendfile。
Kitura利用了Apple的GCD來管理線程池,實(shí)現(xiàn)高并發(fā)。