NingG +

Nginx 系列:Nginx 原理

基本原理

Nginx 的进程模型

Nginx 服务器,正常运行过程中:

  1. 多进程:一个 Master 进程、多个 Worker 进程
  2. Master 进程:管理 Worker 进程
    1. 对外接口:接收外部的操作(信号)
    2. 对内转发:根据外部的操作的不同,通过信号管理 Worker
    3. 监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程
  3. Worker 进程:所有 Worker 进程都是平等的
    1. 实际处理:网络请求,由 Worker 进程处理;
    2. Worker 进程数量:在 nginx.conf 中配置,一般设置为核心数,充分利用 CPU 资源,同时,避免进程数量过多,避免进程竞争 CPU 资源,增加上下文切换的损耗。

思考:

  1. 请求是连接到 Nginx,Master 进程负责处理和转发?
  2. 如何选定哪个 Worker 进程处理请求?请求的处理结果,是否还要经过 Master 进程?

HTTP 连接建立和请求处理过程:

  1. Nginx 启动时,Master 进程,加载配置文件
  2. Master 进程,初始化监听的 socket
  3. Master 进程,fork 出多个 Worker 进程
  4. Worker 进程,竞争新的连接,获胜方通过三次握手,建立 Socket 连接,并处理请求

Nginx 高性能、高并发:

  1. Nginx 采用:多进程 + 异步非阻塞方式(IO 多路复用 epoll)
  2. 请求的完整过程:
    1. 建立连接
    2. 读取请求:解析请求
    3. 处理请求
    4. 响应请求
  3. 请求的完整过程,对应到底层,就是:读写 socket 事件

Nginx 的事件处理模型

request:Nginx 中 http 请求。

基本的 HTTP Web Server 工作模式:

  1. 接收请求:逐行读取请求行请求头,判断段有请求体后,读取请求体
  2. 处理请求
  3. 返回响应:根据处理结果,生成相应的 HTTP 请求(响应行响应头响应体

Nginx 也是这个套路,整体流程一致。

模块化体系结构

nginx的模块根据其功能基本上可以分为以下几种类型:

常见问题剖析

Nginx vs. Apache

nginx vs. apache:

网络 IO 模型:

  1. nginx:IO 多路复用,epoll(freebsd 上是 kqueue )
    1. 高性能
    2. 高并发
    3. 占用系统资源少
  2. apache:阻塞 + 多进程/多线程
    1. 更稳定,bug 少
    2. 模块更丰富

参考: https://www.zhihu.com/question/19571087

场景:

处理多个请求时,可以采用:IO 多路复用 或者 阻塞 IO +多线程

  1. IO 多路服用一个 线程,跟踪多个 socket 状态,哪个就绪,就读写哪个;
  2. 阻塞 IO + 多线程:每一个请求,新建一个服务线程

思考IO 多路复用多线程 的适用场景?

Nginx 最大连接数

基础背景:

  1. Nginx 是多进程模型,Worker 进程用于处理请求;
  2. 单个进程的连接数(文件描述符 fd),有上限(nofile):ulimit -n
  3. Nginx 上配置单个 worker 进程的最大连接数:worker_connections 上限为 nofile
  4. Nginx 上配置 worker 进程的数量:worker_processes

因此,Nginx 的最大连接数:

  1. Nginx 的最大连接数:Worker 进程数量 x 单个 Worker 进程的最大连接数
  2. 上面是 Nginx 作为通用服务器时,最大的连接数
  3. Nginx 作为反向代理服务器时,能够服务的最大连接数:(Worker 进程数量 x 单个 Worker 进程的最大连接数)/ 2。
  4. Nginx 反向代理时,会建立 Client 的连接后端 Web Server 的连接,占用 2 个连接

思考:

  1. 每打开一个 socket 占用一个 fd
  2. 为什么,一个进程能够打开的 fd 数量有限制?

附录

HTTP 请求和响应

IO 模型

场景:

处理多个请求时,可以采用:IO 多路复用 或者 阻塞 IO +多线程

  1. IO 多路服用一个 线程,跟踪多个 socket 状态,哪个就绪,就读写哪个;
  2. 阻塞 IO + 多线程:每一个请求,新建一个服务线程

思考:IO 多路复用多线程 的适用场景?

select/poll 和 epoll 比较

详细内容,参考:

select/poll 系统调用:

// select 系统调用
int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout); 

// poll 系统调用
int poll(struct pollfd fds[], nfds_t nfds, int timeout);

select

poll

epoll: event 事件驱动

select,poll,epoll:

  1. I/O多路复用的机制;
  2. I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。
    1. 监视多个文件描述符
  3. 但select,poll,epoll本质上都是同步I/O
    1. 用户进程负责读写(从内核空间拷贝到用户空间),读写过程中,用户进程是阻塞的;
    2. 异步 IO,无需用户进程负责读写,异步IO,会负责从内核空间拷贝到用户空间

Nginx 的并发处理能力

关于 Nginx 的并发处理能力:

更多细节,参考:

参考资料

原文地址: https://ningg.top/nginx-series-principle/
点击: 联系我
点击查看评论(Note:可能被墙了)
微信公众号 ningg, 联系我

同类文章:

微信搜索: 公众号 ningg, 联系我, 交个朋友.

Top

玻璃钢生产厂家枣庄玻璃钢休闲椅公司临沂玻璃钢机械外壳定做北海玻璃钢装饰造型批发宜春玻璃钢坐凳哪家好广州玻璃钢人物雕塑厂家淮北玻璃钢前台定做通辽玻璃钢雕塑厂家湘潭玻璃钢造型厂家贵州玻璃钢花坛制造兰州不锈钢雕塑制造河北玻璃钢摆件批发鄂州玻璃钢造型哪家好曲靖玻璃钢花槽制作天津玻璃钢垃圾桶定制四平玻璃钢造型制作蚌埠玻璃钢坐凳公司襄阳玻璃钢产品制造黄石玻璃钢沙发批发珠海不锈钢家具加工朔州玻璃钢产品批发阳江玻璃钢花池制造金华玻璃钢花坛厂家张掖商场美陈批发铜川玻璃钢卡通雕塑制作漯河玻璃钢价格百色玻璃钢公仔雕塑哪家好营口玻璃钢医疗外壳厂家直销咸宁玻璃钢天花吊顶哪家好嘉兴玻璃钢茶几公司平凉玻璃钢人物雕塑生产厂家香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化