Nginx运维知识基础详解

一. nginx简介

1. nginx介绍

nginx是一个HTTP和反向代理服务器,邮件代理服务器,通用的TCP/UDP代理服务器。

反向代理服务器: 作用就是负载均衡

2. 编译安装

#!/bin/bash

#新建文件夹存放nginx源码包
mkdir -p /nginx
cd /nginx

# 下载nginx压缩包
curl -O http://nginx.org/download/nginx-1.25.2.tar.gz
# 或者用wget
#wget http://nginx.org/download/nginx-1.25.2.tar.gz
# 解压
tar xf nginx-1.25.2.tar.gz
# 进入文件夹
cd nginx-1.25.2

# 新建用户,用于启动nginx进程,名字自拟
useradd -s /sbin/nologin liaobo

# 安装依赖包
# ssh相关、gcc为编译需要、pcre正则相关、make编译相关
yum install -y openssl openssl-devel gcc pcre pcre-devel automake make net-tools vim

# configure是一个配置的脚本文件,会根据指定的配置生成一个Makefile文件,这个文件会影响后面make命令的编译,相当于图纸
# configure可配置参数可以参考官方文档:http://nginx.org/en/docs/configure.html
# 常用选项:
# --with-*:开启某个功能,默认不安装	--without-*:禁用某个功能,默认安装
# --prefix=path:指定路径			--conf-path=path:指定配置文件路径,不指定会放到prefix路径下
# --user=name:指定启动nginx worker进程的用户
# --with-http_ssl_moudle 开启https的功能,下载ssl来进行公钥和私钥的认证
# --without-http——memcached_moudle 禁用http_memcached
# --with-http_realip_module 启用realip功能,让后端知道通过代理访问的用户的ip
# --with-http_v2_module:对http2.0版本的支持
# --with-threads:开启线程池功能		--with-http_stub_status_moudle:开启nginx状态统计功能,可以知道多少访问
# --with-stream 支持tcp/udp反向代理,即4层负载均衡
./configure --prefix=/usr/local/nginx --user=liaobo --with-http_ssl_module --with-http_realip_module --with-http_v2_module --with-threads --with-http_stub_status_module --with-stream

# 编译
# make是按照Makefile的配置去编译程序为二进制文件,二进制文件就是执行可以运行的程序
# -j:指定编译进程数,多点速度快些,可以使用top后按1查看虚拟机配有几个核心
make -j 2 
# 将编译好的二进制文件复制到指定安装路径目录下
make install 

# 启动nginx
/usr/local/nginx/sbin/nginx

# 修改PATH变量
PATH=$PATH:/usr/local/nginx/sbin
echo "PATH=$PATH" >>/root/.bashrc

# 设置nginx的开机启动,rc.local是指向rc.d/rc.local的链接,后者需要拥有执行权限才能开机自启
echo "/usr/local/nginx/sbin/nginx" >>/etc/rc.local
chmod +x /etc/rc.d/rc.local

# selinux和firewalld防火墙都关闭
# selinux临时和永久关闭
setenforce 0
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config

# 防火墙临时和永久关闭
service firewalld stop
systemctl disable firewalld

3. 文件和日志

3.1 四个目录

html 目录,存放网站的网页文件
conf 存放nginx的配置文件
logs 存放日志文件
sbin 存放nginx的可执行文件

[root@nginx nginx-1.25.2]# cd /usr/local/nginx
[root@nginx nginx]# ls
conf  html  logs  sbin

3.2 日志文件

access.log 正常的访问网站的日志
error.log 访问错误的日志

[root@sanchuang logs]# pwd
/usr/local/nginx/logs
[root@sanchuang logs]# ls
access.log  error.log  nginx.pid

日志的好处:
1.排除故障: 根据日志的记录
2.进行数据分析

4. 相关操作

  • 停止nginx服务

    nginx -s stop
    
  • 重新启动nginx配置文件,不需要停止业务

    nginx -s reload
    
  • 检测配置文件是否有语法错误

    nginx -t #检测配置文件是否有语法错误,然后退出
    
  • 重启Nginx

    nginx -s reopen  #重启Nginx
    
  • nginx中master和worker的关系

    master是父进程管理worker进程,worker对外提供服务,当worker进程死掉会重启一个

5.nginx模块

ngx_http_core_module 核心模块
ngx_http_access_module deny和allow
ngx_http_autoindex_module
ngx_http_rewrite_module rewrite
ngx_http_referer_module
ngx_http_limit_conn_module
ngx_http_limit_req_module
ngx_http_realip_module
ngx_http_geoip_module
ngx_http_auth_basic_module 认证
ngx_http_stub_status_module 状态统计
ngx_http_log_module 日志 access.log和error.log
ngx_http_upstream_module 7层的负载均衡
ngx_http_proxy_module 修改http头部信息
ngx_stream_core_module 4层负载均衡

二. 主配置文件

