Ngnix 是一款轻量级的 Web 服务器/反向代理服务器,工作在七层 Http 协议的负载均衡系统。具有高性能、高并发、低内存使用等特点。是一个轻量级的 Http 和反向代理服务器。Nginx 使用 epoll and kqueue 作为开发模型。能够支持高达 50,000 个并发连接数的响应。

操作系统:Liunx,Windows(Linux、FreeBSD、Solaris、Mac OS X、AIX 以及 Microsoft Windows)

开发语言:C

并发性能:官方支持每秒 5 万并发,实际国内一般到每秒 2 万并发,有优化到每秒 10 万并发的。具体性能看应用场景。

1.1. Ngnix 特点

1.模块化设计:良好的扩展性,可以通过模块方式进行功能扩展。

2.高可靠性:主控进程和 worker 是同步实现的,一个 worker 出现问题,会立刻启动另一个 worker。

3.内存消耗低:一万个长连接(keep-alive),仅消耗 2.5MB 内存。

4.支持热部署:不用停止服务器,实现更新配置文件,更换日志文件、更新服务器程序版本。

5.并发能力强:官方数据每秒支持 5 万并发;

6.功能丰富:优秀的反向代理功能和灵活的负载均衡策略

1.2. Ngnix 功能

基本功能

  • 支持静态资源的 web 服务器。
  • http,smtp,pop3 协议的反向代理服务器、缓存、负载均衡;
  • 支持 FASTCGI(fpm)
  • 支持模块化,过滤器(让文本可以实现压缩,节约带宽),ssl 及图像大小调整。
  • 内置的健康检查功能
  • 基于名称和 ip 的虚拟主机
  • 定制访问日志
  • 支持平滑升级
  • 支持 KEEPALIVE
  • 支持 url rewrite
  • 支持路径别名
  • 支持基于 IP 和用户名的访问控制。
  • 支持传输速率限制,支持并发数限制。

扩展功能

性能

Nginx 的高并发,官方测试支持 5 万并发连接。实际生产环境能到 2-3 万并发连接数。10000 个非活跃的 HTTP keep-alive 连接仅占用约 2.5MB 内存。三万并发连接下,10 个 Nginx 进程,消耗内存 150M。淘宝 tengine 团队测试结果是“24G 内存机器上,处理并发请求可达 200 万”。

1.3. Ngnix 架构

Nginx 的基本工作模式

请添加链接描述

一个 master 进程,生成一个或者多个 worker 进程。但是这里 master 是使用 root 身份启动的,因为 nginx 要工作在 80 端口。而只有管理员才有权限启动小于低于 1023 的端口。master 主要是负责的作用只是启动 worker,加载配置文件,负责系统的平滑升级。其它的工作是交给 worker。那么当 worker 被启动之后,也只是负责一些 web 最简单的工作,而其他的工作都是有 worker 中调用的模块来实现的。

模块之间是以流水线的方式实现功能的。流水线,指的是一个用户请求,由多个模块组合各自的功能依次实现完成的。比如:第一个模块只负责分析请求首部,第二个模块只负责查找数据,第三个模块只负责压缩数据,依次完成各自工作。来实现整个工作的完成。

他们是如何实现热部署的呢?其实是这样的,我们前面说 master 不负责具体的工作,而是调用 worker 工作,他只是负责读取配置文件,因此当一个模块修改或者配置文件发生变化,是由 master 进行读取,因此此时不会影响到 worker 工作。在 master 进行读取配置文件之后,不会立即的把修改的配置文件告知 worker。而是让被修改的 worker 继续使用老的配置文件工作,当 worker 工作完毕之后,直接当掉这个子进程,更换新的子进程,使用新的规则。

Nginx 支持的 sendfile 机制

Sendfile 机制,用户将请求发给内核,内核根据用户的请求调用相应用户进程,进程在处理时需要资源。此时再把请求发给内核(进程没有直接 IO 的能力),由内核加载数据。内核查找到数据之后,会把数据复制给用户进程,由用户进程对数据进行封装,之后交给内核,内核在进行 tcp/ip 首部的封装,最后再发给客户端。这个功能用户进程只是发生了一个封装报文的过程,却要绕一大圈。因此 nginx 引入了 sendfile 机制,使得内核在接受到数据之后,不再依靠用户进程给予封装,而是自己查找自己封装,减少了一个很长一段时间的浪费,这是一个提升性能的核心点。

请添加链接描述

以上内容摘自网友发布的文章,简单一句话是资源的处理,直接通过内核层进行数据传递,避免了数据传递到应用层,应用层再传递到内核层的开销。

目前高并发的处理,一般都采用 sendfile 模式。通过直接操作内核层数据,减少应用与内核层数据传递。