Kiril Georgiev在保加利亚首都索菲亚同时对阵360名棋手,最终取得284胜,70平,6负的战绩。
这就是NGINX工作进程玩“国际象棋”的方式。每一个工作进程都是一位大师(记住:通常情况下,每个工作进程占用一个CPU内核),能够同时对战上百棋手(实际上是成千上万)。
1.工作进程在监听套接字和连接套接字上等待事件。
2.事件发生在套接字上,工作进程会处理这些事件。
●监听套接字上的事件意味着:客户端开始了一局新的游戏。工作进程创建了一个新的连接套接字。
●连接套接字上的事件意味着:客户端移动了棋子。工作进程会迅速响应。
工作进程从不会在网络上停止,它时时刻刻都在等待其“对手”(客户端)做出回应。当它已经移动了这局比赛的棋子,它会立即去处理下一局比赛,或者迎接新的对手。
为什么它会比阻塞式多进程的架构更快?
Why Is This Faster than a Blocking, Multi-Process Architecture?
NGINX的规模可以很好地支持每个工作进程上数以万计的连接。每个新连接都会创建另一个文件描述符,并消耗工作进程中少量的额外内存。每一个连接的额外消耗都很少。NGINX进程可以保持固定的CPU占用率。当没有工作时,上下文切换也较少。
在阻塞式的、一个连接/一个进程的模式中,每个连接需要大量的额外资源和开销,并且上下文切换(从一个进程到另一个进程)非常频繁。
如果想了解更多,请查看由NGINX公司发展和联合创始人副总裁Andrew Alexeev编写的有关NGINX体系结构的文章。
通过适当的系统调优,NGINX能大规模地处理每个工作进程数十万并发的HTTP连接,并且能在流量高峰期间不丢失任何信息(新比赛开始)。
配置更新和NGINX升级
Updating Configuration and Upgrading NGINX
仅包含少量工作进程的NGINX进程架构,使得配置、甚至是二进制文件本身的更新都非常高效。
更新NGINX的配置,是一个非常简单的、轻量级的、可靠的操作。运行nginx ?s reload命令即可,该命令会检查磁盘上的配置,并给主进程发送一个SIGHUP信号。
当主进程接收到SIGHUP信号后,会做两件事:
1.重新加载配置,fork一套新的工作进程。这些新的工作进程会立即开始接受连接和处理流量(traffic)(使用新的配置)。
2.发出信号,通知旧的工作进程安静地退出。这些旧进程不会再接受新的连接了。只要它们处理的HTTP请求结束了,它们就会干净地关闭连接。一旦所有的连接都被关闭,工作进程也就退出了。
这个过程会导致CPU占用率和内存使用的一个小高峰,但相比于从活动连接中加载资源,这个小高峰可忽略不计。你可以在一秒内重新加载配置多次。极少情况下,一代又一代工作进程等待连接关闭时会出现问题,但即便出现问题,它们也会被立即解决掉。








