nginx 学习,详细总结

一 、nginx介绍

1.简介

Nginx 是高性能的 HTTP 和反向代理的web服务器,处理高并发能力是十分强大的,能经受高负 载的考验,有报告表明能支持高达 50,000 个并发连接数。

2.正向代理

用正向代理来进行上网等功能, 正向代理:如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访 问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。

通过代理服务器来访问真实服务器的过程 就叫正向代理。正向代理需要在客户端进行配置代理服务器

img

例如,我们用的vpn ,国内直接访问不了google , 通过vpn的服务器代理我们访问对应的站点,就可以访问

3.反向代理

反向代理 是代理服务器端, 当客户端发送请求时,请求先到代理服务器,代理服务器再把请求选择发送到目标服务器,代理服务器获取目标服务器的数据后,在返回给客户端.这个过程代理服务器代理的是真实服务器端,客户端对代理无感知,不知道请求的真实服务器的IP地址.

在不用反向代理的时候, 我们请求的是真实服务器,可以知道真实服务器的ip; 反向代理之后,请求的是代理服务器,代理服务器访问真实服务器,从而隐藏了真实服务器,而暴露的是代理服务器,代理服务器需要配置真实服务器

高并发必备,5种负载均衡的方法,全了解月薪得2万+以上了吧

3.1反向代理和正向代理的区别

  1. 正向代理,需要客户端配置代理服务器;反向代理,则需要在代理服务器配置真实服务器

  2. 正向代理是代理服务器代理客户端发送请求;反向代理是代理服务器端接受请求

  3. 因为正向代理 是代理客户端发送请求,所以对于服务端,客户端是隐藏的;

    反向代理是代理服务端接受请求,所以对于客户端,服务端是隐藏的

在完整的请求和响应的交互中,客户端的请求通过代理服务器,代理服务转发客户端请求到真实服务端,即正向代理;

服务端响应请求到代理服务器,代理服务器发送响应数据到客户端,即反向代理

img

4.负载均衡

4.1 负载均衡理解

  1. 负载均衡(Load Balance) , 其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

  2. 负载均衡的核心是:将负载进行平衡。

4.2 nginx的负载均衡

通过增加服务器的数量,将请求分发到各个服务器上,将原先的请求集中到单个服务器上的情况改为 将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡

Nginx服务器的负载均衡策略可以划分为两大类:即内置策略和扩展策略。内置策略主要包含轮询、加权轮询和IP hash三种;扩展策略主要通过第三方模块实现,种类比较丰富,常见的有url hash、fair等。

在传统的客户端和服务端的交互中, 客户端直接请求服务端。但是随着业务量越来越大,单一架构下服务器需要处理的也越来越多. 服务器的并发能力是有限的,例如tomcat的默认并发能力是150,当然是可以配置的.实际运用中,最大并发数与硬件性能和CPU数量都有很大关系的。更好的硬件,更多的处理器都会使Tomcat支持更多的并发。

针对以上情况的解决方案:

(1) 服务器进行硬件升级:采用高性能服务器替换现有低性能服务器。 该方案的弊端:

高成本:高性能服务器价格昂贵,需要高额成本投入,而原有低性能服务器被闲置,造成资 源浪费。

可扩展性差:每一次业务量的提升,都将导致再一次硬件升级的高额成本投入,性能再卓越 的设备也无法满足当前业务量的发展趋势。
(2) 组建服务器集群,利用负载均衡技术在服务器集群间进行业务均衡。

该方案的优势: 低成本

可扩展性:当业务量增长时,系统可通过增加服务器来满足需求,且不影响已有业务,不降低服务质量

高可靠性:单台服务器故障时,由负载均衡设备将后续业务转向其他服务器,不影响后续业 务提供,保证业务不中断。

点击查看图片来源

5.动静分离

动静分离是指在web服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口,分开在不同系统(服务器)访问的架构设计方法,进而提升整个服务访问性能和可维护性。

img

二、Nginx 的安装(Linux)

2.1 下载

nginx: 下载 (p2hp.com)

下载后上传,或者直接用 wget命令

2.2 安装

1、下载源代码包

[root@web03 ~]# wget https://nginx.org/download/nginx-1.20.1.tar.gz

2、解压

[root@web03 ~]# tar -xf nginx-1.20.1.tar.gz 

3、进入nginx目录并且设置系统配置参数

