Nginx学习笔记(五):负载均衡、缓存、集群和扩展
学习资源:
- 黑马程序员Nginx教程
参考了其对应的学习资料,并进行重排、总结和补充。- Nginx中文文档
负载均衡
常见的方式
用户手动选择
这种方式比较原始,只要实现的方式就是在网站主页上面提供不同线路、不同服务器链接方式,让用户来选择自己访问的具体服务器,来实现负载均衡。
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
-
下载,上传,解压
ngx_cache_purge-2.3.tar.gz
-
更新nginx,如
./configure --add-module=/root/nginx/module/purge
,然后make等等(上两步参考前文) -
配置,如:
server{ location ~/purge(/.*) { proxy_cache_purge itcast itheima; } }
在浏览器访问相应资源前加
/purge/
进行删除
设置资源不缓存
对于一些经常发生变化的数据,如果进行缓存的话,就很容易出现用户访问到的数据不是服务器真实的数据。所以对于这些资源我们在缓存的过程中就需要进行过滤,不进行缓存。
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_nocache
:http://xx.cn?nocache=1
$arg_comment
:http://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
暂略
评论区