nginx是以多进程的方式来工作的

2023-05-16

nginx是以多进程的方式来工作的。
nginx在启动后,会有一个master进程和多个worker进程。




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


而基本的网络事件,则是放在worker进程中来处理了。worker进程之间是对等的,一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。
worker进程的个数,一般会设置与机器cpu核数一致。当我们提供80端口的http服务时,一个连接请求过来,每个进程都有可能处理这个连接。




处理过程如下:
master(master进程会先建立好需要listen的socket)--------fork生成子进程workers,继承socket(此时workers子进程们都继承了父进程master的所有属性,当然也包括已经
建立好的socket,当然不是同一个socket,只是每个进程的这个socket会监控在同一个ip地址与端口,这个在网络协议里面是允许的)------当一个连接进入,产生惊群现象。
一般来说,当一个连接进来后,所有在accept在这个socket上面的进程,都会收到通知,而只有一个进程可以accept这个连接,其它的则accept失败。




惊群现象:指一个fd的事件被触发后,等候这个fd的所有线程/进程都被唤醒。虽然都被唤醒,但是只有一个会去响应。最常见的例子就是对于socket的accept操作,当多个
用户进程/线程监听在同一个端口上时,由于实际只可能accept一次,因此就会产生惊群现象,




Nginx对惊群现象的处理:
     nginx提供了一个accept_mutex这个东西,这是一个加在accept上的一把共享锁。有了这把锁之后,同一时刻,就只会有一个进程在accpet连接,这样
就不会有惊群问题了。accept_mutex是一个可控选项,我们可以显示地关掉,默认是打开的。




worker进程工作:

     当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,一个完整的请求。一个请求,完全由
worker进程来处理,而且只在一个worker进程中处理。


小结:
1)一个完整的请求读取请求、解析请求、处理请求,产生数据后,再返回给客户端,最后断开连接。
2)一个完整的请求完全由一个worker进程处理。


好处:
     1)节省锁带来的开销。每个worker进程都是独立的进程,不共享资源,不需要加锁。同时在编程以及问题查上时,也会方便很多。
     2)独立进程,减少风险。采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快重新启动新的worker进程。当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。


Nginx的事件处理机制


       对于一个基本的web服务器来说,事件通常有三种类型:网络事件、信号、定时器。Nginx采用异步非阻塞的事件处理机制,由进程循环处理多个准备好的事件,从而实现

高并发和轻量级。


        以epoll为例:当事件没有准备好时,就放入epoll里面。如果有事件准备好了,那么就去处理;如果事件返回的是EAGAIN,那么继续将其放入epoll里面。从而,只要有事件准备好了,我们就去处理她,只有当所有时间都没有准备好时,才在epoll里面等着。这样,我们就可以并发处理大量的并发了,当然,这里的并发请求,是指未处理完的请求,线程只有一个,所以同时能处理的请求当然只有一个了,只是在请求间进行不断地切换而已,切换也是因为异步事件未准备好,而主动让出的。这里的切换是没有任何代价,你可以理解为循环处理多个准备好的事件,事实上就是这样的。




问题1: Nginx采用worker进程来处理请求,一个worker进程只有一个主线程,那么有多少个worker子进程就能处理多少个并发,那么能够处理的并发数有限。概括的讲,Nginx如何实现高并发?
        回答1:采用异步非阻塞的事件处理机制。之所以能够并发处理大量的未处理完的请求,是通过异步非阻塞方式,由进程循环处理多个准备好的事件。以epoll为例,为准备好的事件都会放入epoll中,只要有事件准备好,就会进行处理。                   


问题2:何为异步非阻塞方式
        回答2:http://www.ibm.com/developerworks/cn/linux/l-async/


问题3:Nginx与Apache对于高并发处理上的区别。
        回答3:对于Apache,每个请求都会独占一个工作线程,当并发数到达几千时,就同时有几千的线程在处理请求了。这对于操作系统来说,占用的内存非常大,线程的上下文切换带来的cpu开销也很大,性能就难以上去,同时这些开销是完全没有意义的。

     对于Nginx来讲,一个进程只有一个主线程,通过异步非阻塞的事件处理机制,实现了循环处理多个准备好的事件,从而实现轻量级和高并发。


问题4:为何推荐worker的个数为cpu的个数?
        回答4:因为更多的worker数,只会导致进程相互竞争cpu资源,从而带来不必要的上下文切换





参考 http://tengine.taobao.org/book/chapter_2.html#connection 初探Nginx架构


=======================================================================================================








Nginx比较Apache:事件驱动适合于IO密集型服务,多进程或线程适合于CPU密集型服务