[root@web03 ~]#cd nginx-1.20.1
[root@web03 nginx-1.20.1]# ./configure --help

image-20220630160557751

[root@web03 nginx-1.20.1]# ./configure --with-http_ssl_module --with-http_v2_module --with-stream	

--with-http_ssl_module # 配置HTTPS时使用
--with-http_v2_module # 配置GOLANG语言时使用
--with-stream # 启用TCP/UDP代理服务

4.安装相关依赖

[root@web03 nginx-1.20.1]# yum install pcre pcre-devel -y

image-20220630160650843

[root@web03 nginx-1.20.1]# yum install openssl openssl-devel -y

image-20220630160706306

5.设置系统配置参数

./configure --with-http_ssl_module --with-http_v2_module --with-stream

img

6、开始编译

[root@web03 nginx-1.20.1]# make 

7、安装

[root@web03 nginx-1.20.1]# make install 

image-20220630161011820

8、 加入环境变量

现在在命令行输入nginx,报错

image-20220630161057441

需要加入环境变量:

[root@web03 nginx]# vi /etc/profile 

img

新增以下内容:

export PATH=$PATH:/usr/local/nginx/sbin			

使文件生效:

[root@web03 nginx]# source /etc/profile

现在在命令行输入nginx就行了

img

9、加入system系统管理(重要:一定要顶格写)

[root@web03 sbin]# vi /usr/lib/systemd/system/nginx.service

image-20220630161148111

输入以下内容:

[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop

[Install]
WantedBy=multi-user.target
				

10、重载system服务并启动

[root@web03 sbin]# systemctl daemon-reload
[root@web03 sbin]# systemctl start nginx

常见错误:

1、./configure: error: the HTTP rewrite module requires the PCRE library.

# 安装相关包
yum install pcre pcre-devel -y				

2、./configure: error: SSL modules require the OpenSSL library.

# 安装相关包
yum install openssl openssl-devel -y 

image-20220630161524506

2.3 防火墙问题

在 windows 系统中访问 linux 中 nginx,默认不能访问的,因为防火墙问题 (1)关闭防火墙 (2)开放访问的端口号,80 端口

查看开放的端口号

firewall-cmd --list-all 
设置开放的端口号

设置开放的端口号

firewall-cmd --add-service=http –permanent 
firewall-cmd --add-port=80/tcp --permanent 

重启防火墙

firewall-cmd –reload 

如果是购买的云服务器,还需要配置网络安全组

三、nginx常用命令及配置文件

3.1操作命令

使用nginx操作命令的前提是必须再nginx 的目录下

[root@VM-24-7-centos /]# cd  /usr/local/nginx/sbin

1.查看 nginx 的版本号

[root@VM-24-7-centos sbin]# ./nginx -v
nginx version: nginx/1.20.2

2.查看 nginx 启动状态

[root@VM-24-7-centos sbin]# ps -ef | grep nginx
nobody    7508 10737  0 4月30 ?       00:00:24 nginx: worker process
root     10737     1  0 4月30 ?       00:00:00 nginx: master process ./nginx
root     15912  8298  0 16:21 pts/0    00:00:00 grep --color=auto nginx

2.nginx 启动

[root@VM-24-7-centos sbin]# ./nginx

3.关闭 nginx

[root@VM-24-7-centos sbin]# ./nginx -s stop

4.重新加载 nginx,改完配置文件,重新加载配置文件

[root@VM-24-7-centos sbin]# ./nginx -s reload

3.2配置文件

nginx 安装目录下,其默认的配置文件都放在这个目录的 conf 目录下,而主配置文件
nginx.conf 也在其中,后续对 nginx 的使用基本上都是对此配置文件进行相应的修改

image-20220630165740709

(1)nginx配置文件

http {
    include       mime.types;    # nginx支持的媒体文件类型。相对路径为同目录conf下的其他文件
    default_type  application/octet-stream;      # 默认的媒体类型

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '   # 访问日志的格式
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;   # 启用sendfile传输模式,此模式是"零拷贝"
    #tcp_nopush     on;   # 只在sendfile on时有效。让数据包挤满到一定程度才发送出去,挤满之前被阻塞

    #keepalive_timeout  0;   # keepalive的超时时间
    keepalive_timeout  65;

    #gzip  on;               # 是否启用gzip压缩响应报文

    server {                    # 定义虚拟主机
        listen       80;        # 定义监听套接字
        server_name  localhost; # 定义主机名加域名,即网站地址

        #charset koi8-r;        # 默认字符集

        #access_log  logs/host.access.log  main;         # 访问日志路径

        location / {                        # location容器,即URI的根
            root   html;                    # 站点根目录,即DocumentRoot,相对路径时为<prefix>/html
            index  index.html index.htm;    # 站点主页文件
        }

        #error_page  404    /404.html;      # 出现404 page not fount错误时,使用/404.html页响应客户端

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;      # 出现50x错误时,使用/50x.html页返回给客户端
        location = /50x.html {                        # 定义手动输入包含/50x.html时的location
            root   html;
        }

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
}

第一部分:全局块

worker_processes  1;#nginx进程,一般设置为和cpu核数一样

从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。

比如上面第一行配置的:这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约

第二部分:events 块

events {
    worker_connections  1024;
}

比如上面的配置:

上述例子就表示每个 work process 支持的最大连接数为 1024.这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。

events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。

第三部分:http 块

http {
    include       mime.types;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        location = /50x.html {
            root   html;
        }
    }
}

这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。

需要注意的是:http 块也可以包括 http 全局块server 块

①http 全局块

http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。

②server 块

这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。

每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。

而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。

1、全局 server 块

最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。

2、location 块

一个 server 块可以配置多个 location 块。

这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称

(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓

存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

四、nginx配置 反向代理和负载均衡

应用nginx配置

  1. /nginx -s reload

  2. ./nginx -s stop ./nginx

1.反向代理

1.1实现一

通过nginx配置后,通过80端口访问nginx ,nginx 转发到tomcat的8080端口

image-20220701010345081

在 nginx.conf配置文件中,加入如下配置

proxy_pass: URL; 该指令就是同来设置 真实服务器的地址,可以是主机名称,也可以是IP地址加端口号

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  1999.life;
        location / {
        	proxy_pass http://127.0.0.1:8080;
            root   html;
            index  index.html index.htm;
        }
        location = /50x.html {
            root   html;
        }
    }
}

