https://mp.weixin.qq.com/s/uCL1Z_VJ7c6kMUxQ2eE3nw
https://mp.weixin.qq.com/s/ni2qEWET-p6hzrdZWBPi3g
Apache 的发展时期很长,而且是毫无争议的世界第一大服务器。它有着很多优点:稳定、开源、跨平台等等。
它出现的时间太长了,它兴起的年代,互联网产业远远比不上现在。所以它被设计为一个重量级的。
它不支持高并发的服务器。在 Apache 上运行数以万计的并发访问,会导致服务器消耗大量内存。
操作系统对其进行进程或线程间的切换也消耗了大量的 CPU 资源,导致 HTTP 请求的平均响应速度降低。
这些都决定了 Apache 不可能成为高性能 Web 服务器,轻量级高并发服务器 Nginx 就应运而生了。
俄罗斯的工程师 Igor Sysoev,他在为 Rambler Media 工作期间,使用 C 语言开发了 Nginx。
Nginx 作为 Web 服务器一直为 Rambler Media 提供出色而又稳定的服务。然后呢,Igor Sysoev 将 Nginx 代码开源,并且赋予自由软件许可证。
由于以下这几点,所以,Nginx 火了:
-
Nginx 使用基于事件驱动架构,使得其可以支持数以百万级别的 TCP 连接。
-
高度的模块化和自由软件许可证使得第三方模块层出不穷(这是个开源的时代啊)。
-
Nginx 是一个跨平台服务器,可以运行在 Linux、Windows、FreeBSD、Solaris、AIX、Mac OS 等操作系统上。
-
这些优秀的设计带来的极大的稳定性。
Nginx 是一款自由的、开源的、高性能的 HTTP 服务器和反向代理服务器;同时也是一个 IMAP、POP3、SMTP 代理服务器。
Nginx 可以作为一个 HTTP 服务器进行网站的发布处理,另外 Nginx 可以作为反向代理进行负载均衡的实现。
正向代理
正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。
正向代理,"它代理的是客户端",是一个位于客户端和原始服务器(Origin Server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器)。
然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
正向代理的用途:
-
访问原来无法访问的资源,如 Google。
-
可以做缓存,加速访问资源。
-
对客户端访问授权,上网进行认证。
-
代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息。
反向代理
多个客户端给服务器发送的请求,Nginx 服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。
此时请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,Nginx 扮演的就是一个反向代理角色。
客户端是无感知代理的存在的,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。
反向代理,"它代理的是服务端",主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。
反向代理的作用:
-
保证内网的安全,通常将反向代理作为公网访问地址,Web 服务器是内网。
-
负载均衡,通过反向代理服务器来优化网站的负载。
-
在正向代理中,Proxy 和 Client 同属于一个 LAN(图中方框内),隐藏了客户端信息。
-
在反向代理中,Proxy 和 Server 同属于一个 LAN(图中方框内),隐藏了服务端信息。
实际上,Proxy 在两种代理中做的事情都是替服务器代为收发请求和响应,不过从结构上看正好左右互换了一下,所以把后出现的那种代理方式称为反向代理了。
负载均衡
负载均衡在实际项目操作过程中,有硬件负载均衡和软件负载均衡两种,硬件负载均衡也称为硬负载,如 F5 负载均衡,相对造价昂贵成本较高。
但是数据的稳定性安全性等等有非常好的保障,如中国移动中国联通这样的公司才会选择硬负载进行操作。
更多的公司考虑到成本原因,会选择使用软件负载均衡,软件负载均衡是利用现有的技术结合主机硬件实现的一种消息队列分发机制。
Nginx 的进程模型
Nginx 服务器,正常运行过程中:
-
多进程:一个 Master 进程、多个 Worker 进程。
-
Master 进程:管理 Worker 进程。对外接口:接收外部的操作(信号);对内转发:根据外部的操作的不同,通过信号管理 Worker;监控:监控 Worker 进程的运行状态,Worker 进程异常终止后,自动重启 Worker 进程。
-
Worker 进程:所有 Worker 进程都是平等的。实际处理:网络请求,由 Worker 进程处理。Worker 进程数量:在 nginx.conf 中配置,一般设置为核心数,充分利用 CPU 资源,同时,避免进程数量过多,避免进程竞争 CPU 资源,增加上下文切换的损耗。
HTTP 连接建立和请求处理过程
HTTP 连接建立和请求处理过程如下:
-
Nginx 启动时,Master 进程,加载配置文件。
-
Master 进程,初始化监听的 Socket。
-
Master 进程,Fork 出多个 Worker 进程。
-
Worker 进程,竞争新的连接,获胜方通过三次握手,建立 Socket 连接,并处理请求。
Nginx 高性能、高并发
Nginx 为什么拥有高性能并且能够支撑高并发?
-
Nginx 采用多进程+异步非阻塞方式(IO 多路复用 Epoll)。
-
请求的完整过程:建立连接→读取请求→解析请求→处理请求→响应请求。
-
请求的完整过程对应到底层就是:读写 Socket 事件。
Nginx 的事件处理模型
Request:Nginx 中 HTTP 请求。
基本的 HTTP Web Server 工作模式:
-
接收请求:逐行读取请求行和请求头,判断段有请求体后,读取请求体。
-
处理请求。
-
返回响应:根据处理结果,生成相应的 HTTP 请求(响应行、响应头、响应体)。
使用Nginx限流
https://mp.weixin.qq.com/s/MT8Z189DBnSuXGFVTKUSVQ