Nginx学习笔记

一、背景与介绍


1、功能

Nginx常用于WEB服务器和反向代理服务器,在架构中充当网关角色,主要作用如下:

  • 路由功能(与微服务对应):域名/路径,进行路由选择后台服务器
  • 负载功能(与高并发高可用对应):对后台服务器集群进行负载
  • 静态服务器(比 tomcat 性能高很多):将静态文件单独做一个服务器;
    总结:实际使用中,这三种功能会混合使用。比如先分离动静,再路由服务,再负载机器。

2、反向代理

反向代理服务器实现了路由和负载均衡的功能,那么什么是代理?什么是正向、反向代理?

  • 正向代理,"它代理的是客户端,代客户端发出请求"。
  • 反向代理,"它代理的是服务端,代服务端接收请求"。
Nginx学习笔记_第1张图片

在正向代理中,Proxy和Client同属于一个LAN(图中方框内),隐藏了客户端信息;在反向代理中,Proxy和Server同属于一个LAN(图中方框内),隐藏了服务端信息;

利用反向代理的功能可以实现:
(1)保证内网的安全,通常将反向代理作为公网访问地址,Web服务器是内网
(2)负载均衡,通过反向代理服务器来优化网站的负载

3、负载均衡

  • weight轮询(默认,常用):接收到的请求按照权重分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,Nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。
  • ip_hash(常用):每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。
  • fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是Nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块。
  • url_hash:按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在Nginx作为静态服务器的情况下提高缓存效率。同样要注意Nginx默认不支持这种调度算法,要使用的话需要安装Nginx的hash软件包。

source:Nginx 相关介绍(Nginx是什么?能干嘛?)

4、限流

系统设计时一般会预估负载,当系统暴露在公网中时,恶意攻击或正常突发流量等都可能导致系统被压垮,而限流就是保护措施之一。Nginx 提供两种限流方式,一是控制速率,二是控制并发连接数。

二、架构与原理


1、基本设计

  • 一个master进程生成多个worker子进程(每个进程只有一个线程),一个worker响应多个用户请求;

  • 非阻塞、IO复用、事件驱动:select,poll, epoll, kqueue,/dev/poll;

  • 支持sendfile,sendfile64;

  • 支持文件AIO(异步I/O);

  • 支持mmap;

  • 灵活的文件配置;

  • 占用内存小:10,000个非活动HTTP保持连接占用大约2.5M内存。

Nginx进程模型为一个master进程生成多个worker子进程(每个进程只有一个主线程),一个worker响应多个用户请求。Nginx 的高并发性能源自于:Nginx 采用了异步非阻塞的方式来处理请求,也就是说,Nginx 是可以同时处理成千上万个请求的,而apache 的常用工作方式为同步阻塞(apache 也有异步非阻塞版本,但因其与自带某些模块冲突,所以不常用),每个请求会独占一个工作线程,接收请求之后,会一直等待该请求读取程序文件(IO)(同步),执行业务逻辑,返回客户端,所有操作完成之后才能处理下一个请求(阻塞)如果服务器已经达到256(apache最多设置256个)的极限,那么接下去的访问就需要排队这也就是为什么某些服务器负载不高的原因。

2、语法

location

location [=|~|~*|^~] /uri/ {… }
首先匹配 =,其次匹配^~,其次是按文件中顺序的正则匹配,最后是交给 /通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

upstream

  • 轮询
upstream nginx {
  server 172.17.0.1:8080;
  server 172.17.0.2:8080;
}

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

  • weight

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。down 暂时不参与负载

upstream nginx {
  server 172.17.0.1:8080 weight=2;
  server 172.17.0.2:8080 weight=1;
}
  • ip_hash

每个请求按访问ip的hash结果分配,这样同一客户端的请求总是发往同一个后端服务器,可以解决session的问题。

upstream nginx {
  ip_hash;
  server 172.17.0.1:8080;
  server 172.17.0.2:8080;
}

你可能感兴趣的:(Nginx学习笔记)