1epoll多路复用java
2.master worker进程模型:能够容许作平滑的配置重启,而且不会断开与客户端的连接linux
3.协程机制 :非阻塞进程的机制nginx
最开始开发人员使用的是bio阻塞shi进程模型,socket.write全部的字节流都input完后才对应的client、才会返回多线程
因而有了linux的select模型,变动轮训查找,只要有变化,就会被唤醒,缺点:每次轮训都遍历,效率很低。并且理论上限只能监听1024个请求socket
epoll模型:在监听的时候有回掉函数,那个变化就直接回掉函数执行,并且上限很高java的NIO模型就是借用了linux的模型,NIO也有一个select模型,那NIO为何不使用epoll多路呢?linux内核2.6以上会把select以epoll的模式去运行,如果2.6之前的版本就不会。tcp
上图,master是能够管理worker的进程空间的,worker用来处理客户端连接的,当启动master进程的时候,就会在master上启动一个socket的文件举鼎,而后这个文件又会监听在80端口上,这时候就会启动epoll的多路复用模型,当client发起请求就会有一个tcpip的过程,创建三次握手,会向80端口发起socket conect的操做,这时候epoll模型就会产生回掉,函数
可是这时候的master是不处理connect的请求的,他会让对应的woker去处理,nginx在里面搞了一个互斥锁,由于master和woker都会共享内存,三个worker都会去抢占,由于是在内存上的,速度很快,谁先抢占到就是谁去调用完成三次握手。一旦某一个worker抢占到了,之后这条道路就是都是worker来处理了。worker会讲这个请求扔到epoll里,lua
那master的做用:只用来处理管理者的命令,以及某个worker死掉的话,他会接管权限,而且new出一个新的worker,线程
三次握手:首先服务端80端口监听,而后client发起connect操做到80端口,而后80端口upset来完成三次握手的创建连接协程
2.sbin/nginx -s reload 重启以后,worker的端口号会变,master的不会变,由于master不能挂,挂了整个nginx就废了。
执行这条命令后,master会将全部的socket进行收回,而后从新生成worker去分配。
3.每一个worker里只有一个线程,都是单线程的,为何不使用多线程呢?
首先,多线程就是为了防止单线程堵塞,形成效率问题。可是worker里的单线程是非阻塞的,只不过是调用socket的read和write,并且是在epoll中,速度是很是快的,不会形成堵塞,单线程反而更快,仅仅只是一分内核空间到用户的拷贝。
4. 协程是比内存更小的概念,依附于线程的内存模型,切换开销小,它遇到阻塞就会归还执行权,重点是无需加锁,它是串行的执行过程,lua就是基于协程的
5