Nginx记录-Nginx介绍

Nginx 是一个高性能的 Web 和反向代理服务器, 它具备有不少很是优越的特性:nginx

做为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发链接,体现更高的效率,这点使 Nginx 尤为受到虚拟主机提供商的欢迎。可以支持高达 50,000 个并发链接数的响应,感谢 Nginx 为咱们选择了 epoll and kqueue 做为开发模型.数据库

做为负载均衡服务器:Nginx 既能够在内部直接支持 Rails 和 PHP,也能够支持做为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不管是系统资源开销仍是 CPU 使用效率都比 Perlbal 要好的多。缓存

做为邮件代理服务器: Nginx 同时也是一个很是优秀的邮件代理服务器(最先开发这个产品的目的之一也是做为邮件代理服务器),Last.fm 描述了成功而且美妙的使用经验。安全

Nginx 安装很是的简单,配置文件 很是简洁(还可以支持perl语法),Bugs很是少的服务器: Nginx 启动特别容易,而且几乎能够作到7*24不间断运行,即便运行数个月也不须要从新启动。你还可以在 不间断服务的状况下进行软件版本的升级。服务器

代码结构

nginx工做(worker)码包括核心和功能模块。 nginx的核心是负责维护严格的运行循环,并在请求处理的每一个阶段执行模块代码的适当部分。 模块构成了大部分的演示和应用层功能。 模块读取和写入网络和存储,转换内容,执行出站过滤,应用服务器端包含操做,并在代理启动时将请求传递给上游服务器。网络

nginx的模块化架构一般容许开发人员扩展一组Web服务器功能,而无需修改nginx内核。 nginx模块略有不一样,即核心模块,事件模块,阶段处理程序,协议,可变处理程序,过滤器,上游和负载平衡器。nginx不支持动态加载的模块; 即在构建阶段将模块与核心一块儿编译。架构

在处理与接受,处理和管理网络链接和内容检索相关的各类操做时,nginx在基于Linux,Solaris和BSD的操做系统中使用事件通知机制和一些磁盘I/O性能加强,如:kqueue,epoll, 和事件端口。 目标是为操做系统提供尽量多的提示,以便及时获取入站和出站流量,磁盘操做,读取或写入套接字,超时等异步反馈。 对于每一个基于Unix的nginx运行的操做系统,大量优化了复用和高级I/O操做的不一样方法的使用。并发

nginx架构的高级概述以下图所示 -负载均衡

工做模式

如前所述,nginx不会为每一个链接生成一个进程或线程。 相反,工做(worker)进程接受来自共享“listen”套接字的新请求,并在每一个工做(worker)内执行高效的运行循环,以处理每一个工做(worker)中的数千个链接。 没有专门的仲裁或分配与nginx工做(worker)的联系; 这个工做(worker)是由操做系统内核机制完成的。 启动后,将建立一组初始侦听套接字。 而后,工做(worker)在处理HTTP请求和响应时不断接受,读取和写入套接字。异步

运行循环是nginx工做(worker)代码中最复杂的部分。 它包括全面的内部调用,而且在很大程度上依赖异步任务处理的想法。 异步操做经过模块化,事件通知,普遍使用回调函数和微调定时器来实现。 整体而言,关键原则是尽量不阻塞。 nginx仍然能够阻塞的惟一状况是工做(worker)进程没有足够的磁盘存储。

因为nginx不会链接一个进程或线程,因此在绝大多数状况下,内存使用很是保守,很是有效。 nginx也节省CPU周期,由于进程或线程没有持续的建立 - 销毁模式。 nginx的做用是检查网络和存储的状态,初始化新链接,将其添加到运行循环中,并异步处理直到完成,此时链接被从新分配并从运行循环中删除。 结合仔细使用系统调用(syscall)和精确实现支持接口(如poolslab内存分配器),nginx一般能够在极端工做负载下实现中到低的CPU使用。