上述配置,就是当我们访问域名1999.life的80端口时,由于nginx监听了80端口, 会转发到http://127.0.0.1:8080根目录

1.1实现二

实现效果:使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中 nginx 监听端口为 9001,

访问 http://127.0.0.1:9001/edu/ 直接跳转到 127.0.0.1:8081

访问 http://127.0.0.1:9001/vod/ 直接跳转到 127.0.0.1:8082

第一步,准备两个 tomcat,一个 8001 端口,一个 8002 端口,并准备好测试的页面 第二步,修改 nginx 的配置文件 在 http 块中添加 server{}

    server {
        listen       8800;
        #listen       101.43.181.85;
        server_name  101.43.181.85;

        location ~ /vod/ {
            proxy_pass http://127.0.0.1:8081;
            root   html;
            index  index.html index.htm;
        }
        location ~ /edu/ {
            proxy_pass http://127.0.0.1:8080;
            root   html;
            index  index.html index.htm;
        }

    }

上述配置 是nginx监听 8800端口, 当请求路径包含 vod 时 ,代理8081端口;包含edu时,代理8080端口。~ 表示后面是正则表达式的形式

2.负载均衡

2.1 轮询算法(默认)

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

我在两个tomcat 中配置了 , 相同的路径和资源.

upstream myserver{
server 101.43.181.85:8080;
server 101.43.181.85:8081;
}

    server {
        listen       8801;
        server_name  101.43.181.85;
        location / {
            proxy_pass http://myserver;
            root   html;
            index  index.html index.htm;
        }
    }

image-20220701114943035

上述配置, 监听了8801 端口, 配置文件中 upstream myserver 配置在 http全局块中,在location 中配置proxy_pass,并指向 upstream myserver.

myserve 是定义组名.location中将请求转发到 组名为myserve 的组

2.2 加权轮询(权重)算法(weight)

upstream myserver{
server 101.43.181.85:8080 weight=5;
server 101.43.181.85:8081 weight=10;
}

    server {
        listen       8801;
        server_name  101.43.181.85;
        location / {
            proxy_pass http://myserver;
            root   html;
            index  index.html index.htm;
        }
    }

上述配置中, 和默认轮询的写法不同的就是 , 在组中,url后面多了 weight, 配置了权重.

当为服务器指定权重参数时, 权重将作为负载均衡决策的一部分。

image-20220701115458453

2.3 ip_hash