1)Nginx更主要是作为反向代理,而非Web服务器使用。其网络模式是事件驱动(select、poll、epoll)。
2)事件驱动的本质还是IO事件,应用程序在多个IO句柄间快速切换,实现所谓的异步IO。
3)事件驱动服务器,最适合做的就是这种IO密集型工作,如反向代理,它在客户端与WEB服务器之间起一个数据中转作用,纯粹是IO操作,自身并不涉及到复杂计算。
4)反向代理用事件驱动来做,显然更好,一个工作进程就可以run了,没有进程、线程管理的开销,CPU、内存消耗都小。
5)当然,Nginx也可以是多进程 + 事件驱动的模式,几个进程跑libevent,不需要Apache那样动辄数百的进程数。
6)Nginx处理静态文件效果也很好,那是因为静态文件本身也是磁盘IO操作,处理过程一样。至于说多少万的并发连接,这个毫无意义。我随手写个网络程序都能处理几万7)的并发,但如果大部分客户端阻塞在那里,就没什么价值。


再看看Apache或者Resin这类应用服务器,之所以称他们为应用服务器,是因为他们真的要跑具体的业务应用,如科学计算、图形图像、数据库读写等。它们很可能是CPU密集型的服务,事件驱动并不合适。

1)例如一个计算耗时2秒,那么这2秒就是完全阻塞的,什么event都没用。想想MySQL如果改成事件驱动会怎么样,一个大型的join或sort就会阻塞住所有客户端。
2)这个时候多进程或线程就体现出优势,每个进程各干各的事,互不阻塞和干扰。当然,现代CPU越来越快,单个计算阻塞的时间可能很小,但只要有阻塞,事件编程就毫无优势。所以进程、线程这类技术,并不会消失,而是与事件机制相辅相成,长期存在。


总结之,事件驱动适合于IO密集型服务,多进程或线程适合于CPU密集型服务,它们各有各的优势,并不存在谁取代谁的倾向。








