1 前言

      在讲解nginx之前需要了解以下几个基本概念:同步与异步、阻塞与非阻塞、epoll模型等,在了解以上几个基本概念后应该就可以明白为什么nginx相对与apache来说更能支持高并发了。

1.1  同步与异步

      同步与异步的重点在消息通知的方式上,也就是调用结果的通知方式不同。

(1)同步:当一个同步调用发出去后,调用者要一直等待调用的结果通知后,才能进行后续的执行。
(2)异步:当一个异步调用发出去后,调用者不必一直等待调用结果的返回,异步调用,要想获得结果,一般有两种方式:

  • 1、主动轮询异步调用的结果;
  • 2、被调用方通过 callback(回调通知)来通知调用方调用结果;

举例说明:

(1)同步取快递:小明收到快递将送达的短信,在楼下一直等到快递送达。
(2)异 步 取快递:小明收到快递将送达的短信,快递到楼下后,小明再下楼去取。异步取快递,小明知道快递到达楼下有两种方式:

  • 1、不停的电话问快递小哥到了没有,即主动轮询;
  • 2、快递小哥到楼下后,打电话通知小明,然后小明下楼取快递,即回调通知。

1.2 阻塞与非阻塞

       阻塞与非阻塞的重点在于进/线程等待消息时候的行为,也就是在等待消息的时候,当前进/线程是挂起状态,还是非挂起状态。

  • 阻塞 :调用在发出去后,在消息返回之前,当前进/线程会被挂起,直到有消息返回,当前进/线程才会被激活
  • 非阻塞 :调用在发出去后,不会阻塞当前进/线程,而会立即返回。

实例解释 :

  • 阻塞取快递:小明收到快递即将送达的信息后,什么事都不做,一直专门等快递。
  • 非阻塞取快递:小明收到快递即将送达的信息后,等快递的时候,还一边敲代码、一边刷微信。

同步非同步、阻塞非阻塞之间的区别:

       同步与异步,重点在于消息通知的方式;阻塞与非阻塞,重点在于等消息时候的行为。

       所以,就有了下面 4 种组合方式

  • 同步阻塞:小明收到信息后,啥都不干,等快递;
  • 同步非阻塞:小明收到信息后,边刷微博,边等着取快递;
  • 异步阻塞:小明收到信息后,啥都不干,一直等着快递员通知他取快递;
  • 异步非阻塞:小明收到信息后,边 刷着 微博 ,边等快递员通知他取快;

       大部分程序的 I/O(Input/Output) 模型都是同步阻塞的,单个进程每次只在一个文件描述符上执行 I/O 操作,每次 I/O系统调用都会阻塞,直到完成数据传输。传统的服务器采用的就是同步阻塞的多进程模型。一个 server采用一个进程负责一个 request 的方式,一个进程负责一个 request,直到会话结束。进程数就是并发数,而操作系统支持的进程数是有限的,且进程数越多,调度的开销也越大,因此无法面对高并发。Nginx 采用了异步非阻塞的方式工作,,因此使用于支持高并发的业务场景。我们先来先了解一下 I/O 多路复用中的 epoll 模型

1.3 epoll 模型

       当连接有 I/O 事件产生的时候,epoll 就会去告诉进程哪个连接有 I/O 事件产生,然后进程就去处理这个事件。

  • 例如:小明(进程)家楼下有一个收发室,每次有快递到了(连接有 I/O 事件产生),门卫(epoll )就先代收并做了标记;然后通知小明去取送给小明的快递。

       通过以上基本概念的讲解后,就可以大体知道为什么Nginx比其他web服务器并发高了。

       nginx工作原理:

      Nginx 配置 use epoll 后,以异步非阻塞方式工作,能够轻松处理百万级的并发连接

      处理过程 :每进来一个 request,会有一个 worker 进程去处理。但不是全程的处理,处理到可能发生阻塞的地方。比如向后端服务器转发 request,并等待请求返回。那么,这个处理的 worker 不会这么傻等着,他会在发送完请求后,注册一个事件:“如果后端服务器返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有新的 request 进来,他就可以很快再按这种方式处理。而一旦后端服务器返回了,就会触发这个事件,worker 才会来接手,这个 request 才会接着往下走。通过这种快速处理,快速释放请求的方式,达到同样的配置可以处理更大并发量的目的。

