[转载] Nginx工作原理

转载地址:https://blog.csdn.net/yy339452689/article/details/103921644?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param#3.1.1%20Nginx%E5%A4%84%E7%90%86Request%E8%AF%B7%E6%B1%82%E8%BF%87%E7%A8%8B%E8%A7%A3%E6%9E%90

1.Nginx介绍

   1.1 什么是Nginx?

   1.2 Nginx能做什么

   1.3 为什么要选择用Nginx

3.Nginx工作原理

   3.1 工作原理:

      3.1.1 Nginx处理Request请求过程解析

      3.1.2 一个完整的Request请求流程

 


1.Nginx介绍

1.1 什么是Nginx

Nginx (engine x) 是一个高性能的HTTP反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。

那么何为正向代理与反向代理呢?说白了,正向代理就是客户端的代理,反向代理就是服务器端的代理。

1.2 Nginx能做什么

  • 作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型
  • 作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。
  • 作为邮件代理服务器:Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。

1.3 为什么要选择用Nginx

  • 作为Web服务器,Nginx处理静态文件、索引文件,自动索引的效率非常高
  • 作为代理服务器,Nginx可以实现无缓存的反向代理加速,提高网站运行速度
  • 作为负载均衡服务器,Nginx既可以在内部直接支持Rails和PHP,也可以支持HTTP代理服务器对外进行服务,同时还支持简单的容错和利用算法进行负载均衡
  • 在性能方面,Nginx是专门为性能优化而开发的,实现上非常注重效率。它采用内核Poll模型,可以支持更多的并发连接,最大可以支持对5万个并发连接数的响应,而且只占用很低的内存资源
  • 在稳定性方面,Nginx采取了分阶段资源分配技术,使得CPU与内存的占用率非常低。Nginx官方表示,Nginx保持1万个没有活动的连接,而这些连接只占用2.5MB内存,因此,类似DOS这样的攻击对Nginx来说基本上是没有任何作用的
  • 在高可用性方面,Nginx支持热部署,启动速度特别迅速,因此可以在不间断服务的情况下,对软件版本或者配置进行升级,即使运行数月也无需重新启动,几乎可以做到7x24小时不间断地运行
  • Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器: Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动

 

3.Nginx工作原理

首先,我们通过一个内部结构流程图来熟悉一下Nginx的工作流程:

3.1 工作原理:

Nginx真正处理请求业务的是Worker之下的线程。worker 进程中,ngx_worker_process_cycle()函数就是这个无限循环的处理函数。在这个函数中,一个请求的简单处理流程如下:

  1. 操作系统提供的机制(例如 epoll, kqueue 等)产生相关的事件。
  2. 接收和处理这些事件,如是接收到数据,则产生更高层的 request 对象。
  3. 处理 request 的 header 和 body。
  4. 产生响应,并发送回客户端。
  5. 完成 request 的处理。
  6. 重新初始化定时器及其他事件。

3.1.1 Nginx处理Request请求过程解析

下面我们结合一个请求流程来理解一下Nginx整个过程当中做了哪些事。从 Nginx 的内部来看,一个 HTTP Request 的处理过程涉及到以下几个阶段:

  1. 初始化 HTTP Request(读取来自客户端的数据,生成 HTTP Request 对象,该对象含有该请求所有的信息)。
  2. 处理请求头。
  3. 处理请求体。
  4. 如果有的话,调用与此请求(URL 或者 Location)关联的 handler。
  5. 依次调用各 phase handler 进行处理。

我们再通过一个流程图看看处理过程:

根据注释,我们可以看到:

  • Nginx启动后,首先会根据配置与对应的客户端进行初始化连接。
  • 而当一个Request进入后,先是对请求头及请求体进行解析和处理。
  • 处理过程中,通过请求头找到对应的server config,然后与真实服务器进行连接并进行读写事件处理。
  • 最后我们会看到有多个phase handler,就是包含若干个处理阶段的一些 handler。一个 phase handler 对这个 request 进行处理,并产生一些输出。通常 phase handler 是与定义在配置文件中的某个 location 相关联的
  • 一个通常会做一下处理:
  1. 获取 location 配置。
  2. 产生适当的响应。
  3. 发送 response header。
  4. 发送 response body。

3.1.2 一个完整的Request请求流程

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值