nginx架构
nginx使用多进程的方式来工作,nginx启动后会有一个master进程和多个worker进程,worker进程的数量一般与机器cpu的核数一致,原因是与nginx的进程模型和事件处理模型有关。
nginx启动后,要操作nginx,只要操作master即可,因为master管理worker
./nginx -s reload 重启nginx
./nginx -s stop 停止nginx
以nginx为例解释下如何工作的:执行命令时,先启动一个新的nginx进程,在解析到relaod参数后,知道我们会控制nginx重新加载配置文件,会向master发送信号,然后master会开创新的worker进程,新的worker进程创建后,就会接受并处理新的请求,老的worker在处理完当前请求后会被杀掉,所以实现重新加载配置文件并生效。
那么既然worker是平等的,怎么抢夺处理请求的机会呢?首先,worker进程是由master进程fork出来的,在master创建worker进程之前,先建立好需要监听的listenfd,在fork出worker,所有worker进程的listenfd会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有worker进程在注册listenfd之前抢读互斥锁,抢到的才会注册listenfd读事件,在读事件里调用accept接受该连接。