1. nginx.conf

  • 基本内容

    [root@sanchuang conf]# cat nginx.conf|egrep -v "^$|#"
    user  tiankai;  #启动nginx的用户,默认nobody
    worker_processes  4;  #启动4个worker进程
    error_log  logs/error.log  notice; #指定错误日志存放的路径,记录notice级别以上的日志
    pid        logs/nginx.pid; #记录master进程的pid号
    
    events {
        worker_connections  2048; #一个worker进程允许2048个用户访问
    }
    
    http {
        include       mime.types;
        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;
        keepalive_timeout  65; #断开连接时间
        server {
            listen       80; #监听80端口
            server_name  www.feng.com; #为www.feng.com域名提供服务
            access_log  logs/feng.com.access.log  main; #访问日志的路径和格式
            #定义的路由
            location / {
                root   html/feng; #网站的根目录在html/feng文件夹,在nginx的安装路径下
                index  shouye.html index.html index.htm; #定义访问的时候,第1个被访问的页面,最左边的优先级最高
            }
            error_page  404              /404.html; #错误页面
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
    }
    
  • 访问日志的格式log_format main

    • $remote_add 远程服务器的ip,本质上是nginx内部调用某个变量的值

      [$time_local] 时间

      “$request” 请求的网址

    • $status 响应的状态码 200 404

      $body_bytes_sent 发送的数据

      $http_referer" 从哪个网址引流过来的,从哪个网址跳转过来的 reference 参考/引用

    • $http_user_agent" 用户使用的浏览器

2. 相关功能

2.1 状态统计

  • 打开状态统计

    #nginx.conf的http中server下
    location = /status {
       stub_status on; #打开状态统计功能
       access_log off; #访问状态统计时不记录日志中
       }
    
  • 状态统计的相关功能

    Active connections: 2 
    server accepts handled requests
     61 61 87 
    Reading: 0 Writing: 1 Waiting: 1 
    

    提供以下状态信息:

    Active connections 当前活动的客户端连接数,包括Waiting连接数。
    accepts 接受的客户端连接总数。
    handled 已处理的连接总数->参数值与accepts相同,除非达到某些资源限制(例如, worker_connections限制)。
    requests 客户端请求总数。
    Reading nginx正在读取请求标头的当前连接数。
    Writing nginx正在将响应写回到客户端的当前连接数。
    Waiting 当前等待请求的空闲客户端连接数 --》已经连接但未发起下一次连接

  • 认证功能

    #添加状态信息统计的功能 
    location = /status {
            auth_basic "sanchuang";  #标题名字,可以自定义
            auth_basic_user_file htpasswd; #存放用户名和密码的文件
            stub_status;
            }
    #安装httpd-tools软件得到htpasswd命令,然后去加密密码
    [root@siyuxiang conf]# yum install httpd-tools -y
    [root@sc-nginx conf]# htpasswd -c /usr/local/nginx8/conf/htpasswd cali
    
  • deny和allow指令

    #添加状态信息统计的功能
    location = /sc_status {
            auth_basic "sanchuang";
            auth_basic_user_file htpasswd;
            allow 192.168.0.16;
            allow 192.168.0.24;
            deny all;
            stub_status on;
            }
    
  • 独立访客(UV) 和 综合浏览量(PV)

    独立访客(UV):指一定时间范围内相同访客多次访问网站,只计算为1个独立访客。

    综合浏览量(PV):指一定时间范围内页面浏览量或点击量,用户每次刷新即被计算一次。

2.2 利用nginx做网站提供下载功能

2.3 隐藏nginx的版本

加在http下

server_tokens off;

2.4.限制浏览器和ip

2.5.根据ip地址地区限制geoIP

2.6.nginx的限速和限制并发连接数、限制请求数

  • 限速:限制网速

    server {
        ...
    	limit_rate_after 10k; #限制下载速度达到100k每秒的时候,进行限制
    	limit_rate       1k; #限制每秒10k的速度
    }
    
  • 限制并发连接数

    limit_conn_zone $binary_remote_addr zone=perip:10m;
    limit_conn_zone $server_name zone=perserver:10m;
    
    server {
        ...
        limit_conn perip 10;   限制一个ip地址同时只能发起10个连接
        limit_conn perserver 100;   限制一个虚拟主机同时只能发起多少个并发连接
    }
    
  • 限制请求数

    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;#每秒产生一个可以访问的请求
    server {
        ...
        limit_req zone=one burst=5 ;#最多同时一个ip发起次请求 
    }
    

2.7 location 对url的匹配

  • uri和url的区别

    url是统一资源定位符号: 不同的资源有不同的路径,我们可以通过这个路径找到 --》绝对路径
    uri是统一资源标识符: 是一个概念,不同的资源有不同的标识 --》相对路径

  • 解析过程

    Nginx运维知识基础详解_第1张图片

  • 匹配顺序

    首先匹配 =,其次匹配^~,其次是按文件中顺序的正则匹配,最后是交给 /通用匹配

    Nginx运维知识基础详解_第2张图片

  • 中台转发

    根据不同的url做转发:
            location /login{
                    proxy_pass http://192.168.0.161;
            }
            location /pic{
                    proxy_pass http://192.168.0.162;
            }
            location /music{
                    proxy_pass http://192.168.0.163;
            }
    

2.8.rewrite功能

3. IO多路复用

IO 多路复用是一种同步 IO 模型,实现一个线程可以监视多个文件句柄。一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作;没有文件句柄就绪时会阻塞应用程序,交出 cpu。IO 是指网络 IO,多路指多个TCP连接(即 socket 或者 channel),复用指复用一个或几个线程,多路复用就是多个请求复用了一个进程/线程。

IO 多路复用就是在一个进程里面监视多个 socket 连接(文件描述符),在获取事件时,先把所有连接传给内核,再由内核返回产生了事件的连接,然后在用户态中再处理这些连接对应的请求,select / poll / epoll 就是三个内核提供给用户态的多路复用调用接口。

3.1 select机制

select 实现多路复用的方式是,将已连接的 Socket 都放到一个文件描述符集合里,然后调用 select 函数将文件描述符集合拷贝到内核里,内核通过遍历文件描述符集合的方式,来检查是否有网络事件产生,如果有,就将此 socket 标记为可读或可写,然后再把整个文件描述符集合拷贝回用户态里,用户态还需要再次通过遍历的方式找到可读或可写的Socket,然后再对其进行处理。

所以使用 select 这种方式,需要拷贝和遍历文件描述符集合 2 次,且 select 使用固定长度的 BitsMap 表示文件描述符集合,所以它支持的文件描述符个数也有限制。

3.2 poll机制

poll 使用链表结构来存储所有的文件描述符集合,它突破了 select 文件描述符的个数限制,但是它和 select 并没有本质的区别,同样需要两次拷贝和两次遍历文件描述符集合,来找到可读或可写的 socket,时间复杂度为 O(n)。

所以当 socket 集合越大,select 和 poll 在遍历和拷贝的时候带来的开销也很大。

3.3 epoll机制

epoll 在内核里维护了红黑树的数据结构,用于保存所有待检测的 socket,红黑树是一种高效的数据结构,增删改的复杂度一般为 O(logn),所以它不需要像 select / poll 那样每次都传入整个 socket 集合,从而减少了内核和用户空间大量的数据拷贝操作。

epoll 还使用了事件驱动机制,它在内核里维护了一个链表专门用来记录就绪事件,当某个 socket 有事件发生时,便可通过回调函数加入到该链表中,所以内核态只会给用户态返回有事件发生的文件描述符集合,而不需要像 select / poll 那样拷贝整个文件描述符集合再遍历,从而大大提高了检测效率。

另外,epoll 支持边缘触发和水平触发两种方式,而 select / poll 只支持水平触发,一般而言边缘触发的效率更高。

三. 负载均衡

1.调度算法

  • 轮询 -->默认

    对应用服务器的请求以循环方式分发

  • 最小连接数

    将下一个请求分配给具有最少活动连接数的服务器

    负载均衡的配置
    http {
    	#....省略的配置
     upstream  scapp1{
     		least_conn;
            server  192.168.2.120;
        }   
    	#....省略的配置
    }
    
  • ip-hash

    哈希函数基于客户端的IP地址来确定下一个请求选择哪个服务器。

    可以保持会话的一致性,总是让客户机访问到相同的后端服务器,因为它是根据客户机的ip地址进行选择的,相同的ip地址总是访问第一次的哪个后端服务器

    负载均衡的配置
    http {
     ...
     upstream  scapp1{
     		ip_hash;
            server  192.168.2.120;
        }   
     ...
    }
    
    

2.负载均衡配置

7层负载均衡:在应用层完成所有的工作,根据http协议来做负载均衡
4层负载均衡:在传输层完成所有的工作,是根据端口号来区分不同的业务的

区别:

  • 服务数量:4层负载均衡支持的服务数量多,可以支持非http服务;而7层负载均衡只能对http协议做负载均衡
    常用服务对应的端口:mysql 3306 sshd 22 http 80 https 443 dns 53
  • 效率:4层负载均衡的效率要比7层要高,因为做得事情要少

2.1 七层负载均衡

七层负载均衡的配置
http {
 ...
 upstream  app{
        server  192.168.98.135;
        server  192.168.98.140;
        server  192.168.98.142;
    }   
    server {
        listen       80;
        location / {
                proxy_pass http://app;
        }
    }
}

2.2 四层负载均衡

stream {
    upstream dns_servers {
        least_conn;
        server 192.168.136.130:53;
        server 192.168.136.131:53;
        server 192.168.136.132:53;
    }

    upstream web_servers {
        server 192.168.227.147:80;
        server 192.168.227.146:80;
        server 192.168.227.129:80;
    }

    server {
        listen     53 udp;
        proxy_pass dns_servers;
    }
    
    server {
        listen   80  ;
        proxy_pass web_servers;
    }
}

events {
    worker_connections  1024;
}

worker_processes  2;

3. 健康检查

3.1 主动检查

Active Health Checks 主动的健康检查,LB每隔一段时间就去检查下后端的real server的状态,不管是否有client发请求过来,都会去检查。

需要安装nginx plus

3.2 被动检查

Passive Health Checks 被动的健康检查: 当client发请求给LB,然后LB再去转发请求给后端的real server ,这个时候如果后端的服务器出现问题,LB就发现了。被客户机逼着去检查后端的real server

  • fail_timeout –设置必须多次尝试失败才能将服务器标记为不可用的时间,以及将服务器标记为不可用的时间(默认为10秒)。
  • max_fails –设置在fail_timeout服务器标记为不可用的时间内必须发生的失败尝试次数(默认为1次尝试)。
  • backup 备份:当其他的服务器都不提供服务的时候,再启用这台服务器提供服务 --》备胎
  • slow_start 慢启动
  • down 将上游的服务器标识为不可用,不会再发送任何的请求给这台服务器
...
upstream backend {
    server backend1.com slow_start=30s;
    server backend2.com max_fails=3 fail_timeout=30s;
    server backend3.com backup;
}
...

4.realip问题

4.1 问题

backend server是如何知道前端的client的ip地址的?

应用层http协议添加新的ip存储字段 x_real_ip -->负载均衡器

4.2 解决方法

  • 步骤1:在负载均衡器上修改http请求报文头部字段,添加一个X_REAL_IP字段

      server {
            listen       80;
            server_name  www.sc.com;
            location / {
                    proxy_pass http://myweb1;
                    proxy_set_header X-Real-IP $remote_addr;
    
               }
        }
    

    将nginx内部的remote_addr这个变量的值,赋值给X-Real-IP这个变量,X-Real-IP这个变量会在http协议的请求报文里添加一个X-Real-IP的字段,后端的real server 服务器上的nginx就可以读取这个字段的值

    X-Real-IP 这个变量名可以自己定义,随便取名,后面引用的时候,不区分大小写

  • 步骤2

    • 不使用realip模块:在后端real server上使用这个x_real_ip这个字段

      http {
          include       mime.types;
          default_type  application/octet-stream;
          #增加$HTTP_X_REAL_IP字段
          log_format  main  '$remote_addr -  $HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
                            '$status $body_bytes_sent "$http_referer" '
                            '"$http_user_agent" "$http_x_forwarded_for"';
          #使用
      	access_log  logs/access.log  main;
      	...
      }
      

      在主配置文件nginx.conf里的日志部分调用这个变量,获取x_real_ip的值

    • 使用realip模块:在后端real server上使用set_real_ip_from 192.168.0.160

      server{
           listen 80;
           set_real_ip_from 192.168.0.160;
      }
      

      set_real_ip_from 192.168.0.160; 告诉本机的nginx 192.168.0.160 是负载均衡器,不是真正的client

5.压力测试ab

  • 安装

    [root@scmaster ~]# yum  install httpd-tools -y
    
  • 命令

    ab -n 100 -c 10 http://test.com/
    其中-n表示请求数,-c表示并发数
    
    [root@scmaster ~]# ab -c 1000  -n 20000  http://192.168.227.144/
    ...
    Requests per second:    2484.72 [#/sec] (mean)   目前测试的最大并发数(吞吐量)
    Time per request:       402.460 [ms] (mean)  #用户平均请求等待时间
    Time per request:       0.402 [ms] (mean, across all concurrent requests) #服务器平均请求处理时间
    ...
    

    Requests per second: 2484.72 [#/sec] (mean)
    //吞吐率,相当于 LR 中的每秒事务数,后面括号中的 mean 表示这是一个平均值
    Time per request: 402.460 [ms] (mean)
    //用户平均请求等待时间,相当于 LR 中的平均事务响应时间,后面括号中的 mean 表示这是一个平均值
    Time per request: 0.402 [ms] (mean, across all concurrent requests)
    //服务器平均请求处理时间

6.优化

  • 如何提升负载均衡的并发数量

    1.增加负载均衡的集群数量和后端服务器的数量
    2.软件层面的优化: linux 内核参数调优,nginx的参数调优等优化
    worker_connections 2048;
    worker_processes 2;

    ​ [root@lb-1 conf]# ulimit -a
    ​ [root@lb-1 conf]# ulimit -n 1000000 允许一个进程可以打开的文件数量

四.NFS

1. NFS

  • NFS:网络文件系统

    NFS(Network File System)即网络文件系统,又称为网络文件共享服务;能通过网络让服务器之间共享目录或文件,必须和RPC共同使用。

    NFS分为服务端和客户端。服务端提供共享目录或文件,客户端对服务端共享的目录或文件挂载后,就可以读取到服务端提供的文件或目录.

    可以保障网站数据的一致性–》不管负载均衡器将请求分配到哪台后端的服务器,客户机看到的内容是一样。

    RPC(远程过程调用协议) 最主要的功能就是在指定每个 NFS 功能所对应的端口号 ,并且回报给客户端,让客户端可以连结到正确的端口上去。 当服务器在启动 NFS 时会随机取用数个端口,并主动的向 RPC 注册,因此 RPC 可以知道每个端口对应的 NFS 功能。

    nfs自己并没有去对外监听某个端口号,而是外包给了rpc服务,rpc帮助nfs去监听端口,然后告诉客户机和本机的那个进程对应的端口连续

  • NFS的优点和缺点

    优点:随便一台linux服务器都可以搭建,成本非常低,构建非常容易

    缺点:读取速度有限,跟网络质量,磁盘IO,cpu,内存等因素有关,在传统的tcp/ip网络上传输的

2. SAN

  • SAN:区域存储网络

    存储区域网络(Storage Area Network,简称SAN)采用网状通道(Fibre Channel ,简称FC,区别与Fiber Channel光纤通道)技术,通过FC交换机连接存储阵列和服务器主机,建立专用于数据存储的区域网络。

3. NFS服务器的配置

  • 步骤

    1.安装nfs的相关软件

    [root@nfs-server ~]# yum install nfs-utils -y
    

    2.启动nfs-server服务

    [root@nfs-server ~]# service nfs restart
    

    3.编辑共享文件的配置文件/etc/exports,写好具体的共享的目录和权限

    [root@nfs-server ~]# vim /etc/exports
    /web  192.168.98.0/24(rw,all_squash,sync)
    [root@nfs-server ~]# mkdir /web
    [root@nfs-server ~]# cd /web
    [root@nfs-server web]#vim   index.html  创建首页文件
    welcome to sanchuang
    

    /web 是我们共享的文件夹的路径–》使用绝对路径 --》需要自己新建

    192.168.0.0/24 允许过来访问的客户机的ip地址网段

    (rw,all_squash,sync) 表示权限的限制

    rw 表示可读可写 read and write

    ro 表示只能读 read-only

    all_squash :任何客户机上的用户过来访问的时候,都把它认为是普通的用户

    root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器匿名用户

    no_root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员

    sync 同时将数据写入到内存与硬盘中,保证不丢失数据

    async 优先将数据保存到内存,然后再写入硬盘,效率更高,但可能丢失数据

    4.刷新输出文件的列表

    #两种刷新方式都可以
    [root@nfs-server web]# exportfs -rv
    [root@nfs-server web]# service nfs restast
    

    5.关闭防火墙和selinux

    [root@nfs-server download]# service firewalld stop
    Redirecting to /bin/systemctl stop firewalld.service
    [root@nfs-server download]# systemctl disable firewalld
    [root@nfs-server download]# getenforce 
    Disabled
    

    6.挂载nfs服务器上共享的/web目录到客户机上

    #安装nfs-utils软件,具有了挂载相关命令
    [root@web-server2 ~]# yum install nfs-utils -y  
    [root@web-server2 ~]# mount 192.168.0.139:/web /usr/local/nginx/html/  将nfs服务器上的/web目录挂载到客户机的/usr/local/nginx/html/目录上
    

    mount 是挂载的命令,可以理解为一种映射

    语法: mount nfs服务器的目录 本地的目录

五.高可用

1.高可用HA

  • 介绍

    高可用(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性->一个服务器坏了,另外一个可以顶替,核心业务基本上不受到影响。

    单点故障:某个重要的功能只有一份,没有其他的备份,这个点出现问题,导致全局不能使用->本质上就是一个服务器坏掉了,没有其他的服务器可以顶替

  • HA软件:keepalived 、HA Proxy、heartbeat

2.keepalived

2.1 介绍

Keepalived 是一个用 C 语言编写的路由软件。这个项目的主要目标是为 Linux 系统和基于 Linux 的基础设施提供简单而强大的负载均衡和高可用性功能。

  • Keepalived 的2大核心功能

    1. 负载均衡(loadbalance) :基于ipvs实现的负载均衡–》lvs软件在linux内核里已经安装,不需要单独安装
    2. 高可用(High Availability):vrrp协议
  • (虚拟IP地址)vip漂移

    master 挂了,vip会漂到backup服务器上

  • 脑裂现象:多台机器出现vip

    • 脑裂的原因

      1.vrid(虚拟路由id)不一样->帮派不一样了
      2.网络通信有问题:中间有防火墙阻止了网络之间的选举的过程,vrrp报文的通信
      3.认证密码不一样也会出现脑裂

    • 脑裂的危害

      没有危害,能正常访问,反而还有负载均衡的作用
      脑裂恢复的时候,还是有影响的,会短暂的中断,影响业务的

2.2 vrrp协议

VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)是一种网络协议,旨在提高网络可用性和冗余。它允许多台路由器共同工作,创建一个虚拟路由器,以确保在某一台路由器发生故障时,网络流量可以无缝切换到另一台路由器,从而保持网络的连通性。

  • 虚拟路由器:多个路由器(通常是主备关系)协同工作,形成一个虚拟路由器。这个虚拟路由器有一个共享的虚拟 IP 地址(vip),对外提供网络服务。
  • 主备机制:在 VRRP 中,有一个主路由器和一个或多个备用路由器。主路由器负责处理网络流量,而备用路由器则处于待命状态,监视主路由器的运行状态。
  • 虚拟 IP 地址:虚拟路由器具有一个虚拟 IP 地址,该地址是外部网络设备用于访问网络服务的入口。无论主备切换如何进行,虚拟 IP 地址都会保持不变。
  • 优先级:每台路由器都有一个优先级值,主备的选择是基于这些优先级进行的。通常情况下,拥有最高优先级的路由器将成为主路由器。如果主路由器不可用,备用路由器中的某个将升级为主路由器。
  • 通告协议:VRRP 使用一种通告协议来检测路由器的状态。主备路由器会定期发送 VRRP 通告,以表明它们的活动状态。如果备用路由器连续一定次数没有接收到主路由器的通告,它将认为主路由器不可用,并开始提供服务。
  • 快速切换:VRRP 的设计目标之一是实现快速切换,以减少网络中断的时间。一旦主备切换发生,网络流量将迅速转移到新的主路由器。

2.2 vrrp的工作原理

一组路由器协同工作,担任不同的角色,有master角色,也有backup角色
master角色的路由器(的接口)承担实际的数据流量转发任务
Backup路由器侦听Master路由器的状态,并在Master路由器发生故障时,接替其工作,从而保证业务流量的平滑切换。 随时候命,是备胎

选举的过程:

  • 所有的路由器或者服务器发送vrrp宣告报文,进行选举,必须是相同vrid和认证密码的,优先级高的服务器或者路由器会被选举为master,其他的机器都是backup
  • master定时(Advertisement Interval)发送VRRP通告报文,以便向Backup路由器告 知自己的存活情况。 默认是间隔1秒
  • 接收Master设备发送的VRRP通告报文,判断Master设备的状态是否正常。 如果超过1秒没有收到vrrp报文,就认为master挂了,开始重新选举新的master,vip会漂移到新的master上

2.3 keepalived配置

配置keepalived的步骤

1.安装keepalived软件,在2台负载均衡上都安装

[root@lb-1 conf]# yum install keepalived -y
[root@lb2 conf]# yum install  keepalived -y

2.修改配置文件

#配置介绍
vrrp_instance VI_1 {           #定义一个vrrp协议的实例  名字叫VI_1  第一个vrrp实例
    state MASTER              #做master角色
    interface ens33        #指定监听网络的接口,其实就是vip绑定到

那个网络接口上
    virtual_router_id 151    #虚拟路由器id --》帮派   51是帮派的

编号   0~255之间
    priority 120   #优先级   0~255
    advert_int 1  #宣告消息的时间间隔  1秒  interval  间隔
    authentication {
        auth_type PASS    #密码认证  password
        auth_pass 1111    #具体密码 
    }
    virtual_ipaddress {  #vip 虚拟ip地址
        192.168.0.188
    }
[root@lb-1 conf]# cd /etc/keepalived/
[root@lb-1 keepalived]# vim keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 58
    priority 120
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.227.188
    }
}
#第二个vip
vrrp_instance VI_2 {
    state BACKUP
    interface ens33
    virtual_router_id 60
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.227.199
    }
}
[root@lb2 keepalived]# vim keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 58
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.227.188
    }
}
#第二个vip
vrrp_instance VI_2 {
    state MASTER
    interface ens33
    virtual_router_id 60
    priority 120
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.227.199
    }
}