2 nginx详解

       Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx 是由伊戈尔·赛索耶夫为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0 发布于 2004 年 10 月 4 日。
       Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强。

       Nginx 有两种工作模式:master-worker 模式和单进程模式。在 master-worker 模式下,有一个 master 进程和至少一个的 worker 进程,单进程模式顾名思义只有一个进程。这两种模式有各自的特点和适用场景。

2.1 master-worker 模式

      该模式下,nginx 启动成功后,会有一个 master 进程和至少一个的 worker 进程。master 进程负责处理系统信号,加载配置,管理 worker 进程(启动,杀死,监控,发送消息/信号等)。worker 进程负责处理具体的业务逻辑,也就是说,对外部来说,真正提供服务的是 worker 进程。生产环境下一般使用这种模式,因为这种模式有以下优点:

  • 1. 稳定性高,只要还有 worker 进程存活,就能够提供服务,并且一个 worker 进程挂掉 master 进程会立即启动一个新的 worker 进程,保证 worker 进程数量不变,降低服务中断的概率。
  • 2. 配合 linux 的 cpu 亲和性配置,可以充分利用多核 cpu 的优势,提升性能;
  • 3. 处理信号/配置重新加载/升级时可以做到尽可能少或者不中断服务(热重启);

2.2 单进程模式

       单进程模式下,nginx 启动后只有一个进程,nginx 的所有工作都由这个进程负责。由于只有一个进程,因此可以很方便地利用 gdb 等工具进行调试。该模式不支持 nginx 的平滑升级功能,任何的信号处理都可能造成服务中断,并且由于是单进程,进程挂掉后,在没有外部监控的情况下,无法重启服务。因此,该模式一般只在开发阶段和调试时使用,生产环境下不会使用。

3 Nginx的相关功能

3.1 Nginx的状态统计

       安装 nginx 时将 --with-http_stub_status_module 模块开启。客户端访问网址:http://IP/nginx_status,页面上显示相应的参数:

  1. "Active connections"表示当前的活动连接数;
  2. "server accepts handled requests"表示已经处理的连接信息
  3. 三个数字依次表示已处理的连接数、成功的 TCP 握手次数、已处理的请求数

3.2 目录保护功能

       原理上和apache的目录保护功能一样。对于需要保护的目录文件,设置登录的用户名/密码。

3.3 基于IP的身份验证

       类似于ip黑名单+白名单的方式,限制登录的ip。

3.4 nginx的虚拟主机

      和apache的虚拟主机功能一样,一个ip可以提供多个域名访问。

3.5 Nginx的反向代理(常用)

      代理和反向代理通过举例来说明:

  • 代理:找别人代替你去完成一件你完不成的事(代购),代理的对象是客户端;
  • 反向代理:替厂家卖东西的人就叫反向代理(烟酒代理) ,代理的对象是服务器端;

        

linux下启动nginx 制定config_运维

3.6 负载调度(负载均衡)

       负载均衡(Load Balance)其意思就是将任务分摊到多个操作单元上进行执行,例如 Web 服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。相对于nginx作为web服务器来说,apache的使用时期相对较长,在稳定性和安全性上相对更好一点。因此一般都是采用nginx来作为反向代理服务器,apache作为web服务器集群。nginx反向代理通过负载分担算法(rr)负载到不同的apache服务器上,进行轮询或者加权轮询调度。

       

linux下启动nginx 制定config_运维_02

3.7 nginx实现https(证书+rewrite)

       一般情况下,对于内外网访问需要进行https访问更加安全,其nginx实现https与apache类似,并且对http进行rewrite使得其自动跳转到https页面。