侧边栏壁纸
博主头像
LYMTICS

海纳百川,有容乃大

  • 累计撰写 45 篇文章
  • 累计创建 37 个标签
  • 累计收到 19 条评论

目 录CONTENT

文章目录

Nginx学习笔记(五):负载均衡、缓存、集群和扩展

LYMTICS
2022-02-19 / 0 评论 / 0 点赞 / 141 阅读 / 5,573 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-02-20,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Nginx学习笔记(五):负载均衡、缓存、集群和扩展

学习资源:

负载均衡

常见的方式

用户手动选择

这种方式比较原始,只要实现的方式就是在网站主页上面提供不同线路、不同服务器链接方式,让用户来选择自己访问的具体服务器,来实现负载均衡。

image

DNS轮询

给一个域名添加多条A记录,就可以实现DNS轮询。

清空本地的dns缓存:

ipconfig/flushdns

但是:

  • 可靠性低
  • 负载均衡不均衡

四/七层负载均衡

(图源网络,侵删)

所谓四层负载均衡指的是OSI七层模型中的传输层,主要是基于IP+PORT的负载均衡

实现四层负载均衡的方式:

  • 硬件:F5 BIG-IP、Radware等
  • 软件:LVS、Nginx、Hayproxy等

所谓的七层负载均衡指的是在应用层,主要是基于虚拟的URL或主机IP的负载均衡

实现七层负载均衡的方式:

  • 软件:Nginx、Hayproxy等

实际环境采用的模式: 四层负载(LVS)+七层负载(Nginx)

Nginx七层负载均衡

Nginx要实现七层负载均衡需要用到proxy_pass代理模块配置。Nginx默认安装支持这个模块,我们不需要再做任何处理。Nginx的负载均衡是在Nginx的反向代理基础上把用户的请求根据指定的算法分发到一组【upstream虚拟服务池】。

相关指令

# 创建一组服务器
upstream backend{
	server 192.168.200.146:9091;
	server 192.168.200.146:9092;
	server 192.168.200.146:9093;
}
server {
	listen 8083;
	server_name localhost;
	location /{
		proxy_pass http://backend;	# 反向代理时这样设置
	}
}

负载均衡状态

状态概述说明
down当前的server暂时不参与负载均衡对需要停机维护的服务器进行设置
backup预留的备份服务器当主服务器不可用时,将用来传递请求
max_fails允许请求失败的次数允许请求代理服务器失败的次数,默认为1
fail_timeout经过max_fails失败后, 服务暂停时间经过max_fails失败后,服务暂停的时间,默认是10秒
max_conns限制最大的接收连接数设置代理服务器同时活动链接的最大数量,默认为0,表示不限制
upstream backend{
	server 192.168.200.133:9001 down;
	server 192.168.200.133:9002 backup;
	server 192.168.200.133:9003 max_fails=3 fail_timeout=15;
}
server {
	listen 8083;
	server_name localhost;
	location /{
		proxy_pass http://backend;
	}
}

负载均衡策略

算法名称作用
轮询默认方式
weight=?权重方式
ip_hash依据ip分配方式
least_conn依据最少连接方式
url_hash依据URL分配方式
fair依据响应时间方式

轮询: 默认就是轮询

upstream backend{
	server 192.168.200.146:9001 weight=1; # 默认weight就是1
	server 192.168.200.146:9002;
	server 192.168.200.146:9003;
}
server {
	listen 8083;
	server_name localhost;
	location /{
		proxy_pass http://backend;
	}
}

加权轮询: 权重数据越大,被分配到请求的几率越大

upstream backend{
	server 192.168.200.146:9001 weight=10;
	server 192.168.200.146:9002 weight=5;
	server 192.168.200.146:9003 weight=3;
}
server {
	listen 8083;
	server_name localhost;
	location /{
		proxy_pass http://backend;
	}
}

ip_hash: 确保session在同一台服务器上

ip_hash指令能够将某个客户端IP的请求通过哈希算法定位到同一台后端服务器上。这样,当来自某一个IP的用户在后端Web服务器A上登录后,在访问该站点的其他URL,能保证其访问的还是后端web服务器A。(如果有Redis就不需要这种方式了)

upstream backend{
	ip_hash; # 加这条
	server 192.168.200.146:9001;
	server 192.168.200.146:9002;
	server 192.168.200.146:9003;
}
server {
	listen 8083;
	server_name localhost;
	location /{
		proxy_pass http://backend;
	}
}

least_conn: 把请求转发给连接数较少的后端服务器,适合请求处理时间长短不一造成服务器过载的情况

upstream backend{
	least_conn;
	server 192.168.200.146:9001;
	server 192.168.200.146:9002;
	server 192.168.200.146:9003;
}
server {
	listen 8083;
	server_name localhost;
	location /{
		proxy_pass http://backend;
	}
}

url_hash: 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用

同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再此收到请求,就可以从缓存中读取。

upstream backend{
	hash &request_uri;
	server 192.168.200.146:9001;
	server 192.168.200.146:9002;
	server 192.168.200.146:9003;
}
server {
	listen 8083;
	server_name localhost;
	location /{
		proxy_pass http://backend;
	}
}