3.启动服务

[root@lb-1 keepalived]# service keepalived restart
[root@lb2 keepalived]# service keepalived restart

4.可以验证vip漂移

关闭master上的keepalived服务
service keepalived stop
在backup服务器上看是否有vip

2.4 健康检查监控nginx

监控本机的nginx进程是否运行,如果nginx进程不运行就立马将优先级降低30

判断nginx是否运行的方法
1.pidof nginx
2.killall -0 nginx

  • 步骤

    1.编写监控nginx的脚本

    [root@lb-1 nginx]# cat check_nginx.sh 
    #!/bin/bash
    #检测nginx是否正常运行
    if  /usr/sbin/pidof  nginx  ;then
    	exit 0
    else
    	exit 1
    fi
    [root@lb-1 nginx]# chmod +x check_nginx.sh 
    

    2.在keepalived里定义监控脚本

    #定义监控脚本chk_nginx
    vrrp_script chk_nginx {
    #当脚本/nginx/check_nginx.sh脚本执行返回值为0的时候,不执行下面的weight  -30的操作,只有脚本执行失败,返回值非0的时候,就执行执行权重值减30的操作
    script "/nginx/check_nginx.sh"
    interval 1
    weight -30
    }
    

    3.在keepalived里调用监控脚本

    [root@lb-1 keepalived]# cat keepalived.conf 
    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
         [email protected]
         [email protected]
         [email protected]
       }
       notification_email_from [email protected]
       smtp_server 192.168.200.1
       smtp_connect_timeout 30
       router_id LVS_DEVEL
       vrrp_skip_check_adv_addr
       #vrrp_strict
       vrrp_garp_interval 0
       vrrp_gna_interval 0
    }
    #定义监控脚本chk_nginx
    vrrp_script chk_nginx {
    	#当脚本/nginx/check_nginx.sh脚本执行返回值为0的时候,不执行下面的weight  -30的操作,只有脚本执行失败,返回值非0的时候,就执行执行权重值减30的操作
    	script "/nginx/check_nginx.sh"
    	interval 1
    	weight -30
    }
    
    vrrp_instance VI_1 {
        state MASTER
        interface ens33
        virtual_router_id 59
        priority 120
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.227.188
        }
    	#调用监控脚本
    	track_script {
    		chk_nginx
    	}
    
    }
    vrrp_instance VI_2 {
        state BACKUP
        interface ens33
        virtual_router_id 60
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.227.199
        }
    }
    