参考 http://codinglife.sinaapp.com/?p=40

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nginx是以多进程的方式来工作的 的相关文章

  • Nginx 对 cms 后端的重写规则

    我需要在 nginx 服务器中制定 url 重写规则 服务器块 就像我之前的 apache 服务器一样 这是 htaccess 中的代码 我需要将其实现 转换 到我现有的代码中 RewriteRule A Za z0 9 A Za z0 9
  • 从 Nginx 到 Express.js 上的 socket.io 的反向代理上“无法获取”

    我已经关注了通过私有网络让 Node js 在两台 Ubuntu 14 04 服务器上通过 Nginx 工作 Node js 位于 myappserver 上 通过私有 IP myprivatewebserver 访问 并通过 mypubl
  • Docker 与 nginx 组合不断显示欢迎页面

    我是新来的docker并尝试使用最简单的 docker compose yml 显示一个 hello world 页面 并在此基础上构建最终完整的LEMP堆栈它将与我的服务器具有相同的配置 然而大多数教程已经过时 并且有很多使用方法dock
  • ./manage.py 使用 https 运行服务器

    manage py 运行服务器 0 0 0 0 8000 我使用上面的行作为我从 github 借用的代码的一部分 https github com ribeiroit boh puppet https github com ribeiro
  • Kong - 验证上游 ssl(ssl_proxy 打开)

    我已经成功为 API 安装了 kong 网关 该 API 通过上游负载平衡到多个目标 应用程序服务器 现在 我有一个我的应用程序服务器的自签名证书 kong 和目标之间的 ssl 握手应该失败 我推断 kong 不验证上游证书 经过一些研究
  • 如何将亚马逊颁发的免费证书配置到nginx.config

    我已经安装了nginx服务器在Amazon Linux 2环境 在创建弹性负载均衡器期间 我创建了 Amazon 的免费证书 现在 我想通过以下方式访问我的服务器https port 443 我该如何配置这个SSL证书在nginx conf
  • NGINX 与 Tomcat 配置

    我是 Nginx 新手 我需要你的帮助 根据很多论坛我了解到我们所有的静态页面都存储在Nginx中 当有请求到来时 我必须将该请求传递给 tomcat 获取数据 并在 tomcat 生成响应后生成响应 目前 我刚刚做到了 我将请求直接传递给
  • Nginx反向代理(proxy_pass)不传递子文件夹

    我想在子文件夹配置中运行应用程序 Mattermost 例如 https www example com mattermost https www example com mattermost location mattermost gzi
  • 如果我在不打算升级到 websocket 连接的 HTTP 请求中包含“Upgrade”和“Connection”标头,会发生什么情况?

    我有一个 Nginx 服务器块 用于代理对 node js 服务器的请求 该服务器同时提供 HTTP 内容和 WS websocket 内容 是否可以在不应升级到 Websocket 连接的请求上添加升级标头 即使用 Nginx 代理到服务
  • 我怎样才能重写这个nginx“if”语句?

    例如 我想这样做 if http user agent MSIE 6 0 http user agent MSIE 7 0 etc etc rewrite ROOT ROOT ancient last break 而不是这个 if http
  • nginx docker 容器:502 错误网关响应

    我有一个服务监听 8080 端口 这不是一个容器 然后 我使用官方镜像创建了一个 nginx 容器 docker run name nginx d v root nginx conf etc nginx conf d p 443 443 p
  • Nginx反向代理返回404

    我的 Nginx 安装并运行 下面是配置 etc nginx nginx conf 我要全部转发 api 到我的 tomcat 服务器 该服务器在同一服务器上的端口 9100 上运行 类型http myhost 9100 api apps有
  • WebSockets 监听 UNIX 域套接字?

    是否可以在 nginx 服务器后面设置一个 WebSockets 服务器来处理 UNIX 域套接字上的连接 我目前在同一台计算机上有多个 WebSocket 服务器实例 并且存在端口共享问题 所有实例都必须分配一个唯一的端口 我想避免这种情
  • 如何在运行 NGINX Docker 容器的 AWS EC2 上启用 HTTPS?

    我在 AWS 上有一个运行 Amazon Linux 2 的 EC2 实例 在上面 我安装了 Git docker 和 docker compose 完成后 我克隆了我的存储库并运行docker compose up让我的生产环境启动 我访
  • 找不到 NGINX brew 安装命令

    I do brew install nginx and get gt Downloading http nginx org download nginx 1 2 2 tar gz Already downloaded Library Cac
  • NGINX hashbang 重写

    我想知道 hashbang url 的位置或重写 nginx 指令会是什么样子 基本上像前端控制器一样通过 hashbang 路由所有非 hashbanged url 所以 http example com about staff 将路由至
  • nginx位置正则表达式,匹配多次

    如何在 nginx 位置正则表达式中多次匹配 看来 x x 语法永远不起作用 例如 location abc w 1 3 从来不工作 您必须引用包含以下内容的位置 or 人物 location abc w 1 3 否则 nginx 将其解析
  • Nginx 是否也缓冲来自客户端的 http 请求?

    我知道 Nginx 可以缓冲来自上游服务器的响应 我的问题是 Nginx 是否也缓冲来自客户端的 http 请求 我的意思是 如果 Nginx 从客户端收到 http 请求 它是否立即与上游服务器建立连接 或者它会在收到整个http请求后创
  • Nginx merge_slashes 重定向

    我在我的 Java 应用程序中使用 nginx 我的问题是 nginx 正在合并斜杠 我无法将我的网站重定向到正确的版本 例如 http goout cz cs koncerty praha 被合并到 http goout cz cs ko
  • Nginx docker容器代理传递到另一个端口

    我想在 docker 容器中运行 Nginx 它监听端口 80 并且当 url 以 word 开头时 我希望它 proxy pass 到端口 8080api 我有一些网络应用程序侦听端口 8080 这在没有 docker 的情况下对我来说一

