Fork me on GitHub

关于nginx

​ 站起来,伸个懒腰,今天总算是稍微系统的了解了Nginx,越看越喜欢这个异步框架的Web服务器了。这里不想记录nginx的具体配置和使用,网上和笔记中都有非常详细的教程,这里就不赘述了,只想说一下Nginx的架构设计和主要功能。

主要功能

​ 先说主要功能吧,自己有些主要功能了解和使用,部分功能自己并没有实践。

  • 作为基本HTTP服务器
    • 提供静态和索引文件,自动索引; 打开文件描述符缓存;
    • 加速反向代理与缓存; 负载均衡和容错;
    • 通过缓存FastCGI,uwsgi,SCGI和memcached服务器来加速支持; 负载均衡和容错;
    • 模块化架构。 过滤器包括gzip,字节范围,分块响应,XSLT,SSI和图像变换过滤器。 如果由代理或FastCGI/uwsgi/SCGI服务器处理,则单页内的多个SSI包含可以并行处理;
    • SSL和TLS SNI支持;
    • 支持具有加权和依赖关系优先级的HTTP/2。
  • 其他HTTP服务器功能

    • 基于名称和基于IP的虚拟服务器;
    • 保持活动和管道连接的支持;
    • 访问日志格式,缓冲日志写入,快速日志轮换和syslog日志记录;
    • 3xx-5xx错误代码重定向;
    • 重写模块:使用正则表达式更改URI;
    • 根据客户端地址执行不同的功能;
    • 根据客户端IP地址,密码(HTTP Basic认证)和子请求结果进行访问控制;
    • HTTP引用的验证
    • PUT,DELETE,MKCOL,COPY和MOVE方法;
    • FLV和MP4流媒体;
    • 响应速度限制;
    • 限制来自一个地址的同时连接或请求的数量;
    • 基于IP的地理定位;
    • A/B测试;
    • 嵌入式Perl
    • nginScript。
  • 邮件代理服务器

    • 使用外部HTTP认证服务器将用户重定向到IMAP或POP3服务器;
    • 使用外部HTTP认证服务器进行用户认证,并将连接重定向到内部SMTP服务器;
    • 认证方式:
      • POP3:USER / PASS,APOP,AUTH LOGIN / PLAIN / CRAM-MD5;
      • IMAP:LOGIN,AUTH LOGIN / PLAIN / CRAM-MD5;
      • SMTP:AUTH LOGIN / PLAIN / CRAM-MD5;
    • SSL支持;
    • STARTTLS和STLS支持。
  • TCP/UDP代理服务器功能

    • TCP和UDP的通用代理;
    • SSL和TLS SNI支持TCP;
    • 负载均衡和容错;
    • 基于客户地址的访问控制;
    • 根据客户端地址执行不同的功能;
    • 限制来自一个地址的同时连接数;
    • 访问日志格式,缓冲日志写入,快速日志轮换和syslog日志记录;
    • 基于IP的地理定位;
    • A/B测试;
    • nginScript。

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

    以上是nginx的主要功能,但是在实际使用中,主要有以下几种应用场景,我在平时用的比较多的也就是反向代理和HTTP服务器。

  • 反向代理

  • 负载均衡

  • HTTP服务器

  • 正向代理

架构

首先看一下架构图。

  • nginx 不会为每一个连接生成一个进程或者线程。相反,工作(worker)进程接受来自共享“listen”套接字的新请求,并在每个工作(worker)内执行高效的运行循环,以处理每个工作(worker)中的数千个连接。 没有专门的仲裁或分配与nginx工作(worker)的联系; 这个工作(worker)是由操作系统内核机制完成的。 启动后,将创建一组初始侦听套接字。 然后,工作(worker)在处理HTTP请求和响应时不断接受,读取和写入套接字。
  • 运行循环是nginx工作(worker)代码中最复杂的部分。 它包括全面的内部调用,并且在很大程度上依赖异步任务处理的想法。 异步操作通过模块化,事件通知,广泛使用回调函数和微调定时器来实现。 总体而言,关键原则是尽可能不阻塞。 nginx仍然可以阻塞的唯一情况是工作(worker)进程没有足够的磁盘存储。
  • 在绝大多数情况下,内存使用非常保守,非常有效。 nginx也节省CPU周期,因为进程或线程没有持续的创建 - 销毁模式。 nginx的作用是检查网络和存储的状态,初始化新连接,将其添加到运行循环中,并异步处理直到完成,此时连接被重新分配并从运行循环中删除。 结合仔细使用系统调用(syscall)和精确实现支持接口(如poolslab内存分配器),nginx通常可以在极端工作负载下实现中到低的CPU使用。
  • 在一些磁盘使用和CPU负载模式,应调整nginx工作(worker)的数量。 在这里说一点基础规则:系统管理员应该为其工作负载尝试几个配置。 一般建议可能如下:如果负载模式是CPU密集型的,例如,处理大量TCP/IP,执行SSL或压缩,则nginx工作(worker)的数量应与CPU内核数量相匹配; 如果负载大多是磁盘I/O绑定,例如,从存储或重代理服务不同的内容集合 - 工作(worker)的数量可能是核心数量的一到两倍。
  • nginx的开发人员将在即将推出的版本中解决的一个主要问题是如何避免磁盘I/O上的大多数阻塞。 目前,如果没有足够的存储性能来提供特定工作(worker)生成的磁盘操作,该工作(worker)可能仍然阻止从磁盘读取/写入。 存在许多机制和配置文件指令来减轻此类磁盘I/O阻塞情况。
  • 现有工作(worker)模式的另一个问题是与嵌入式脚本的有限支持有关。 一个使用标准的nginx分发,只支持嵌入Perl脚本。一个简单的解释:关键问题是嵌入式脚本阻止任何操作或意外退出的可能性。 这两种类型的行为将立即导致工作(worker)挂起的情况,同时影响到数千个连接。 更多的工作(worker)计划是使nginx的嵌入式脚本更简单,更可靠,适用于更广泛的应用。

nginx进程中的角色

​ nginx在内存中运行多个进程,包括一个主进程和多个工作 worker 进程。

​ 主进程以 root 用户运行,缓存加载器,缓存管理器和工作(worker)则以无权限用户运行。

​ worker 进程接受,处理和处理来自客户端的连接,提供反向代理和过滤功能,并执行几乎所有其他的nginx能力。

​ 缓存加载器进程负责检查磁盘缓存项目,并使用缓存元数据填充nginx的内存数据库。 本质上,缓存加载器准备nginx实例来处理已经存储在磁盘上的特定分配的目录结构中的文件。 它遍历目录,检查缓存内容元数据,更新共享内存中的相关条目,然后在所有内容清洁并准备使用时退出。

​ 缓存管理器主要负责缓存到期和无效。 在正常的nginx操作期间它保持在内存中,并且在失败的情况下由主进程重新启动。