Nginx是一个事件驱动的,主要事件是指网络事件,Nginx每个网络连接自然对应两个网络事件,一个读事件一个写事件。
什么是网络事件:
应用层发送get请求,传输层主要做一个事情,打开一个端口,把自己端口和nginx端口记录下来,传输层把我们主机ip和目标主机公网ip记录下来,到达链路层通过以太网到我们加的路由器,路由器主要记录我们所在运营商的ip,通过广域网跳转到服务器b的路由器中,通过链路层和网络层以及传输层,通过传输层我们就知道给我们打开80或者443端口进程也就是nginx,nginx在他们http状态处理机里面处理这个请求。TCP层主要做进程与进程间通信的事情,IP层主要解决机器与机器间怎么找到的问题
报文:
TCP协议与非阻塞接口:
读事件:Accept:建立连接 、Read:读消息
写事件:Write写消息
其中在事件收集、分发器处理消费者,事件是一个生成者到nginx,不同时间段调用相对于消费者包括openrestry、lua同步代码
Nginx事件循环:
刚刚启动的时候在wait for events这里,打开80/443端口,等待新的事件进来,新的客户端连接事件,这样的事件对于我们epoll里面的epoll wait这个方法,当操作系统处理完握手流程完后,就会通知我们epoll wait阻塞方法,然后唤醒我们nginx work进程,这里的kernel就是操作系统内核,然后把事件放在事件队列中,然后右图处理事件的循环,如果发现新的事件,比如发现一个链接新建立了。可能要添加一个操作时间,如果事件内浏览器没有发送请求则关掉链接,然后处理完后把响应写事件在操作系统写缓存,然后发给浏览器中,如果处理完后又到wait for events。 如果使用第三方模块导致cpu复杂运算,导致处理时间特别长,导致后续队列大量事件得不到处理,导致恶性循环,然后时间到了,nginx大量处理在连接和不正常断开,所以nginx不能容忍这个事情,很多第三方都不会一次使用cpu大量计算,而是分段使用
epoll的优劣:nginx的事件分发机制,epoll运行nginx事件驱动框架,在那个循环流程中,nginx怎么样能够从操作系统的kernel中获取等待处理的事件,nginx主要使用epoll这种网络收集器模型,epoll对于句柄数增加几乎是无关的,比较适合做大并发连接处理