Nginx(二)

116 阅读5分钟

Nginx负载均衡

(1)概述

早期的网站流量和业务功能比较简单,单台服务器足以满足基本的需求,但是随着业务越来越多,需要多台服务器进行性能扩展和避免单点故障的出现,需要将不同用户流量分发到不同服务器上

(2)原理及处理流程

系统的扩展分为纵向和横向扩展。纵向扩展是从单机角度触发,通过增加系统的硬件处理能力来提升服务器的处理能力。横向扩展通过添加机器来满足大型网站服务的处理能力。

(3)负载均衡作用

  • 解决服务器高并发压力,提高处理性能
  • 提供故障转移,实现高可用
  • 通过增加或减少服务器的数量,增强网站系统的扩展性
  • 再负载均衡服务器上进行过滤,提升网站的安全性

(4)负载均衡常用处理方式

方式一:用户手动选择,在网站上提供不同的线路,让用户自己选择

image.png

方式二:DNS轮询方式:大多数域名注册商都对同一台组件添加多条A记录,这就是DNS轮询,DNS服务器将解析请求按照A记录顺序,随机分配到不同的IP上,这样就能完成简单的负载均衡。

缺点:

  • 可靠性低

如果一台服务器发生故障,那么所有访问该服务器的请求将不会有所回应,即使将IP从DNS中去掉,由于各大宽带接入商将众多的DNS存放在缓存中,导致DNS不会实时更新。

  • 负载均衡不均衡

不能区分服务器的差异和当前的运行状态,会导致某几台服务器负荷很低,另几台服务器负荷很高。

Nginx 七层负载均衡

在反向代理的基础上把用户请求根据指定算法分发到一组【upstream虚拟服务池】

1.upstream指令

用来定义一组服务器,可以是不同的端口服务器。服务器可以指定不同权重,默认为1

upstream name{...}

2.server指定后端服务器名称和一些参数,可以使用域名、IP、端口或者unix

server name[paramerters]

upstream backend{
    server 192.168.10.100:9001;
    server 192.168.10.100:9002;
    server 192.168.10.100:9003;
}

server{
    listen:8083;
    server_name localhost;
    location / {
        proxy_pass http://backend;
    }
}

3.负载均衡状态

状态概述
down当前server暂时不参与负载均衡
max_fails允许请求的失败次数
fail_timeout经过max_fails失败后,服务暂停时间
max_conns限制最大的连接次数
backup设置为备份服务器,当主服务器不可用时,将用来传递请求

4.负载均衡策略

算法名称说明
轮询默认方式
weight权重方式
ip_hash根据IP分配方式
least_conn依据最少连接方式
url_hash依据URL分配方式
fair依据响应时间方式

url_hash

按照访问的url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及资源时间的浪费。

upstream backend{
    hash $request_uri;
    server 192.168.10.100:9001;
    server 192.168.10.100:9002;
    server 192.168.10.100:9003;
}

server{
    listen:8083;
    server_name localhost;
    location / {
        proxy_pass http://backend;
    }
}

fair

根据页面大小、加载时间长短智能的进行负载均衡

upstream backend{
    fair
    server 192.168.10.100:9001;
    server 192.168.10.100:9002;
    server 192.168.10.100:9003;
}

server{
    listen:8083;
    server_name localhost;
    location / {
        proxy_pass http://backend;
    }
}

5.负载均衡案例

(1)一般轮询规则

upstream backend{
    hash $request_uri;
    server 192.168.10.100:9001;
    server 192.168.10.100:9002;
    server 192.168.10.100:9003;
}

server{
    listen:8083;
    server_name localhost;
    location / {
        proxy_pass http://backend;
    }
}

(2)加权轮序

upstream backend{
    hash $request_uri;
    server 192.168.10.100:9001 weight=7;
    server 192.168.10.100:9002 weight=5;
    server 192.168.10.100:9003 weight=3;
}

server{
    listen:8083;
    server_name localhost;
    location / {
        proxy_pass http://backend;
    }
}

