博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Nginx架构
阅读量:7234 次
发布时间:2019-06-29

本文共 2374 字,大约阅读时间需要 7 分钟。

hot3.png

 nginx在启动后,在unix系统中会以daemon的方式在后台运行,后台进程包含一个master进程和多个worker进程。

  当然nginx也是支持多线程的方式的,只是我们主流的方式还是多进程的方式,也是nginx的默认方式。

  master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。

  worker进程则是处理基本的网络事件。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。

  worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致。更多的worker数,只会导致进程来竞争cpu资源了,从而带来不必要的上下文切换。而且,nginx为了更好的利用多核特性,具有cpu绑定选项,我们可以将某一个进程绑定在某一个核上,这样就不会因为进程的切换带来cache的失效。

  惊群现象

  每个worker进程都是从master进程fork过来。在master进程里面,先建立好需要listen的socket之后,然后再fork出多个worker进程,这样每个worker进程都可以去accept这个socket(当然不是同一个socket,只是每个进程的这个socket会监控在同一个ip地址与端口,这个在网络协议里面是允许的)。一般来说,当一个连接进来后,所有在accept在这个socket上面的进程,都会收到通知,而只有一个进程可以accept这个连接,其它的则accept失败。

相对于线程,采用进程的优点

  进程之间不共享资源,不需要加锁,所以省掉了锁带来的开销。

  采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快重新启动新的worker进程。

  编程上更加容易。

  多线程的问题

  而多线程在多并发情况下,线程的内存占用大,线程上下文切换造成CPU大量的开销。想想apache的常用工作方式(apache也有异步非阻塞版本,但因其与自带某些模块冲突,所以不常用),每个请求会独占一个工作线程,当并发数上到几千时,就同时有几千的线程在处理请求了。这对操作系统来说,是个不小的挑战,线程带来的内存占用非常大,线程的上下文切换带来的cpu开销很大,自然性能就上不去了,而这些开销完全是没有意义的。

异步非阻塞

  异步的概念和同步相对的,也就是不是事件之间不是同时发生的。

  非阻塞的概念是和阻塞对应的,阻塞是事件按顺序执行,每一事件都要等待上一事件的完成,而非阻塞是如果事件没有准备好,这个事件可以直接返回,过一段时间再进行处理询问,这期间可以做其他事情。但是,多次询问也会带来额外的开销。

  总的来说,Nginx采用异步非阻塞的好处在于:

  • 不需要创建线程,每个请求只占用少量的内存

  • 没有上下文切换,事件处理非常轻量

nginx的源码目录结构(100%)

nginx的优秀除了体现在程序结构以及代码风格上,nginx的源码组织也同样简洁明了,目录结构层次结构清晰,值得我们去学习。nginx的源码目录与nginx的模块化以及功能的划分是紧密结合,这也使得我们可以很方便地找到相关功能的代码。这节先介绍nginx源码的目录结构,先对nginx的源码有一个大致的认识,下节会讲解nginx如何编译。

下面是nginx源码的目录结构:

.├── auto            自动检测系统环境以及编译相关的脚本│   ├── cc          关于编译器相关的编译选项的检测脚本│   ├── lib         nginx编译所需要的一些库的检测脚本│   ├── os          与平台相关的一些系统参数与系统调用相关的检测│   └── types       与数据类型相关的一些辅助脚本├── conf            存放默认配置文件,在make install后,会拷贝到安装目录中去├── contrib         存放一些实用工具,如geo配置生成工具(geo2nginx.pl)├── html            存放默认的网页文件,在make install后,会拷贝到安装目录中去├── man             nginx的man手册└── src             存放nginx的源代码    ├── core        nginx的核心源代码,包括常用数据结构的定义,以及nginx初始化运行的核心代码如main函数    ├── event       对系统事件处理机制的封装,以及定时器的实现相关代码    │   └── modules 不同事件处理方式的模块化,如select、poll、epoll、kqueue等    ├── http        nginx作为http服务器相关的代码    │   └── modules 包含http的各种功能模块    ├── mail        nginx作为邮件代理服务器相关的代码    ├── misc        一些辅助代码,测试c++头的兼容性,以及对google_perftools的支持    └── os          主要是对各种不同体系统结构所提供的系统函数的封装,对外提供统一的系统调用接口

转载于:https://my.oschina.net/u/727148/blog/520507

你可能感兴趣的文章
JVM基础(1)——内存模型
查看>>
程序员嘛,先做个好架构师再说
查看>>
用外挂只为“吃鸡”成功?为什么不试试正当手段!
查看>>
2017线上超市食品消费盘点:老字号成新网红 年轻人爱新奇特
查看>>
BATJ等公司必问的8道Java经典面试题,你都会了吗?
查看>>
开学季学生宿舍竟然限电,学校管理因噎废食?
查看>>
同样是异形屏,为什么OPPO R15能够打造不一样的体验?
查看>>
奇点汽车回应欠薪3月传闻:多轮融资顺利 不存在资金问题
查看>>
孕妇高速上产女 交警医生合力架起生命绿色通道
查看>>
西藏尼阿底遗址项目获“2018年中国考古新发现”入围奖
查看>>
2018年浙江检察机关办理公益诉讼案件5551件
查看>>
加拿大渥太华民众寒冬享受运河滑冰道乐趣
查看>>
火箭队再遭伤病打击 曝中锋卡佩拉至少缺阵1月
查看>>
和妈妈在一起,就是团圆
查看>>
程序员面试,写个javascript物理引擎,张口要月薪20K!面试官真给了!
查看>>
UAS-点评侧用户行为检索系统
查看>>
Shapeless 入门指南(二):自然数类型 Nat
查看>>
[问题回顾]JTalk Online:面试官教你快速成为 leader 最欣赏的技术人
查看>>
深度有趣 | 05 自编码器图像去噪
查看>>
自制简单的range(Vue)
查看>>