2.5 lvs

  • LVS介绍

    内核实现功能lvs的功能,通过ipvsadm管理

    (1)LVS 是Linux Virtual Server的简称,也就是 Linux 虚拟服务器,是一个由章文嵩博士发起的自由软件项目,官方站点是www.linuxvirtualserver.orq。现在LVS已经是 Linux标准内核的一部分,因此性能较高。
    (2)LVS软件作用:通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。

  • LVS 优势与不足

    • 优势

      高并发连接: LVS基于内核网络层面工作,有超强的承载能力和并发处理能力。单台LVS负载均衡器,可支持上万并发连接。
      稳定性强:是工作在网络4层之上仅作分发之用,这个特点也决定了它在负载均衡软件里的性能最强,稳定性最好,对内存和cpu资源消耗极低。
      成本低廉: 硬件负载均衡器少则十几万,多则几十万上百万,LVS只需一台服务器和就能免费部署使用,性价比极高。
      配置简单:LVS配置非常简单,仅需几行命令即可完成配置,也可写成脚本进行管理。
      支持多种算法:支持多种论调算法,可根据业务场景灵活调配进行使用
      支持多种工作模型:可根据业务场景,使用不同的工作模式来解决生产环境请求处理问题。
      应用范围广:因为LVS工作在4层,所以它几乎可以对所有应用做负载均衡,包括http、数据库、DNS、ftp服务等等

    • 不足

      只能实现四层负载均衡,不能实现七层负载均衡

  • 核心组件

    LVS的管理工具和内核模块 ipvsadm/ipvs
    ipvsadm: 用户空间的命令行工具,用于管理集群服务及集群服务上的RS等
    ipvs:工作于内核上的程序,可根据用户定义的集群实现请求转发;

  • 专业术语

    VS: Virtual Server 虚拟服务
    DR: Director, Balancer 负载均衡器、分发器
    RS: Real Server #后端请求处理服务器

    CIP: Client IP 用户端IP
    VIP: Director Virtual IP 负载均衡器虚拟IP
    DIP: Director IP 负载均衡器IP
    RIP: Real Server IP 后端请求处理服务器IP

  • LVS负载均衡四种工作模式

    • NAT模式

      网络地址转换模式,进站/出站的数据流量经过分发器(IP负载均衡,它修改的是IP地址) --利用三层功能

    • DR模式:

      直接路由模式,只有进站的数据流量经过分发器(数据链路层负载均衡,因为他修改的是目的mac地址),出站直接从RS到client,LVS和RS共用一个vip–利用二层功能mac地址

    • TUN模式

      隧道模式,只有进站的数据流量经过分发器(必须使用公网ip)

    • full-nat模式

      双向转换:通过请求报文的源地址为DIP,目标为RIP来实现转发: 对于响应报文而言,修改源地址为VIP,目标地址为CIP来实现转发

    • 区别

      nat与fullnat的区别:请求和响应报文都经由Director
      nat: RIP的网关要指向DIP
      fullnat: RIP和DIP未必在同一IP网络,但要能通信

      dr与tun的区别: 请求报文要经由Director,但响应报文由RS直接发往Client
      dr:通过封装新的MAC首部实现,通过MAC网络转发
      tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信

    DR模式的lvs实验

    在lvs服务器上安装并添加vip