(3)对特定资源实现负载均衡

upstream videobackend{
    hash $request_uri;
    server 192.168.10.100:9001
    server 192.168.10.100:9002 
}
upstream filebackend{
    hash $request_uri;
    server 192.168.10.100:9003
    server 192.168.10.100:9004 
}

server{
    listen:8084;
    server_name localhost;
    location /video/ {
        proxy_pass http://videobackend;
    }
    location /file/ {
        proxy_pass http://filebackend;
    }
}

(4)对不同域名实现负载均衡

upstream test1{
    hash $request_uri;
    server 192.168.10.100:9001
    server 192.168.10.100:9002 
}
upstream test2{
    hash $request_uri;
    server 192.168.10.100:9003
    server 192.168.10.100:9004 
}

server{
    listen:8085;
    server_name www.hello.com;
    location / {
        proxy_pass http://test1;
    }
}
server{
    listen:8086;
    server_name www.nihao.com;
    location / {
        proxy_pass http://test2;
    }
}

Nginx四层负载均衡

七层是基于HTTP协议
四层是基于TCP/IP协议

四层负载均衡的性能远高于HTTP协议

1.stream指令 指定流服务器指令的配置上下文。和http指令同级

2.upstream指令 和http中的upstream指令是类似的

3.案例

81端口转发到redis1 和 redis2,82端口转发到tomcat

image.png

stream{
   upstream redisbackend{
        server 192.168.200.146:6379;
        server 192.168.200.146:6378;
   }
   upstream tomcatbackend{
        server 192.168.200.146:8080;
   }
   server{
        listen 81;
        proxy_pass redisbackend
   }
   server{
        listen 82;
        proxy_pass tomcatbackend
   }   
 
}

Nginx缓存集成

1.缓存概念

缓存就是数据交换的缓冲区,当用户需要获取数据时,先从缓存中拿,缓存中有就直接返回给用户,如果没有,就会发请求去服务器中查询数据。

image.png

2.优缺点

优点

(1)减少服务器压力,节省网络流量,加快响应速度,提升用户体验

(2)减轻服务器压力

(3)提供服务端的高可用性

缺点

(1)数据不一致

(2)增加成本

3.原理

客户端给nginx发请求,nginx收到url后形成一个key,这个key通过算法形成一个密文,去对应的路径中寻找,如果找到了给客户端,没找到就给服务器发请求

image.png

4.指令

(1)proxy_cache_path path(存储路径)[levels = number] levels:指定缓存空间对应的目录,最多可以设置三层如:

levels = 1:2 缓存空间有两层目录,第一次是一个字母,第二次是两个字母

某个MD5值为 13146461654dfsf6464asd4sa698

levels = 1:2 /usr/local/proxy_cache/8/69 levels = 2:1:2 /usr/local/proxy_cache/98/6/sa

(2)keys_zone:用来设置缓存区的名字和大小

keys_zone = daf:200m 缓存区名字为daf 大小200M 1M能存储8000个keys

(3)inactive:指定缓存数据多长时间为被访问就删除 inactive = 1d 1天没有被访问就删除

(4)max_size 设置最大缓存空间,如果满了,覆盖缓存时间最长的资源

(5) proxy_cache zone_name[缓存区名称] on|off 开启关闭缓存代理

(6) proxy_cache_key key设置web缓存的key值

(7) proxy_cache_valid 对不同状态码设置不同的缓存时间

(8) proxy_cache_min_uses 设置资源被访问多少次后被缓存

(9) proxy_cache_methods 设置缓存哪些http方法

(10) proxy_no_cache string 定义不将数据作缓存的条件

(11) proxy_cache——bypass string 不从缓存中拿数据的的条件

Nginx动静分离

1.概念

动:后台的业务处理

静:网站的静态资源

分离:将二者分开部署,静态资源由nginx访问,非静态内容由Tomcat服务器来部署访问、、

2.优点

动静分离之后,降低动态资源和静态资源的耦合度,动态资源宕机了也不影响静态资源的展示