Nginx 是一个轻量级的HTTP 服务程序,相比其他服务器程序如Apache,Nginx占用内存少,稳定性高,并发处理能力强。同时Nginx 还是一个反向代理服务程序,和邮件代理服务程序。Nginx具有丰富的模块库、灵活的配置、较低资源消耗等优点。下面,我们一起深入看一下Nginx的工作机制。

1. Nginx 如何实现高性能低消耗的呢?

我们从以下几个方面说明以下:

  • 网络事件处理机制

    • Nginx 采用异步非阻塞的方式处理请求,可以同时处理上万的请求
    • Nginx 支持 select/epoll 等流行事件处理机制,根据系统环境自动选择
    • Nginx 采用独立于系统的事件处理机制,能够高效处理请求
  • 资源分配技术

    • Nginx 采用分阶段资源分配技术,使得它的CPU和内存消耗非常低
  • 多核处理优化

    • Nginx 默认采用多进程启动模式
    • Nginx 包含Master 进程 和 Worker 进程
    • 能够充分利用 SMP 对称多处理的优势,减少Worker进程磁盘I/O的阻塞
    • Nginx 支持Worker进程和CPU内核 一一对应绑定,避免进程上下文的切换致使cache失效

基于上面提到技术,以及Nginx很多地方的优化,让Nginx成为最快的HTTP服务器。

2.Nginx的进程模型

在Nginx的技术架构中,进程模型是至关重要的一部分。接下来,我们一起看看Nginx进程模型,以及它们的工作机制。

Linux 系统中,Nginx默认以守护进程daemon方式启动,默认采用多进程方式。Nginx包括两种类型的进程:
- Master 进程,数量只有一个,管理Nginx本身和Worker进程
- Worker 进程,数量一般和CPU核数相等,Nginx的所有请求处理,均是在Worker进程中完成

下面,我们分别深入看一下Master和Worker进程。

2.1 Master 进程工作机制

在Nginx启动时,Master进程创建,主要负责初始化Nginx和相关模块、fork Worker进程、接收处理外界信号等工作。

Nginx的初始化过程:

  • 解析配置文件,这是Nginx初始化最重要的一个环节
  • 调用各个配置指令回调函数,完成各个模块的配置、相互关联等
  • 建立listen 的 socket(listenfd)
  • 准备工作都完成后,fork worker子进程和cache子进程

Master 进程信号处理机制

我们通过kill命令发送信号给Nignx Master 进程,看看Master进程如何处理:

root@eg001:~# ps -ef | grep nginx | grep -v grep
root     16533     1  0 Aug28 ?        00:00:00 nginx: master process nginx
www-data 16534 16533  0 Aug28 ?        00:00:47 nginx: worker process
www-data 16535 16533  0 Aug28 ?        00:00:51 nginx: worker process
www-data 16536 16533  0 Aug28 ?        00:00:53 nginx: worker process
www-data 16537 16533  0 Aug28 ?        00:00:51 nginx: worker process
root@eg001:~# kill -HUP 16533
root@eg001:~# ps -ef | grep nginx | grep -v grep
root     16533     1  0 Aug28 ?        00:00:00 nginx: master process nginx
www-data 28194 16533  0 09:40 ?        00:00:00 nginx: worker process
www-data 28195 16533  0 09:40 ?        00:00:00 nginx: worker process
www-data 28196 16533  0 09:40 ?        00:00:00 nginx: worker process
www-data 28197 16533  0 09:40 ?        00:00:00 nginx: worker process
root@eg001:~#

分析流程:
- Master 进程接收到 HUP 信号
- Master 进程重新加载配置文件
- Master 进程启动新的Worker进程
- Master 进程发送信号给Worker 进程
- 老的Worker进程不再接收新的请求
- 老的Worker进程处理完当前请求,退出
- 至此,Nginx完成平滑重启

注意:Nginx 0.8 版本以后,提供了 -s参数,用于管理Nginx服务的停止和重启,注意line 11:

root@eg001:~# nginx -h
nginx version: nginx/1.1.19
Usage: nginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives]Options:-?,-h         : this help-v            : show version and exit-V            : show version and configure options then exit-t            : test configuration and exit-q            : suppress non-error messages during configuration testing-s signal     : send signal to a master process: stop, quit, reopen, reload-p prefix     : set prefix path (default: /etc/nginx/)-c filename   : set configuration file (default: /etc/nginx/nginx.conf)-g directives : set global directives out of configuration file

2.2 Worker 进程工作机制

Worker进程负责所有请求的处理工作,我们通过一个HTTP请求,来梳理一下Worker的工作流程:
- 新的请求到来:所有的Work进程的listenfd都会变得可读
- 竟抢互斥锁:所有 Worker 进程在注册listenfd读事件前,要先抢accept_mutex
- 抢到互斥锁的Worker,注册listenfd读事件,在事件中调用accept接受该连接
- 拿到请求后,Worker进程开始读取请求,解析请求,处理请求,产生数据,再返回给客户端
- Worker进程断开连接

需要注意:一个HTTP请求,完全由Worker进程处理,而且只在一个Worker中处理

2.3 Master-Worker 进程架构机制的优势有哪些??

对于每个Worker 进程来说,独立的进程,不需要加锁,节约锁导致的资源开销;worker进程之间,互不干扰,平滑重启就是很好的例子,服务不中断。

2.4 网络事件处理机制

Nginx 采用的是异步非阻塞事件处理机制,支持select/poll/epoll/kqueue 等等。Nginx 同时会监控多个事件,调用他们是阻塞的。但是调用有超时时间,在超时时间内,如果有事件准备好了,就返回,否则重新放入epoll中。当读写返回EAGAIN时,事件将会被再次放入epoll中。

