醍醐灌顶 Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。
Nginx 的整体架构
Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处理网络请求与响应。
master 进程主要用来管理 worker 进程,具体包括如下 4 个主要功能:
1.接收来自外界的信号。
2.向各 worker 进程发送信号。
3.监控 woker 进程的运行状态。
4.当 woker 进程退出后(异常情况下),会自动重新启动新的 woker 进程。
woker 进程主要用来处理基本的网络事件:
多个 worker 进程之间是对等且相互独立的,他们同等竞争来自客户端的请求。
一个请求,只可能在一个 worker 进程中处理,一个 worker 进程,不可能处理其它进程的请求。
worker 进程的个数是可以设置的,一般我们会设置与机器 cpu 核数一致。同时,nginx 为了更好的利用多核特性,具有 cpu 绑定选项,我们可以将某一个进程绑定在某一个核上,这样就不会因为进程的切换带来 cache 的失效。
Ngnix 是如何实现高性能的?
事件驱动模型
基于异步及非阻塞的事件驱动模型,可以说是 Nginx 得以获得高并发、高性能的关键因素。这一点上和 Netty 类似,底层都是使用的 BSD kqueue、Linux epoll 及 Solaris event ports。
多进程机制
使用多进程的好处有两点:
进程之间不共享资源,不需要加锁,减少了使用锁对性能造成的影响,同时降低编程的复杂度,降低开发成本。
采用独立的进程,可以让进程互相之间不会影响,如果一个进程发生异常退出时,其它进程正常工作,master 进程则很快启动新的 worker 进程,确保服务不会中断,从而将风险降到最低。
内存池
为了避免出现内存碎片,减少向操作系统申请内存的次数、降低各个模块的开发复杂度,Nginx 设计了简单的内存池,它的作用主要是把多次向系统申请内存的操作整合成一次,这大大减少了 CPU 资源的消耗,同时减少了内存碎片。
模块化设计
高度模块化的设计是 Nginx 的架构基础。Openresty 就是在 Nginx 上引入了 lua 等第三方模块,使得扩展更加方便了。
更多 Nginx 免费视频教学资源
epoll的网络模型,从redis, memcached到nginx
版权声明: 本文为 InfoQ 作者【hanaper】的原创文章。
原文链接:【http://xie.infoq.cn/article/2d9c602aed3d033055093d3f5】。文章转载请联系作者。
评论