当前位置:   article > 正文

2.28日学习打卡----初学Nginx(三)

2.28日学习打卡----初学Nginx(三)

2.28日学习打卡

Nginx场景实践

浏览器缓存

在这里插入图片描述
浏览器缓存是为了加速浏览,浏览器在用户磁盘上,对最近请求过的文档进行存储。当访问者再次请求这个页面时,浏览器就可以从本地磁盘显示文档,这样,就可以加速页面的阅览,缓存的方式节约了网络的资源,提高了网络的效率。

实现浏览器缓存步骤

浏览器请求---->有缓存----->校验过期---->呈现内容

浏览器缓存可以通过expires指令输出Header头来实现。

语法:expires[time| epoch | max |off]
默认值:expires off
作用域:http、server、location
  • 1
  • 2
  • 3

一个HTML页面,会引用一些JavaScript文件、图片文件、而这些格式的文件很少会被修改,则可以通过expires设置浏览器缓存。

示例
比如,对常见格式的图片、Flash文件在浏览器本地缓存30天,对JS、CSS文件在浏览器本地缓存1小时,代码如下

location ~ .*\.(gif|jpg|png)$
{
   expires 30d;
}
location ~.*\.(js|css)?$
{
   expires 1h;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Cache-Control
设置相对过期时间, max-age指明以秒为单位的缓存时间. 若对静态资源只缓存一次, 可以设置max-age的值为315360000000 (一万年). 比如对于提交的订单,为了防止浏览器回退重新提交,可以使用Cache-Control之no-store绝对禁止缓存,即便浏览器回退依然请求的是服务器,进而判断订单的状态给出相应的提示信息!

Http协议的cache-control的常见取值及其组合释义:

  • no-cache: 数据内容不能被缓存, 每次请求都重新访问服务器, 若有max-age, 则缓存期间不访问服务器
  • no-store: 不仅不能缓存, 连暂存也不可以(即: 临时文件夹中不能暂存该资源)
  • private(默认): 只能在浏览器中缓存, 只有在第一次请求的时候才访问服务器, 若有- - max-age, 则缓存期间不访问服务器
  • public: 可以被任何缓存区缓存, 如: 浏览器、服务器、代理服务器等
  • max-age: 相对过期时间, 即以秒为单位的缓存时间

语法结构:

# expires 1d;
add_header Cache-Control no-cache;
add_header Cache-Control private;
  • 1
  • 2
  • 3

缓存流程
在这里插入图片描述
企业实战示例

下面配置需求:

  1. 禁用html文件缓存,即cache control设置为no-cache;
  2. 对于js,图片,css,字体等,设置max-age=2592000. 也就是30天;

注意:
缓存控制字段cache-control的配置(add_header)要放在http, server, location区域, 或是放在location的if判断里, 例如"add_header Cache-Control no-cache;"

配置源码

server{
  listen 80;
  server_name 192.168.66.100;
  location ~ \.         (css|js|gif|jpg|jpeg|png|bmp|swf|ttf|woff|otf|ttc|pfa)$ {
    root /data/web/kevin;
    expires 30d;
  } 
  location ~ \.(html|htm)$ {
    root /data/web/kevin;
    add_header Cache-Control no-cache;
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

防盗链

防盗链的概念

内容不在自己的服务器上,通过技术手段将其他网站的内容(比如一些音乐、图片、软件的下载地址)放置在自己的网站中,通过这种方法盗取其他网站的空间和流量。

防盗链技术背景
在这里插入图片描述

防止第三方引用链接访问我们的图片,消耗服务器资源和网络流量,我们可以在服务器上做防盗链限制。

防盗链设置思路
首要方式:区别那些请求是非正常的用户请求。
在这里插入图片描述
基于http_refer防盗链配置模块
HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。

语法结构:

valid_referers none blocked 192.168.66.100;
if ($invalid_referer) {
   return 403;
}
  • 1
  • 2
  • 3
  • 4

参数:

  • none : 允许没有http_refer的请求访问资源;
  • blocked : 允许不是http://开头的,不带协议的请求访问资源;
  • 192.168.66.100: 只允许指定ip来的请求访问资源;

代理服务

在这里插入图片描述
正向代理
正向代理,是在用户端的。比如需要访问某些国外网站,我们可能需要购买vpn。

正向代理最大的特点:

  • 客户端非常明确要访问的服务器地址;
  • 服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;
  • 正向代理模式屏蔽或者隐藏了真实客户端信息。

在这里插入图片描述

反向代理

客户端给服务器发送的请求,nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,nginx扮演的就是一个反向代理角色。

反向代理,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。
在这里插入图片描述

反向代理

在这里插入图片描述
单体架构
在这里插入图片描述

单体架构问题:

  • 复杂性高:模块多,模块边界模糊,代码质量参差不齐,每次修改代码都心惊胆战
  • 技术债务:随着时间的推移,需求变更和人员迭代,会逐渐形成应用程序的技术债务,并且越积越多
  • 部署频率低:随着代码增多,构建和部署的时间也会增多,每次部署都要重新部署整个项目
  • 可靠性差:某个应用有bug,可能会导致整个应用崩溃
  • 扩展能力受限:单体应用只能作为一个整体应用进行扩展,无法根据业务模块的需要进行伸缩

反向代理设置指令

学习Nginx服务器的反向代理服务,要涉及与后端代理服务器相关的配置指令比较重要,是为客户端提供正常Web服务的基础,大家应该熟练掌握尤其是proxy_pass指令,在实际应用过程中需要注意一些配置细节,需要小心使用。

proxy_pass指令

该指令用来设置被代理服务器的地址,可以是主机名称、IP地址加端口号等形式。

语法结构:

proxy_pass URL;
  • 1

参数:
URL为要设置的被代理服务器的地址,包含传输协议、主机名称或P地址加端口号、URI等要素。传输协议通常是"http"或者"https://"。

示例:

server{
  ....
  listen 80;
  server_name *.*;
  location / {
    proxy_pass http://192.168.66.101:8080;
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

负载均衡

在这里插入图片描述
什么是负载均衡

负载均衡是高可用网络基础架构的关键组件,通常用于将工作负载分布到多个服务器来提高网站、应用、数据库或其他服务的性能和可靠性。

没有负载均衡的 web 架构
在这里插入图片描述
有负载均衡web架构:
在这里插入图片描述
upstream指令

upstream块不属于虚拟主机,只能在http块里配置,它定义了在反向代理时Nginx需要访问的后端服务器集群和负载均衡策略。

语法格式:

upstream  back_end {       # upstream 需要一个名字
  server 192.168.66.100 max_conns=2 fail_timeout=1s;
  server 192.168.66.101 weight = 1;
  server 192.168.66.102 weight = 1;
}
server{
  lisetn 80;
  server_name *.*;
  location / {
   proxy_set_header Host $host;  #转发原始请求的host头部
   proxy_pass http://back_end;  #转发到upstream块定义的服务器集群。 
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

upstream参数:

  • max_conns 节点的最大连接数
  • slow_start 缓慢启动时间
  • down 节点下线
  • backup 备用节点
  • max_fails 允许的最大失败数
  • fail_timeout 超过最大失败数后的等待时间

负载均衡算法

在这里插入图片描述
轮询(默认)

轮询方式,依次将请求分配到各个后台服务器中,默认的负载均衡方式。 适用于后台机器性能一致的情况。 挂掉的机器可以自动从服务列表中剔除。

upstream bakend {  
 server 192.168.0.14;  
 server 192.168.0.15;  
}
  • 1
  • 2
  • 3
  • 4

轮询加权重

根据权重来分发请求到不同的机器中,指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

upstream bakend {  
 server 192.168.0.14 weight=10;  
 server 192.168.0.15 weight=10;  
} 
  • 1
  • 2
  • 3
  • 4

IP_hash

每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题。俗称IP绑定。在这里插入图片描述

upstream  backServer{
       server 127.0.0.1:8080 ;
        server 127.0.0.1:8081 ;
        ip_hash; 
    }
    
    server {
     listen    80;
     server_name  www.itmayiedu.com;
     location / {
           ### 指定上游服务器负载均衡服务器
           proxy_pass http://backServer;
       index  index.html index.htm;
     }
   } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

url_hash
在这里插入图片描述

按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身不支持url_hash,如果需要这种调度算法,则必须安装Nginx的hash软件包。

fair

比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间 来分配请求,响应时间短的优先分配。Nginx本身不支持fair,如果需要这种调度算法,则必须安装upstream_fair模块。

fair模块安装

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

模块安装
切换到nginx目录执行一下操作

./configure --prefix=/usr/local/nginx  /
--add-module=/opt/nginx-upstream-fair-master
  • 1
  • 2

编译

make
  • 1

备份原来的nginx命令

cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx-bak
  • 1

替换原来的 nginx 命令

cp /usr/local/nginx-1.16.1/objs/nginx /usr/local/nginx/sbin/nginx
  • 1

配置实现

upstream backserver { 
 fair; 
 server 192.168.0.14; 
 server 192.168.0.15; 
} 
  • 1
  • 2
  • 3
  • 4
  • 5

注意:
已安装Nginx,配置第三方模块时,只需要–add-module=/第三方模块目录,然后make编译一下就可以,不要 make install 安装。编译后复制objs下面的nginx到指定目录下。

Nginx配置故障转移

当上游服务器(真实访问服务器),一旦出现故障或者是没有及时相应的话,应该直接轮训到下一台服务器,保证服务器的高可用。

Nginx配置代码

server {
     listen    80;
     server_name  www.itmayiedu.com;
     location / {
           ### 指定上游服务器负载均衡服务器
           proxy_pass http://backServer;
           #故障转移的条件:如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。 
   proxy_next_upstream http_502 http_504 error timeout invalid_header; 
        ###nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
            proxy_connect_timeout 1s;
            ###nginx发送给上游服务器(真实访问的服务器)超时时间
       proxy_send_timeout 1s;
            ### nginx接受上游服务器(真实访问的服务器)超时时间
       proxy_read_timeout 1s;
       index  index.html index.htm;
     }
   }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

跨域问题

在这里插入图片描述
为什么会出现跨域问题

出于浏览器的同源策略限制。同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

什么是跨域

当一个请求URL的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域。

当前页面url被请求页面url是否跨域原因
http://www.test.com/http://www.test.com/index.html同源(协议、域名、端口号相同)
http://www.test.com/https://www.test.com/index.html跨域协议不同(http/https)
http://www.test.com/http://www.baidu.com/跨域主域名不同(test/baidu)
http://www.test.com/http://blog.test.com/跨域子域名不同(www/blog)
http://www.test.com:8080/http://www.test.com:7001/跨域端口号不同(8080/7001)

跨域问题演示示例

前端页面

<html>
<body>
<button onclick="test()">发送</button>
</body>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script>
function test (){
   $.get("http://192.168.66.100:90/abc", function(result){
       alert(result);
   });
}
</script>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

如下报错

index.html:1 Access to XMLHttpRequest at 'http://192.168.66.100:90/abc' from origin 'null' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
jquery.min.js:6 GET http://192.168.66.100:90/abc net::ERR_FAILED 200
  • 1
  • 2

跨域问题解决

解决方案

只需要在Nginx的配置文件中配置以下参数:

  location / { 
   add_header Access-Control-Allow-Origin *;
   add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
   add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';


   if ($request_method = 'OPTIONS') {
     return 204;
   }
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

参数:
Access-Control-Allow-Origin 表示服务器可以接受所有的请求源(Origin),即接受所有跨域的请求。
Access-Control-Allow-Methods 明确了客户端所要访问的资源允许使用的方法或方法列表。
Access-Control-Allow-Headers 设置预检请求。

动静分离

在这里插入图片描述
Nginx动静分离简单来说就是把动态和静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求和静态请求分开,可以理解成使用Nginx处理静态请求,Tomcat处理动态请求。

什么是动静分离

:必须依赖服务器生存的文件 比如jsp。 :不需要依赖容器的比如css/js或者图片等文件

动静分离的好处

  • Nginx本身就是一个高性能的静态web服务器
  • 其实静态文件有一个特点就是基本上变化不大,所以动静分离以后我们可以对静态文件进行缓存、或者压缩提高网站性能

静态资源的类型
在Nginx的conf目录下,有一个mime.types文件里边列出了 静态资源的类型,如下:
在这里插入图片描述

当用户访问一个网站,然后从服务器端获取相应的资源,通过浏览器进行解析渲染最后展示给用户,服务端可以返回各种类型的内容,比如xml、jpg、png、gif、flash、MP4、html、css等等,浏览器就是根据mime-type来决定用什么形式来解析和展示的。服务器返回的资源给到浏览器时,会把媒体类型告知浏览器,这个告知的标识就是Content-Type,比如Content-Type:text/html。

动静分离实战
在这里插入图片描述
静态资源的准备

在服务器中准备文件夹放置图片、css、js。

# mkdir -p /usr/local/nginx/static
  • 1

通过请求分离

upstream  webservers  {
     server 192.168.66.101:8080 weight=5;
     server 192.168.66.102:8080 weight=5;
}
   server {
     listen    80;
     server_name  *.*;
     location / {
       root  html;
       index  index.html index.htm;
       proxy_set_header Host $host;
       proxy_pass http://webservers;
     }
     location /image/ {
       root static;
     }
     location /web/ {
       proxy_set_header Host $host;
       proxy_pass http://webservers;
     }
   }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

根据扩展名分离

upstream  webservers {
     server 192.168.66.101:8080 weight=5;
     server 192.168.66.102:8080 weight=5;
}
   server {
     listen    80;
     server_name  *.*;
     location / {
       root  html;
       index  index.html index.htm;
       proxy_set_header Host $host;
       proxy_pass http://webservers;
     }
     location ~ .*.(jpg|png|gif|css|js)$ {
     root static;
     }
   }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

限流

为什么需要限流
系统设计时一般会预估负载,当系统暴露在公网中时,恶意攻击或正常突发流量等都可能导致系统被压垮,而限流就是保护措施之一。

Nginx 的二种限流设置:
控制速率。
控制并发连接数。

限流实战

根据nginx官网提供的说法,有两种算法,一种是漏桶算法,一种是令牌桶算法

  • limit_req_zone 用来限制单位时间内的请求数目,以及速度限制。
  • limit_req_conn 用来限制同一时间连接数,即并发限制。

Nginx限速配置指令

语法结构

放在http{} 内

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
  • 1

参数解析:
第一个参数:$binary_remote_addr 限制同一客户端ip地址。
第二个参数:zone=mylimit:10m 用来存储访问的频次信息。
第三个参数:rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,还可以有比如30r/m的。
在这里插入图片描述

limit_req zone=mylimit burst=1 nodelay;
  • 1

放在server{}内

参数:
第一个参数:zone=one 设置使用哪个配置区域来做限制,与上面limit_req_zone 里的name对应。
第二个参数:burst=5,重点说明一下这个配置,burst爆发的意思,这个配置的意思是设置一个大小为5的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内。
第三个参数:nodelay,如果设置,超过访问频次而且缓冲区也满了的时候就会直接返回503,如果没有设置,则所有请求会等待排队。

在这里插入图片描述
Nginx并发限制配置指令
ngx_http_limit_conn_module 提供了限制连接数的能力,利用 limit_conn_zone 和 limit_conn 两个指令即可。

语法结构

http{
  #ip limit
  limit_conn_zone $binary_remote_addr zone=perip:10m;
  limit_conn_zone $server_name zone=perserver:10m;
}
  • 1
  • 2
  • 3
  • 4
  • 5

在需要 限制并发数下载带宽 的网站配置 server {}里加上如下代码:

server {
   limit_conn perip 10;
   limit_conn perserver 100;
}
  • 1
  • 2
  • 3
  • 4

参数说明:
补充说明下参数:

  • limit_conn perip 10 作用的key 是 $binary_remote_addr,表示限制单个IP同时最多能持有10个连接。
  • limit_conn perserver 100 作用的key是 $server_name,表示虚拟主机(server) 同时能处理并发连接的总数。

设置白名单

限流主要针对外部访问,内网访问相对安全,可以不做限流,通过设置白名单即可。利用 Nginx ngx_http_geo_module 和 ngx_http_map_module 两个工具模块即可搞定。

查看是否具有该功能

./configure --help |grep http_limit_req_module
./configure --help |grep http_geo_module
./configure --help |grep http_map_module
  • 1
  • 2
  • 3

在 nginx.conf 的 http 部分中配置白名单:

geo $limit {
   default 1;
   39.100.243.125 0;
   192.168.0.0/24 0;
   172.20.0.35 0;
}
map limit limit_key {
   0 "";
   1 $binary_remote_addr;
}
limit_req_zone $limit_key zone=myRateLimit:10m rate=10r/s;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

参数:

  • geo 对于白名单(子网或IP都可以) 将返回0,其他IP将返回1。
  • map 将limit转换为 limit_key,如果是 $limit 是0(白名单),则返回空字符串;如果是1,则返回客户端实际IP。
  • limit_req_zone 限流的key不再使用 binary_remote_addr,而是limit_key 来动态获取值。如果是白名单,limit_req_zone 的限流key则为空字符串,将不会限流;若不是白名单,将会对客户端真实IP进行限流。

缓存机制
在这里插入图片描述

核心:
响应速度历来是衡量WEB应用和服务性能优劣的重要指标之一,尤其动态网站在网络上泛滥的今天。除了优化发布内容以外,另外一个主要的办法就是把不需要实时更新的动态页面输出结果转为静态网页形式缓存,进而按照静态网页来访问。

proxy Cache缓存机制
在这里插入图片描述
配置proxy_cache模块

语法结构

在nginx.conf文件中添加如下代码:

http{
   ......
   proxy_cache_path /data/nginx/tmp-test levels=1:2 keys_zone=tmp-test:100m inactive=7d max_size=1000g;
}
  • 1
  • 2
  • 3
  • 4

参数说明:

  • proxy_cache_path 缓存文件路径
  • levels 设置缓存文件目录层次;levels=1:2 表示两级目录
  • keys_zone 设置缓存名字和共享内存大小
  • inactive 在指定时间内没人访问则被删除
  • max_size 最大缓存空间,如果缓存空间满,默认覆盖掉缓存时间最长的资源。

当配置好之后,重启nginx,如果不报错,则配置的proxy_cache会生效
查看 proxy_cache_path / data/ nginx / 目录, 会发现生成了 tmp -test 文件夹。

如何使用proxy_cache
语法配置

location /tmp-test/ {
  proxy_cache tmp-test;
  proxy_cache_valid  200 206 304 301 302 10d;
  proxy_cache_key $uri;
  proxy_set_header Host $host:$server_port;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header  X-Forwarded-For      $proxy_add_x_forwarded_for;
  proxy_pass http://127.0.0.1:8081/media_store.php/tmp-test/;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

参数:

  • Proxy_cache tmp -test 使用名为 tmp -test 的对应缓存配置 proxy_cache_valid >*200 206 304 301 302 10d; 对httpcode为200…的缓存10天
  • proxy_cache_key $uri 定义缓存唯一key,通过唯一key来进行hash存取
  • proxy_set_header 自定义http header头,用于发送给后端真实服务器。
  • proxy_pass 指代理后转发的路径,注意是否 需要 最后的 /

提出问题
到此,就完成了最基本的proxy_cache配置和访问过程介绍,但是最基本的配置,往往无法满足我们的业务需求,我们往往会提出以下疑问和需求:

需要主动清理缓存文件

解决问题

location /tmp-test/ {
    allow 127.0.0.1; //只允许本机访问
    deny all; //禁止其他所有ip
    proxy_cache_purge tmp-test $uri;  //清理缓存
}
  • 1
  • 2
  • 3
  • 4
  • 5

Nginx高可用
在这里插入图片描述
什么是高可用?

高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。如果一个系统能够一直提供服务,那么这个可用性则是百分之百,但是天有不测风云。所以我们只能尽可能的去减少服务的故障。

解决的问题
在生产环境上很多时候是以Nginx做反向代理对外提供服务,但是一天Nginx难免遇见故障,如:服务器宕机。当Nginx宕机那么所有对外提供的接口都将导致无法访问。虽然我们无法保证服务器百分之百可用,但是也得想办法避免这种悲剧,今天我们使用keepalived来实现Nginx的高可用。

双机热备方案

这种方案是国内企业中最为普遍的一种高可用方案,双机热备其实就是指一台服务器在提供服务,另一台为某服务的备用状态,当一台服务器不可用另外一台就会顶替上去。

LVS负载均衡

LVS是一个开源的软件,可以实现传输层四层负载均衡。LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器。
在这里插入图片描述

目标:
通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的 Linux 服务器集群,它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的性能。

LVS的八种调度算法

  1. 轮叫调度 rr
  2. 加权轮叫 wrr
  3. 最少链接 lc
  4. 加权最少链接 wlc
  5. 基于局部性的最少连接调度算法 lblc
  6. 复杂的基于局部性最少的连接算法 lblcr
  7. 目标地址散列调度算法 dh
  8. 源地址散列调度算法 sh

keepalived健康监测

在这里插入图片描述
LVS可以实现负载均衡,但是不能够进行健康检查,比如一个rs出现故障,LVS 仍然会把请求转发给故障的rs服务器,这样就会导致请求的无效性。keepalive 软件可以进行健康检查,而且能同时实现 LVS 的高可用性,解决 LVS 单点故障的问题,其实 keepalive 就是为 LVS 而生的。

keepalived工作原理
keepalived是基于VRRP协议实现的保证集群高可用的一个服务软件,主要功能是实现真机的故障隔离和负载均衡器间的失败切换,防止单点故障。

VRRP协议
VRRP是一种容错协议,它保证当主机的下一跳路由器出现故障时,由另一台路由器来代替出现故障的路由器进行工作,从而保持网络通信的连续性和可靠性。

主要作用
VRRP可以将两台或者多台物理路由器设备虚拟成一个虚拟路由,这个虚拟路由器通过虚拟IP(一个或者多个)对外提供服务。

企业双机热备方案

在这里插入图片描述
环境服务配置

两台Nginx服务器
Nginx 主服务器  192.168.66.100
Nginx 备服务器  192.168.66.101
Lvs 虚拟VIP   192.168.66.99
  • 1
  • 2
  • 3
  • 4

环境搭建

yum install -y  keepalived
  • 1

keepalived 常用命令

service keepalived start
service keepalived stop
  • 1
  • 2

启动报错:
Starting keepalived (via systemctl): Job for keepalived.service failed. See ‘systemctl status keepalived.service’ and ‘journalctl -xn’ for details.
解决办法
[root@edu-proxy-01 sbin]# cd /usr/sbin/
[root@edu-proxy-01 sbin]# rm -f keepalived
[root@edu-proxy-01 sbin]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

使用keepalived虚拟VIP
修改主keepalived信息

修改主Nginx服务器keepalived文件, /etc/keepalived/keepalived.conf

State 为MASTER

! Configuration File for keepalived


vrrp_script chk_nginx {
   script "/etc/keepalived/nginx_check.sh" #运行脚本,脚本内容下面有,就是起到一个nginx宕机以后,自动开启服务
   interval 2 #检测时间间隔
   weight -20 #如果条件成立的话,则权重 -20
}
# 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
   state MASTER #来决定主从
   interface ens33 # 绑定虚拟 IP 的网络接口,根据自己的机器填写
   virtual_router_id 121 # 虚拟路由的 ID 号, 两个节点设置必须一样
   mcast_src_ip 192.168.212.141 #填写本机ip
   priority 100 # 节点优先级,主要比从节点优先级高
   nopreempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
   advert_int 1 # 组播信息发送间隔,两个节点设置必须一样,默认 1s
   authentication {
     auth_type PASS
     auth_pass 1111
   }
   # 将 track_script 块加入 instance 配置块
   track_script {
     chk_nginx #执行 Nginx 监控的服务
   }


   virtual_ipaddress {
     192.168.212.110 # 虚拟ip,也就是解决写死程序的ip怎么能切换的ip,也可扩展,用途广泛。可配置多个。
   }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

修改从keepalived信息
修改主Nginx服务器keepalived文件, /etc/keepalived/keepalived.conf

State 为BACKUP

! Configuration File for keepalived


vrrp_script chk_nginx {
   script "/etc/keepalived/nginx_check.sh" #运行脚本,脚本内容下面有,就是起到一个nginx宕机以后,自动开启服务
   interval 2 #检测时间间隔
   weight -20 #如果条件成立的话,则权重 -20
}
# 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
   state BACKUP #来决定主从
   interface ens33 # 绑定虚拟 IP 的网络接口,根据自己的机器填写
   virtual_router_id 121 # 虚拟路由的 ID 号, 两个节点设置必须一样
   mcast_src_ip 192.168.212.141 #填写本机ip
   priority 100 # 节点优先级,主要比从节点优先级高
   nopreempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
   advert_int 1 # 组播信息发送间隔,两个节点设置必须一样,默认 1s
   authentication {
     auth_type PASS
     auth_pass 1111
   }
   # 将 track_script 块加入 instance 配置块
   track_script {
     chk_nginx #执行 Nginx 监控的服务
   }


   virtual_ipaddress {
     192.168.212.110 # 虚拟ip,也就是解决写死程序的ip怎么能切换的ip,也可扩展,用途广泛。可配置多个。
   }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

Nginx+keepalived实现高可用
写入nginx_check.sh脚本 /etc/keepalived/nginx_check.sh

#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
   /usr/local/nginx/sbin/nginx
   sleep 2
   if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
     killall keepalived
   fi
fi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

注意:
该脚本一定要授权。

chmod 777 nginx_check.sh3
  • 1

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/164528
推荐阅读
相关标签
  

闽ICP备14008679号