2.3.1 ip_hash介绍

  • ip_hash是根据用户请求过来的ip,然后映射成hash值,然后分配到一个特定的服务器里面;
  • 使用ip_hash这种负载均衡以后,可以保证用户的每一次会话都只会发送到同一台特定的Tomcat里面,它的session不会跨到其他的tomcat里面去的;

在这里插入图片描述

  • 首先通过将ip地址映射成一个hash值,然后将hash值对Tomcat的数量3取模,得到Tomcat的索引0、1、2;

  • 比如:5%3=2,则把这个请求发送到Tomcat3服务器,以此类推;

  • 这样一来,只要用户的IP不发生改变,当前用户的会话就能够一直保持;

    在这里插入图片描述

nginx的ip_hash算法是取ip地址的前三段数字进行hash映射,如果只有最后一段不一样,也会发送到同一个Tomcat里面

2.3.2 ip_hash 配置

    upstream myserver{
        ip_hash;
        server 101.43.181.85:8080 weight=5;
        server 101.43.181.85:8081 weight=10;
    }

    server {
        listen       8801;
        server_name  101.43.181.85;
        location / {
            proxy_pass http://myserver;
            root   html;
            index  index.html index.htm;
        }
    }

在nginx里面使用ip_hash,直接添加ip_hash关键字即可,后续同一ip的访问将只会请求同一个服务器。

2.3.3 注意事项

  • 一旦使用了ip_hash,当我们需要移除一台服务器的时候,不能直接删除这个配置项,而是需要在这台服务器配置后面加上关键字down,表示不可用;

  • upstream myserver { 
    	ip_hash; 
    	server 192.168.11.73:8080; 
    	server 192.168.11.74:8080 down; 
    	server 192.168.11.75:8080; 
    }
    
  • 因为如果直接移除配置项,会导致hash算法发生更改,后续所有的请求都会发生混乱;

2.4 least_conn

按节点连接数分配,把请求优先分配给连接数少的节点。该策略主要为了解决,各个节点请求处理时间长短不一造成某些节点超负荷的情况。

按照nginx文档的说法,请求将被传递给当前拥有最少活跃连接的server,同时考虑权重weight的因素。

upstream myserver{
    least_conn;
    server 192.168.9.134:8081;
    server 192.168.9.134:8082;
}

在nginx里面使用least_conn,直接添加least_conn关键字即可。

2.5 fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的将会被优先分配

需要安装 nginx-upstream-fair-master 第三方模块
下载地址:https://github.com/gnosek/nginx-upstream-fair

重新检测nginx编译环境
编译时需要指定添加模块的绝对路径

 [root@localhost nginx-1.18.0]# ./configure --with-http_ssl_module --add-module=/root/nginx-upstream-fair-master

若出现以下报错

error: ‘ngx_http_upstream_srv_conf_t’ has no member named ‘default_port’

解决方法
修改NGINX下的ngx_http_upstream.h文件

[root@localhost ~]# vim nginx-1.18.0/src/http/ngx_http_upstream.h

在ngx_http_upstream_srv_conf_s结构添加一行 in_port_t default_port

image-20220701151232093

然后重新编译安装就可以了

修改NGINX的配置文件,指定算法为fair算法

upstream myserver{     
    server 192.168.9.134:8081;
    server 192.168.9.134:8082;
    fail;
}

五、nginx 动静分离

1.基本介绍

  • 动静分离指的是将动态请求和静态请求分隔开,然后分别路由到相应的后端服务器。
  • 通常用户的请求中,一部分需要后台程序处理,例如查询数据库或者进行一些数据运算,这类请求我们称之为动态请求
  • 还有一部分不需要后台程序处理,如请求 css、html、js、图片等静态资源,这类请求我们称之为静态请求
  • Nginx 实现动静分离的基础是它可以根据配置对不同的请求做不同的转发,动静分离有利于提高整个服务器系统的性能。

image-20220701153926482

Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种,

一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;

另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码 200。点击查看图片来源

2.配置

image-20220701160313428

我准备了两个静态资源

/data/test/www/a.html

/data/test/image/001.jpg

    server {
        listen       8802;
        server_name  101.43.181.85;
        location /www/ {
            root   /data/test/;
            index  index.html index.htm;
        }
        location /image/ {
        root /data/test/;
        autoindex on;
        }
    }

上述配置location 部分, 当我们路径为www时, 会匹配到 对应的location,到/data/test/www 路径下,寻找对应资源;