随机推荐

  • PXE高效批量网络装机

    文章目录 PXE概述PXE部署kickstart无人值守部署 PXE概述 PXE批量部署的优点 规模化 xff1a 同时装配多台服务器 自动化 xff1a 安装系统 配置各种服务 远程实现 xff1a 不需要光盘 U盘等安装介质 PXE x
  • Firewalld防火墙基础

    Firewalld概述 Firewalld 支持网络区域所定义的网络链接以及接口安全等级的动态防火墙管理工具 支持IPv IPv6防火墙设置以及以太网桥 支持服务或应用程序直接添加防火墙规则接口 拥有两种配置模式 运行时配置 xff1a 即
  • iptables防火墙

    文章目录 Linux包过滤防火墙概述iptables的表 链结构iptable安装iptables的管理选项规则的匹配条件 Linux包过滤防火墙概述 netfilter 位于Linux内核中的包过滤功能体系 称为Linux防火墙的 内核态
  • PX4之commander剖析解读-2

    首先 xff0c 感谢 阿木社区 小伙伴们在PX4 方面做出的贡献 在学习px4的过程中 xff0c 我也是个小学生 xff0c 以下作为个人的小心得 xff0c 纰漏蛮多 xff0c 还望各位同仁包涵 期待批评指正 但我们的目的只有一个
  • BAT2021年最新一二三 面试问题,挑战一下你能走到哪一步

    背景 今年实在太难了 xff0c 从去年3月份开始我就选择离职然后单干 xff0c 刚开始和几个同事一起投资开公司 xff0c 想着做近几年比较火的知识付费 xff0c 好歹科班出身的程序猿 xff0c 难不成我还不能给人家讲讲Java课收
  • Python程序员在面试中如何展示自己的基本功?

    当前Python语言的上升趋势非常明显 xff0c 随着大数据和人工智能领域的发展 xff0c Python语言未来的应用前景还是非常值得期待的 xff0c 另外 xff0c Python语言在Web开发 嵌入式开发和各种后端服务开发中也扮
  • 如何修改mysql root密码

    如何修改mysql root密码 忘记MySQL ROOT密码是在MySQ使用中很常见的问题 xff0c 可是有很多朋友并不会重置ROOT密码 xff0c 那叫苦啊 xff0c 特写此文章与大家交流 xff1a 1 编辑MySQL的配置文件
  • c++和Java哪个比较好入门

    方向比努力更重要 对于初学编程的人来说选择一门合适的编程语言关系到自己以后的职业发展 c 43 43 和Java那个更适合作为入门语言 今天就听小编来讲一讲 C 43 43 语言 它是正宗的C语言的嫡系 xff0c 由C语言发展而来 C 4
  • 大数据和人工智能未来发展趋势

    随着前段时间召开的全国互联网大会 xff0c 将大数据和人工智能作为未来发展的新方向 xff0c 那2018年大数据和人工智能会有怎样的发展趋势 xff1f 更多关注零售 在近期的大数据和人工智能的应用热潮中 xff0c 几乎没有哪个领域像
  • 大数据学习路线图(技术+项目双管齐下)

    随着大数据技术产业的不断发展 xff0c 越来越多的互联网公司开始高薪聘请大数据技术人才 而大数据人才培养无论是对于企业还是对于自己来说都至关重要 xff0c 千锋教育作为国内大数据培训的先头兵 xff0c 视人才培养为己任 xff0c 始
  • 说一下 jvm 有哪些垃圾回收器?

    一 串行垃圾回收器 在JDK1 3之前 xff0c 单线程回收器是唯一的选择 它的单线程意义不仅仅是说它只会使用一个CPU或一个手机线程去完成垃圾收集工作 而且它进行垃圾回收的时候 xff0c 必须暂停其它所有的工作线程 xff08 Sto
  • java从入门到精通学习路线

    目前Java在许多行业的客户端方面的应用非常多 xff0c 比如OA 邮箱 投票 金融 考试 物流 医疗 矿山等信息方面的系统 Java开发者在这方面的需求也非常大 xff0c 待遇也相当不错 xff0c 工资水平可能和Java互联网方向的
  • 程序员经常逛得网站有哪些

    对于程序员而言非常值得收藏的网站有很多 xff0c 我将从技术学习类 业余放松类两个大的方向进行分享 xff08 篇幅可能有点偏长 xff0c 耐心阅读哦 xff0c 或者点赞收藏之后慢慢品味 xff09 一 程序员进行技术学习需要收藏的网
  • 大数据全套视频教程完整版

    大数据1 0时代 社会大数据成就了Google xff0c yahoo xff0c 百度 大数据2 0时代 消费大数据造就了亚马逊 xff0c Ebay xff0c 阿里巴巴 xff0c 腾讯 大数据3 0时代 xff0c 把关注焦点转到了
  • 云计算工程师必备技能

    随着信息现代化的发展 xff0c 人们对信息资源的需求不断地增长 xff0c 虽然现在的信息充斥着整个网络 xff0c 但是如何能快速的获得我们所需的有效的资源才是重点 xff0c 云计算技术工程师就是在这个需求下产生的 在云计算工作中 x
  • go语言有哪些劣势?

    作者 xff1a 茹姐 链接 xff1a https www zhihu com question 300163211 answer 654447355 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xff0c 非商
  • go语言有哪些好的debug方法?

    作者 xff1a Davie 链接 xff1a https www zhihu com question 40980436 answer 655067839 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xff0c
  • 学习编程的过程中可能会走哪些弯路,有哪些经验可以参考?

    先说结论 xff1a 没有少走的弯路 走过的弯路最终都会成为自身的财富 前言 xff1a 如果在开始学习之前 xff0c 就想着能少走弯路 xff0c 那多半会走不少弯路 因为关注的重点错了 xff0c 把本来是踏踏实实学习编程知识的时间
  • 【OpenGL-矩阵】OpenCV相机内参(Intrinsics)与OpenGL投影矩阵(ProjectionMatrix)

    参考博客 xff1a https blog csdn net AIchipmunk article details 41489825 spm 61 1001 2014 3001 5502 https blog csdn net xx7804
  • nginx是以多进程的方式来工作的

    nginx是以多进程的方式来工作的 nginx在启动后 xff0c 会有一个master进程和多个worker进程 master进程主要用来管理worker进程 xff1a 包含 xff1a 1 接收来自外界的信号 xff0c 向各work