正文
NGINX是如何运作的呢?
NGINX利用一个预测进程模型调度可用的硬件资源:
-
主进程处理配置文件读取、端口绑定等特权操作,以及创建一小组子进程(接下来三种类型的进程)
-
启动时缓存加载器进程加载硬盘中缓存到内存中,接着退出。对它的调度是保守的,所以资源开销较低
-
缓存管理进程定时运行,清理来自硬盘缓存的实体到指定的大小
-
工作进程负责所有的工作,处理网络连接、硬盘读写操作、以及上游服务器通信
NGINX推荐的配置是,一个工作进程对应一个CPU内核,确保硬件资源的有效利用,在配置文件中设置worker_processes auto:
一旦NGINX服务起来,仅有工作进程在忙,每个工作进程采用非阻塞地方式处理多个连接,降低上下文切换的次数。
每个工作进程都是单线程且独立运行,负责获取新连接并进行处理。进程之间通过共享内存进行通信,诸如缓存数据,会话持续化数据(ession persistence data),以及其他共享资源。NGINX1.7.11及以后的版本,有一个可选的线程池,工作进程将阻塞操作丢给它们。更多细节,参看《Nginx 引入线程池,提升 9 倍性能》(http://blog.jobbole.com/87988/)。对于NGINX Plus用户,这些新特性会在今年的发布版7中出现。
NGINX内部工作进程
每个NGINX工作进程由配置文件对其进行初始化,主进程为其提供一组监听socket。
工作进程起始于socket监听事件(accept_mutex 和 kernel socket sharding),事件由新的连接进行初始化,接着这些连接被派发给某个状态机—HTTP状态机是其中最常用的一种,不过NGINX也实现了基于流的状态机、基于通信协议的状态机(SMTP, IMAP, and POP3)。