fair: 采用的不是内建负载均衡使用的轮换的均衡算法,而是可以根据页面大小、加载时间长短智能的进行负载均衡

先安装,参考:

upstream backend{
	fair;
	server 192.168.200.146:9001;
	server 192.168.200.146:9002;
	server 192.168.200.146:9003;
}
server {
	listen 8083;
	server_name localhost;
	location /{
		proxy_pass http://backend;
	}
}

Nginx四层负载均衡

暂略过此部分。

缓存集成

Nginx是从0.7.48版开始提供缓存功能。Nginx是基于Proxy Store来实现的,其原理是把URL及相关组合当做Key,在使用MD5算法对Key进行哈希,得到硬盘上对应的哈希目录路径,从而将缓存内容保存在该目录中。它可以支持任意URL连接,同时也支持404/301/302这样的非200状态码。Nginx既可以支持对指定URL或者状态码设置过期时间,也可以使用purge命令来手动清除指定URL的缓存。

Nginx的web缓存服务主要是使用ngx_http_proxy_module模块相关指令集来完成。

设置缓存

proxy_cache_path

语法proxy_cache_path path [levels=number]
keys_zone=zone_name:zone_size [inactive=time][max_size=size];
默认值
位置http
作用用于设置缓存文件的存放路径

path 缓存路径地址,如:

/usr/local/proxy_cache

levels 指定该缓存空间对应的目录,最多可以设置3层,每层取值为1|2如:

levels=1:2   缓存空间有两层目录,第一次是1个字母,第二次是2个字母
举例说明:
itheima[key]通过MD5加密以后的值为 43c8233266edce38c2c9af0694e2107d
levels=1:2   最终的存储路径为/usr/local/proxy_cache/d/07
levels=2:1:2 最终的存储路径为/usr/local/proxy_cache/7d/0/21
levels=2:2:2 最终的存储路径为??/usr/local/proxy_cache/7d/10/e2

keys_zone 用来为这个缓存区设置名称和指定大小,如:

keys_zone=itcast:200m  缓存区的名称是itcast,大小为200M,1M大概能存储8000个keys

inactive 指定缓存的数据多次时间未被访问就将被删除,如:

inactive=1d   缓存数据在1天内没有被访问就会被删除

max_size 设置最大缓存空间,如果缓存空间存满,默认会覆盖缓存时间最长的资源,如:

max_size=20g

配置实例:

http{
	proxy_cache_path /usr/local/proxy_cache keys_zone=itcast:200m  levels=1:2:1 inactive=1d max_size=20g;
}

proxy_cache

语法proxy_cache zone_name|off;
默认值proxy_cache off;
位置http、server、location
作用开启或关闭代理缓存,如果是开启则自定使用哪个缓存区来进行缓存

zone_name 指定使用缓存区的名称

proxy_cache_key

语法proxy_cache_key key;
默认值proxy_cache_key $scheme$proxy_host$request_uri;
位置http、server、location
作用设置web缓存的key值
Nginx会根据key值MD5哈希存缓存

proxy_cache_valid

语法proxy_cache_valid [code ...] time;
默认值
位置http、server、location
作用用来对不同返回状态码的URL设置不同的缓存时间

案例:

proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
# 为200和302的响应URL设置10分钟缓存,为404的响应URL设置1分钟缓存
proxy_cache_valid any 1m;
# 对所有响应状态码的URL都设置1分钟缓存

proxy_cache_min_uses

语法proxy_cache_min_uses number;
默认值proxy_cache_min_uses 1;
位置http、server、location
作用设置资源被访问多少次后被缓存

proxy_cache_methods

语法proxy_cache_methods GET|HEAD|POST;
默认值proxy_cache_methods GET HEAD;
位置http、server、location
作用设置缓存哪些HTTP方法

默认缓存HTTP的GET和HEAD方法,不缓存POST方法

清除缓存

直接删除

rm -rf *

使用第三方模块

ngx_cache_purge

  1. 下载,上传,解压 ngx_cache_purge-2.3.tar.gz

  2. 更新nginx,如 ./configure --add-module=/root/nginx/module/purge,然后make等等(上两步参考前文)

  3. 配置,如:

    server{
    	location ~/purge(/.*) {
    		proxy_cache_purge itcast itheima;
    	}
    }
    

    在浏览器访问相应资源前加 /purge/ 进行删除

    详参: Module ngx_http_proxy_module

设置资源不缓存

对于一些经常发生变化的数据,如果进行缓存的话,就很容易出现用户访问到的数据不是服务器真实的数据。所以对于这些资源我们在缓存的过程中就需要进行过滤,不进行缓存。

proxy_no_cache

语法proxy_no_cache string ...;
默认值
位置http、server、location
作用用来定义不将数据进行缓存的条件

案例:

proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;

三者有一个满足则不缓存,其中:

  • $cookie_nocache : 通过 add_header Set-Cookie : nocache=123 进行设置(值随意)
  • $arg_nocachehttp://xx.cn?nocache=1
  • $arg_commenthttp://xx.cn?comment=1

proxy_cache_bypass

语法proxy_cache_bypass string ...;
默认值
位置http、server、location
作用用来设置不从缓存中获取数据的条件
proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment;

一般两个都设置

集群搭建

暂略

ngx_lua

暂略

0

评论区