六. prometheus

1. 监控软件

1.cacti 仙人掌: 出图比较好
2.nagios 监控脚本特别多
3.zabbix 集合cacti+nagios的优点: --》企业里使用非常多
4.openfalcon 小米公司开源的监控软件: 京东,滴滴,小米,字节等
5.prometheus :开源的监控软件
作业帮: 唐浩伦 师傅 监控软件 c–》python,go 腾讯

2. 相关组件

Nginx运维知识基础详解_第3张图片

1.tsdb time series database 时序数据库 --》hdd/ssd hdd机械磁盘 hard disk drive ssd固态磁盘 -->solid state drive
promQL : select ,insert等
2.http server web服务
3.pushgateway 中间件(代理)
4.alertmanager 告警的软件
5.exporter 收集数据,采集数据 木马程序 : 安装到被监控的机器上

采集数据:exporter pushgateway 中间件(代理)
存储数据:tsdb
提供数据:http server
显示数据: grafana
告警、报警:alertmanager

3. 配置安装

  • 第1步:安装prometheus server

    源码下载:https://github.com/prometheus/prometheus/releases/download/v2.46.0/prometheus-2.46.0.linux-amd64.tar.gz

    1.一键源码安装prometheus

    [root@localhost ~]# vim onekey_install_prometheus.sh
    
    #!/bin/bash
    
    #创建存放prometheus的目录
    mkdir /prom
    
    #下载prometheus源码(由于github无法访问,故省略该步,手动下载)
    #curl -O https://github.com/prometheus/prometheus/releases/download/v2.47.0/prometheus-2.47.0.linux-amd64.tar.gz
    
    #解压并改名
    tar xf ./prometheus-2.47.0.linux-amd64.tar.gz -C /prom
    mv /prom/prometheus-2.47.0.linux-amd64 /prom/prometheus
    
    #添加到PATH变量
    PATH=/prom/prometheus:$PATH
    echo "PATH=/prom/prometheus:$PATH " >>/root/.bashrc
    
    #nohub后台执行启动
    nohup prometheus  --config.file=/prom/prometheus/prometheus.yml &
    
    #关闭防火墙
    service firewalld stop
    systemctl disable firewalld 
    

    2.把prometheus做成一个服务来进行管理

    [root@prometheus prometheus]# vim /usr/lib/systemd/system/prometheus.service
    [Unit]
    Description=prometheus
    
    [Service]
    ExecStart=/prom/prometheus/prometheus --config.file=/prom/prometheus/prometheus.yml
    ExecReload=/bin/kill -HUP $MAINPID
    KillMode=process
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    
    #重新加载systemd相关的服务
    [root@prometheus prometheus]# systemctl daemon-reload
    

    第一次因为是使用nohup 方式启动的prometheus,还是需要使用后kill 的方式杀死第一次启动的进程;后面可以使用service方式管理prometheus了

    [root@prometheus prometheus]# ps aux|grep prometheus
    root       8431  0.2  3.2 782340 61472 pts/0    Sl   11:21   0:01 prometheus --config.file=/prom/prometheus/prometheus.yml
    root       8650  0.0  0.0 112824   980 pts/0    S+   11:35   0:00 grep --color=auto prome
    [root@prometheus prometheus]# kill -9 8431
    [root@prometheus prometheus]#  service prometheus start
    [root@prometheus prometheus]#  service prometheus stop
    
  • 第2步:在node节点服务器上安装exporter程序
    1.下载node_exporter源码,上传到节点服务器上

    源码下载:https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz

    [root@ansible ~]# vim node_exporter.sh
    
    #!/bin/bash
    #进入root家目录
    cd ~
    #下载node_exporter源码(由于github无法访问,故省略该步,手动下载)
    #curl -O https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
    #解压node_exporters源码包
    tar xf node_exporter-1.6.1.linux-amd64.tar.gz
    #改名
    mv  node_exporter-1.6.1.linux-amd64 /node_exporter
    cd /node_exporter
    #修改PATH环境变量
    PATH=/node_exporter:$PATH 
    echo "PATH=/node_exporter:$PATH" >>/root/.bashrc
    #后台运行,监听8090端口(具体的端口号,可以自己定义,只要不和其他的服务冲突就可以)
    nohup node_exporter --web.listen-address 0.0.0.0:8090  &
    

    访问node节点上的metrics
    http://192.168.1.194:8090/metrics

  • 第3步: 在prometheus server里添加安装了exporter程序的机器

    [root@sc-prom prometheus]# vim prometheus.yml
    
    scrape_configs:
    
    The job name is added as a label `job=` to any timeseries scraped from this config.
    
      - job_name: "prometheus"
        static_configs:
          - targets: ["localhost:9090"]
      #添加下面的配置采集node-liangrui服务器的metrics
      - job_name: "node-master"
        static_configs:
          - targets: ["192.168.98.131:8090"]
    

    重启prometheus服务

    [root@prometheus prometheus]# service  prometheus restart
    

4. grafana

  • 安装部署
    1.先去官方网站下载

    wget https://dl.grafana.com/enterprise/release/grafana-enterprise-10.1.1-1.x86_64.rpm
    

    2.安装

    [root@sc-prom grafana]# ls
    grafana-enterprise-8.4.5-1.x86_64.rpm
    [root@sc-prom grafana]# yum install grafana-enterprise-10.1.1-1.x86_64.rpm -y
    

    3.启动grafana

    [root@sc-prom grafana]# service grafana-server start
    设置grafana开机启动
    [root@prometheus grafana]# systemctl enable grafana-server  
    监听的端口号是3000
    

    4.登录,在浏览器里登录

    http://192.168.98.135:3000/
    默认的用户名和密码是
    用户名admin
    密码admin

  • 导入模板
    1.先配置prometheus的数据源

    2.导入grafana的模板
    模板官网:https://grafana.com/grafana/dashboards
    推荐使用的模板编号:1860和8919

你可能感兴趣的:(学习笔记,运维,nginx,反向代理,负载均衡)