在一些磁盘使用和CPU负载模式,应调整nginx工做(worker)的数量。 在这里说一点基础规则:系统管理员应该为其工做负载尝试几个配置。 通常建议可能以下:若是负载模式是CPU密集型的,例如,处理大量TCP/IP,执行SSL或压缩,则nginx工做(worker)的数量应与CPU内核数量相匹配; 若是负载大可能是磁盘I/O绑定,例如,从存储或重代理服务不一样的内容集合 - 工做(worker)的数量多是核心数量的一到两倍。有些工程师会根据我的存储单元的数量选择工做(worker)的数量,但这种方法的效率取决于磁盘存储的类型和配置。

nginx的开发人员将在即将推出的版本中解决的一个主要问题是如何避免磁盘I/O上的大多数阻塞。 目前,若是没有足够的存储性能来提供特定工做(worker)生成的磁盘操做,该工做(worker)可能仍然阻止从磁盘读取/写入。 存在许多机制和配置文件指令来减轻此类磁盘I/O阻塞状况。要注意的是,诸如:sendfile和AIO之类的选项的组合一般会为磁盘性能带来很大的余量。 应该根据数据集,可用于nginx的内存量和底层存储架构来规划安装一个nginx服务器。

现有工做(worker)模式的另外一个问题是与嵌入式脚本的有限支持有关。 一个使用标准的nginx分发,只支持嵌入Perl脚本。一个简单的解释:关键问题是嵌入式脚本阻止任何操做或意外退出的可能性。 这两种类型的行为将当即致使工做(worker)挂起的状况,同时影响到数千个链接。 更多的工做(worker)计划是使nginx的嵌入式脚本更简单,更可靠,适用于更普遍的应用。

nginx进程角色

nginx在内存中运行多个进程; 有一个主进程和几个工做(worker)进程。 还有一些特殊用途的过程,特别是缓存加载器和缓存管理器。 全部进程都是单线程版本为1.x的nginx。 全部进程主要使用共享内存机制进行进程间通讯。主进程做为root用户运行。 缓存加载器,缓存管理器和工做(worker)则以无权限用户运行。

主程序负责如下任务:

  • 读取和验证配置
  • 建立,绑定和关闭套接字
  • 启动,终止和维护配置的工做(worker)进程数
  • 从新配置,无需中断服务
  • 控制不间断的二进制升级(若是须要,启动新的二进制并回滚)
  • 从新打开日志文件
  • 编译嵌入式Perl脚本

工做(worker)进程接受,处理和处理来自客户端的链接,提供反向代理和过滤功能,并执行几乎全部其余的nginx能力。 关于监视nginx实例的行为,系统管理员应该关注工做(worker)进程,由于它们是反映Web服务器实际平常操做的过程。

缓存加载器进程负责检查磁盘缓存项目,并使用缓存元数据填充nginx的内存数据库。 本质上,缓存加载器准备nginx实例来处理已经存储在磁盘上的特定分配的目录结构中的文件。 它遍历目录,检查缓存内容元数据,更新共享内存中的相关条目,而后在全部内容清洁并准备使用时退出。
缓存管理器主要负责缓存到期和无效。 在正常的nginx操做期间它保持在内存中,而且在失败的状况下由主进程从新启动。

nginx缓存简介

在nginx中的缓存以文件系统上的分层数据存储的形式实现。 缓存密钥是可配置的,而且可使用不一样的请求特定参数来控制进入缓存的内容。 缓存密钥和缓存元数据存储在共享存储器段中,高速缓存加载器,缓存管理器和工做(worker)能够访问它们。 目前,除了操做系统的虚拟文件系统机制暗示的优化以外,没有任何内存中的文件缓存。 每一个缓存的响应都放在文件系统上的不一样文件中。 层次结构(级别和命名细节)经过nginx配置指令进行控制。 当响应写入缓存目录结构时,文件的路径和名称将从代理URL的MD5哈希导出。

将内容放置在缓存中的过程以下:当nginx从上游服务器读取响应时,内容首先写入缓存目录结构以外的临时文件。 当nginx完成处理请求时,它重命名临时文件并将其移动到缓存目录。 若是用于代理的临时文件目录位于另外一个文件系统上,则该文件将被复制,所以建议将临时文件目录和缓存目录保存在同一文件系统上。 当须要显式清除缓存目录结构时,从文件中删除文件也是很是安全的。 nginx有第三方扩展,能够远程控制缓存的内容,还有更多的工做计划将此功能集成到主分发中。

相关文章
相关标签/搜索