处理线程只有一个,同时处理的请求也只有一个,所谓多请求并发,只是在不断的切换请求而已。虽然是切换,但这种切换不涉及上下文切换,相比十分轻量。更多的并发,只是会占用更多的内存。

进程相关的还有,信号和定时器,这部分另外单独讲解。

3. Nginx 包含哪些模块

Nginx是模块化架构的服务,丰富的模块,松散耦合,也让Nginx更加强大!我看看Nginx 都有哪些模块

惊群效应:

- 当内核 accept 一个连接时,会唤醒所有等待中的进程

- 但实际上只有一个进程能获取连接,其他的进程都是被无效唤醒的

- 所以 Nginx 采用了自有的一套 accept 加锁机制,避免多个进程同时调用 accept

- Nginx 多进程的锁在底层默认是通过 CPU 自旋锁来实现。如果操作系统不支持自旋锁,就采用文件锁。

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要

PHP进阶架构师>>>视频、面试文档免费获取​docs.qq.com

或 者关注咱们下面的知乎专栏

PHP架构师圈子​zhuanlan.zhihu.com

原文地址:http://kevhu.com/php/555

nginx启动只有master没有worker_深入探索Nginx工作原理相关推荐

  1. nginx启动只有master没有worker_深入浅出Nginx

    点击上方" 码农编程进阶笔记 ",选择"置顶或者星标" 文末有干货,每天定时与您相约! 前言 Nginx是一款轻量级的Web服务器.反向代理服务器,由于它的内存 ...

  2. Nginx启动只有master进程而没有worker进程

    大致按照下面文章的提示进行排查: https://blog.csdn.net/sinat_37729104/article/details/102662475 https://blog.csdn.ne ...

  3. Nginx源码分析——worker进程源码与工作原理(一)

    一.说明 一般说到nginx整体架构的话,会用这样的架构图进行概述.worker进程的运行模块是整个nginx最为核心的代码模块.还有下面都是基于Unix操作系统的,windows的可以了解下. 二. ...

  4. Nginx学习之十一-Nginx启动框架处理流程

    Nginx启动过程流程图 下面首先给出Nginx启动过程的流程图: ngx_cycle_t结构体 Nginx的启动初始化在src/core/nginx.c的main函数中完成,当然main函数是整个N ...

  5. nginx 启动失败

    一.背景 nginx 没有启动,通过命令 /export/servers/nginx/sbin/nginx -c /export/servers/nginx/conf/nginx.conf 启动失败: ...

  6. Unit nginx.service entered failed state(nginx启动失败)

    1.selinux引起nginx启动失败 问题描述:修改了nginx的配置文件,绑定了监听9089端口,重启nginx的时候失败了.发现报错"nginx: [emerg] bind() to ...

  7. nginx启动不了linux,nginx启动失败问题集锦

    1.selinux引起nginx启动失败 问题描述: 修改了nginx的配置文件,绑定了监听9089端口,重启nginx的时候失败了.发现报错"nginx: [emerg] bind() t ...

  8. NGINX启动报错,端口被占用

    NGINX启动报错,端口被占用解决方案(修改端口号) Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由伊戈尔·赛索耶 ...

  9. Nginx启动问题解决

    妈的.nginx访问不了...就是浏览器打开看不到nginx的标准界面. 我的是centos 7.6 解决: 1.前提:root权限 2.  检查防火墙 并centos 7对外开启80端口: 查看状态 ...

最新文章

  1. 正则表达式和re模块知识点汇总
  2. 树形结构的数据存储和数据库表设计
  3. ace unlck工具下载_压缩工具:WinRAR 曝出代码执行漏洞,该升级了
  4. java企业级开发SSM
  5. java实现定时任务 schedule_Java定时任务的三种实现方式
  6. 83年的我刚好今年遇到了失业
  7. 2019-0405视觉SLAM的学习第四讲
  8. 区块链开发(一)搭建基于以太坊的私有链环境
  9. windows和linux 下将tomcat注册为服务
  10. MVC传参数给js的时候 如果是数值 变量要进行一下转换才能正确识别 例如var aaa = parseInt('@Model.ClickIndex');...
  11. .NetCore获取拼多多平台优惠券
  12. 今天是元旦节,可是我失恋了
  13. HTML5游戏实战 3 60行代码实现水平跑酷游戏
  14. 汇编指令——bic(位清除)、orr(位或)、eor (异或)
  15. web个人学习笔记(待完善)
  16. 如何在ps中将图片素描化
  17. 阿里二面:RocketMQ 消费失败了,怎么处理?
  18. Flink sql:Table sink doesn‘t support consuming update and delete changes which is produced by node
  19. 虚拟机桥接模式怎么都连不上网(桥接模式下不能连校园网)
  20. 无人便利店抢人饭碗?这些“黑科技”将创造百万就业

热门文章

  1. 使用系统视图发现SQL Server实例信息
  2. sql数据库备份默认路径_在Linux上SQL Server中更改默认数据库文件和备份路径
  3. Django ORM QuerySet集合对象的特性
  4. BZOJ 2176 Strange string 最小表示法
  5. C# 序列化之二进制
  6. cannot be cast to org.springframework.web.method.HandlerMethod 统一异常处理发生异常。
  7. android 进程间通信---bind的前世
  8. 一个独立程序员对自己近九个月工作生活的回顾
  9. 2014年3月新鲜出炉的最佳 JavaScript 工具库
  10. ReadWriteLock1.8源码