当我们路径为image时, 匹配到对应的location,到/data/test/image路径下,寻找对应资源

image-20220701160845870

image-20220701160909326

autoindex on 的作用是列出 文件夹下的内容

image-20220701161344664

六、nginx高可用

1.什么是高可用?

高可用(High availability,缩写为 HA),是指系统无中断的执行其功能的能力,代表系统的可用性程度。高可用的主要目的就是为了保障“业务的连续性”,即在用户的眼里,业务永远都是正常对外提供服务的。它通常是指,通过设计减少系统不能提供服务的时间。

假设系统一直能够提供服务,我们说系统的可用性是100%。如果系统每运行100个时间单位,会有1个时间单位无法提供服务,我们说系统的可用性是99%。很多公司的高可用目标是4个9,也就是99.99%,这就意味着,系统的年停机时间为8.76个小时。

常见的互联网分层架构

img

常见互联网分布式架构如上,分为:

(1)客户端层:典型调用方是浏览器browser或者手机应用APP

(2)反向代理层:系统入口,反向代理

(3)站点应用层:实现核心应用逻辑,返回html或者json

(4)服务层:如果实现了服务化,就有这一层

(5)数据-缓存层:缓存加速访问存储

(6)数据-数据库层:数据库固化数据存储

整个系统的高可用,又是通过每一层的冗余+自动故障转移来综合实现的。

2.nginx 高可用

nginx作为负载均衡器,所有请求都到了nginx,可见nginx处于非常重点的位置,如果nginx服务器宕机后端web服务将无法提供服务,影响严重。

为了屏蔽负载均衡服务器的宕机,需要建立一个备份机。主服务器和备份机上都运行高可用(High Availability)监控程序,通过传送诸如“I am alive”这样的信息来监控对方的运行状况。当备份机不能在一定的时间内收到这样的信息时,它就接管主服务器的服务IP并继续提供负载均衡服务;当备份管理器又从主管理器收到“I am alive”这样的信息时,它就释放服务IP地址,这样的主服务器就开始再次提供负载均衡服务。

2.1keepalived+nginx实现主备

2.1.1 什么是keepalived

keepalived 是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。

Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。

2.1.2 keepalived工作原理

keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。

虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(VIP = Virtual IP Address,虚拟IP地址,该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到VRRP包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。

keepalived主要有三个模块,分别是core、check和VRRP。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。VRRP模块是来实现VRRP协议的。

2.1.3 keepalived+nginx实现主备过程

初始状态Nginx负载均衡高可用指的是什么意思

主机宕机Nginx负载均衡高可用指的是什么意思

主机恢复

Nginx负载均衡高可用指的是什么意思

基础环境准备

(1)安装Nginx:
# 添加源
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

# 安装Nginx
sudo yum install -y nginx

# 启动Nginx
sudo systemctl start nginx.service

# 浏览器访问测试
http://192.168.253.11/
http://192.168.253.12/
(2)安装KeepAlived可使用yum直接安装:
yum -y install keepalived

查看KeepAlived配置文件:

cat /etc/keepalived/keepalived.conf

接下来就是要对该配置文件进行修改,该配置文件在/etc/keepalived/路径下。在默认的keepalive.conf里面还有 virtual_server,real_server 这样的配置,它是为lvs准备的。

(3)关闭防火墙(默认关闭)
(4)关闭selinux(如果不关闭,KeepAlived不生效)

临时关闭

[root@localhost ~]# getenforce Enforcing
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
Permissive

永久关闭:

[root@localhost ~]# vim /etc/sysconfig/selinux
SELINUX=enforcing 改为 SELINUX=disabled
重启服务reboot

配置主备模式

(1) 修改主配置文件:

! Configuration File for keepalived

global_defs {
     notification_email {
          acassen@firewall.loc
          failover@firewall.loc
          sysadmin@firewall.loc
     }
     
     notification_email_from Alexandre.Cassen@firewall.loc
     smtp_server 127.0.0.1
     smtp_connect_timeout 30
     router_id master11
}

# nginx挂了,实现vip自动漂移,使用如下脚本控制     
vrrp_script check_nginx {
      script "/usr/local/nginx/nginx_check.sh"
      interval 2  # 机器宕机执行的次数
      weight 2
}

# 当前实例配置
vrrp_instance VI_1 {
     state MASTER   # 主机
     interface ens33  # 绑定的网卡
     virtual_router_id 51   # 组id,需要一致
     priority 100  # 优先级
     advert_int 1  # 检查间隔,默认1s
     
     # 调用nginx挂了之后进行vip漂移的函数  
     track_script {
       	check_nginx
     }
     
     authentication {
       	auth_type PASS
       	auth_pass 1111
     }
     
     # 配置vip
     virtual_ipaddress {
        192.168.253.50/24 dev ens33 label ens33:1 scope global
 	 }
}

在默认的keepalive.conf里面还有 virtual_server,real_server 这样的配置,我们这用不到,它是为lvs准备的。

(2) 脚本文件

/usr/local/nginx/nginx_check.sh :

# 在/usr/local下新建目录nginx
mkdir nginx
# 新建文件
touch nginx_check.sh
# 编辑内容
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`   #查看nginx进程是否存在  
#if [ $A -eq 0 ];then              
  /usr/sbin/nginx         #重启nginx
  if [ $A -eq 0 ];then   #nginx重启失败
    exit 1 # keepalived执行脚本,返回非0结果,ip漂移
  else
    exit 0 # keepalived执行脚本,返回0,ip不漂移
  fi
#else
#  exit 0
#fi

需要给nginx_check.sh文件加可执行权限

chmod +x nginx_check.sh

(3)修改从机keepalived.conf配置文件

! Configuration File for keepalived
global_defs {
     notification_email {
          acassen@firewall.loc
          failover@firewall.loc
          sysadmin@firewall.loc
     }
    
     notification_email_from Alexandre.Cassen@firewall.loc
     smtp_server 127.0.0.1
     smtp_connect_timeout 30
     router_id backup
}

vrrp_script check_nginx {
     script "/usr/local/nginx/nginx_check.sh"
     interval 2
     weight 2
}

vrrp_instance VI_1 {
     state BACKUP  # 从机
     interface ens33
     virtual_router_id 51  # 组id,需要一致
     priority 99   # 优先级
     advert_int 1
        
     # 调用nginx挂了之后进行vip漂移的函数    
     track_script {
       	check_nginx
     }
     
     authentication {
       	auth_type PASS
       	auth_pass 1111
     }
    
     # 配置vip
     virtual_ipaddress {
        192.168.253.50/24 dev eth0 label ens33:1 scope global
     }
}

同样需要在/usr/local/nginx/路径下放上nginx_check.sh脚本文件。

(4) 启动nginx、keepalived

#主从启动
sudo systemctl restart nginx.service
#主从启动
systemctl start keepalived

(5) 访问测试

为效果明显,可以修改Nginx首页,将主从IP地址放置首页以便区分。

访问http://192.168.253.50 or curl 192.168.253.50

查看Nginx日志

cd  /var/log/nginx/
cat  access.log

查看主服务器keepalived日志:

Keepalived默认所有的日志都是写入到/var/log/message ,
你可以使用命令 tail -f /var/log/messages|grep Keepalived 进行查看

查看ens33网卡信息:

ip addr | grep ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc
pfifo_fast state UNKNOWN group default qlen 1000
 inet 192.168.253.11/24 brd 192.168.253.255 scope
global noprefixroute ens33 
 inet 192.168.253.50/24 scope global secondary ens33:1
#VIP已漂移到主机,vip只能选择一个机器进行绑定

(6)停掉主服务器的nginx

通过浏览器访问:http://192.168.253.50
查看主机KeepAlived日志:

tail -f /var/log/messages|grep Keepalived
# 强制停止
pkill -9 nginx

# 查看Nginx进程
ps -ef | grep nginx

# 等待几秒后再次查看Nginx进程,发现已经通过检查脚本自启
# 因为在keepalived脚本中,进行了nginx重启操作

则会执行脚本nginx_check.sh进行nginx启动!

如果master上的nginx服务挂了,则nginx会自动重启,重启失败后会自动关闭keepalived,这样vip资源也会转移到slave上。
master和slave两边都开启nginx服务,无论master还是slave,当其中的一个keepalived服务停止后,vip都会漂移到keepalived服务还在的节点上;
如果要想使nginx服务挂了,vip也漂移到另一个节点,则必须用脚本或者在配置文件里面用shell命令来控制。(nginx服务宕停后会自动启动,启动失败后会会致使vip资源漂移到另一台机器上)

posted @ 2022-07-04 10:15  且吃茶去  阅读(1184)  评论(0编辑  收藏  举报