[转载] Nginx工作原理
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()函数就是这个无限循环的处理函数。在这个函数中,一个请求的简单处理流程如下:
- 操作系统提供的机制(例如 epoll, kqueue 等)产生相关的事件。
- 接收和处理这些事件,如是接收到数据,则产生更高层的 request 对象。
- 处理 request 的 header 和 body。
- 产生响应,并发送回客户端。
- 完成 request 的处理。
- 重新初始化定时器及其他事件。
3.1.1 Nginx处理Request请求过程解析
下面我们结合一个请求流程来理解一下Nginx整个过程当中做了哪些事。从 Nginx 的内部来看,一个 HTTP Request 的处理过程涉及到以下几个阶段:
- 初始化 HTTP Request(读取来自客户端的数据,生成 HTTP Request 对象,该对象含有该请求所有的信息)。
- 处理请求头。
- 处理请求体。
- 如果有的话,调用与此请求(URL 或者 Location)关联的 handler。
- 依次调用各 phase handler 进行处理。
我们再通过一个流程图看看处理过程:
根据注释,我们可以看到:
- Nginx启动后,首先会根据配置与对应的客户端进行初始化连接。
- 而当一个Request进入后,先是对请求头及请求体进行解析和处理。
- 处理过程中,通过请求头找到对应的server config,然后与真实服务器进行连接并进行读写事件处理。
- 最后我们会看到有多个phase handler,
就是包含若干个处理阶段的一些 handler。
一个 phase handler 对这个 request 进行处理,并产生一些输出。通常 phase handler 是与定义在配置文件中的某个 location 相关联的
。 - 一个通常会做一下处理:
- 获取 location 配置。
- 产生适当的响应。
- 发送 response header。
- 发送 response body。
3.1.2 一个完整的Request请求流程