nginx架構

image.png
nginx使用多進程的方式來工作,nginx啟動后會有一個master進程和多個worker進程,worker進程的數(shù)量一般與機器cpu的核數(shù)一致,原因是與nginx的進程模型和事件處理模型有關。
nginx啟動后,要操作nginx,只要操作master即可,因為master管理worker
./nginx -s reload 重啟nginx
./nginx -s stop 停止nginx
以nginx為例解釋下如何工作的:執(zhí)行命令時,先啟動一個新的nginx進程,在解析到relaod參數(shù)后,知道我們會控制nginx重新加載配置文件,會向master發(fā)送信號,然后master會開創(chuàng)新的worker進程,新的worker進程創(chuàng)建后,就會接受并處理新的請求,老的worker在處理完當前請求后會被殺掉,所以實現(xiàn)重新加載配置文件并生效。
那么既然worker是平等的,怎么搶奪處理請求的機會呢?首先,worker進程是由master進程fork出來的,在master創(chuàng)建worker進程之前,先建立好需要監(jiān)聽的listenfd,在fork出worker,所有worker進程的listenfd會在新連接到來時變得可讀,為保證只有一個進程處理該連接,所有worker進程在注冊listenfd之前搶讀互斥鎖,搶到的才會注冊listenfd讀事件,在讀事件里調(diào)用accept接受該連接。