07. Nginx进阶-Nginx负载均衡

简介

负载均衡

什么是负载均衡?

负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行。

Nginx负载均衡

什么是Nginx负载均衡?

Nginx负载均衡可以大大提升系统的吞吐率、请求性能、容灾性能。

工作原理

web服务器直接面向用户时,往往要承载大量并发请求。

单台服务器难以负荷,此时使用多天web服务器组成集群,前端使用Nginx负载均衡将请求分散到后端web服务器集群中。

示意图

应用

主机规划

主机名称 主机地址 主机功能
master-1 192.168.131.129 负载均衡主机
master-2 192.168.131.130 web主机1
master-3 192.168.131.131 web主机2

环境准备

安装Nginx

三台主机一同安装Nginx服务

  • 配置yum仓库
shell 复制代码
cat > /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
  • 安装Nginx
shell 复制代码
yum list | grep nginx
yum -y install nginx
nginx -v

配置web主机

  • 配置web站点

地址:192.168.131.130、192.168.131.131

路径:/etc/nginx/conf.d/default.conf

nginx 复制代码
server {
    listen       80;
    server_name  wang.mingqu.com;
    charset utf-8;

    location / {
        root   /www/wangmingqu/;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

}
  • 配置web页面

地址:192.168.131.130、192.168.131.131

路径:/www/wangmingqu/index.html

shell 复制代码
#主机:192.168.131.130、192.168.131.131
mkdir -p /www/wangmingqu/

#主机:192.168.131.130
echo "王茗渠测试页面,主机IP:192.168.131.130" > /www/wangmingqu/index.html

#主机:192.168.131.131
echo "王茗渠测试页面,主机IP:192.168.131.131" > /www/wangmingqu/index.html

注意:生成环境中两台web主机的资源内容需要保持一致,此处是为了演示负载均衡分配到了两台机器上

  • 启动web服务
shell 复制代码
systemctl stop firewalld
setenforce 0
nginx -t
systemctl start nginx
curl -iv  wang.mingqu.com

简单应用

配置负载均衡

地址:192.168.131.129

路径:/etc/nginx/conf.d/wangmingqu.conf

nginx 复制代码
upstream web {
    server 192.168.131.130;
    server 192.168.131.131;
}

server {
    listen 80;
    server_name wang.wangmingqu.com;
    charset utf-8;

    location / {
        proxy_pass http://web; 
    }  

}

检查配置

shell 复制代码
nginx -t
systemctl reload nginx

验证负载均衡


配置参数

upstream

语法:upstream name {...}

作用:定义一个负载均衡主机组

适用范围:http

server

语法:server url|host;

作用:定义负载均衡主机组中的主机

适用范围:upstream

proxy_pass

语法:proxy_pass http://name;

作用:引用定义的负载均衡主机组,将客户端请求转发至upstream服务池。

适用范围:location

后端状态

  1. weight

语法:server url|host weight=数值;

作用:指定负载均衡主机组中的主机权重,将客户端请求优先发送到该主机。

适用范围:upstream

  1. down

语法:server url|host down;

作用:指定当前主机暂时不参与负载均衡。

适用范围:upstream

  1. backup

语法:server url|host backup;

作用:指定负载均衡主机组中的某个主机为备份主机。

适用范围:upstream

  1. max_fails

语法:server url|host max_fails=数值;

作用:允许请求失败的次数

适用范围:upstream

  1. fail_timeout

语法:server url|host max_fails=数值 fail_timeout=时间s;

作用:经过max_fails失败后,服务暂停时间,单位秒"s"

适用范围:upstream

  1. max_conns

语法:server url|host max_conns=数值;

作用:限制最大的请求连接数。

适用范围:upstream

算法详解

轮询算法

  1. 简介

按时间顺序逐一分配到不同的后端服务器(默认算法),简称rr。

不考虑实际负载或配置,平均分配客户端请求。

  1. 应用
nginx 复制代码
upstream web {
    server 192.168.131.130;
    server 192.168.131.131;
}

server {
    listen 80;
    server_name wang.wangmingqu.com;
    charset utf-8;

    location / {
        proxy_pass http://web; 
    }  

}

权重算法

  1. 简介

权重算法,设置的weight值越大,请求访问到该机器的概率越高。又称为加权轮询,简称wrr。

  1. 应用
nginx 复制代码
upstream web {
    server 192.168.131.130 weight=10;
    server 192.168.131.131;
}

server {
    listen 80;
    server_name wang.wangmingqu.com;
    charset utf-8;

    location / {
        proxy_pass http://web; 
    }  

}

IP哈希算法

  1. 简介

每个请求按访问IP的hash结果分配。

这样来自同一IP的固定客户端访问同一个后端服务器。

注意:不能和weight一起使用。

  1. 应用
nginx 复制代码
upstream web {
    ip_hash;
    server 192.168.131.130;
    server 192.168.131.131;
}

server {
    listen 80;
    server_name wang.wangmingqu.com;
    charset utf-8;

    location / {
        proxy_pass http://web; 
    }  

}

URL哈希算法

  1. 简介

每个请求按访问URL的hash结果分配。

每个相同的URL定向到同一个后端服务器。

  1. 应用
nginx 复制代码
upstream web {
    hash $request_uri;
    server 192.168.131.130;
    server 192.168.131.131;
}

server {
    listen 80;
    server_name wang.wangmingqu.com;
    charset utf-8;

    location / {
        proxy_pass http://web; 
    }  

}

最少连接数算法

  1. 简介

最少连接数算法,哪台机器的链接数少就分发到这台机器上,简称lc。

  1. 应用
nginx 复制代码
upstream web {
    least_conn;
    server 192.168.131.130;
    server 192.168.131.131;
}

server {
    listen 80;
    server_name wang.wangmingqu.com;
    charset utf-8;

    location / {
        proxy_pass http://web; 
    }  

}

加权最少连接数算法

  1. 简介

加权最少连接数算法,就是weight和least_conn两个算法的集合,简称wlc。

  1. 应用
nginx 复制代码
upstream web {
    least_conn;
    server 192.168.131.130 weight=5;
    server 192.168.131.131;
}

server {
    listen 80;
    server_name wang.wangmingqu.com;
    charset utf-8;

    location / {
        proxy_pass http://web; 
    }  

}

七层负载&四层负载

七层负载

七层负载均衡简介

什么是Nginx七层负载均衡?

七层负载均衡是在应用层,可以完成很多应用方面的协议请求。

比如http应用的负载均衡,可以实现http信息的改写、头信息的改写、安全应用规则控制、URL匹配规则控制、以及转发、rewrite等等的规则。

所以在应用层的服务里面,可以做的内容就更多,Nginx是一个典型的七层负载均衡。

七层负载均衡应用场景

可以将请求分发到不同的服务上,并且可以根据请求信息进行灵活的代理转发;

由于请求会通过负载均衡服务器,负载均衡服务器会过滤一些请求(例如:DOS攻击)避免所有请求信息都打到服务器上,保障了服务器的稳定运行。

处于网络分层的最上层,需要对数据进行解析,与客户端建立连接,效率比较低。

配置web主机

  • 配置web站点

地址:192.168.131.130、192.168.131.131

路径:/etc/nginx/conf.d/default.conf

nginx 复制代码
server {
    listen       80;
    server_name  wang.mingqu.com;
    charset utf-8;

    location / {
        root   /www/wangmingqu/;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

}
  • 配置web页面

地址:192.168.131.130、192.168.131.131

路径:/www/wangmingqu/index.html

shell 复制代码
#主机:192.168.131.130、192.168.131.131
mkdir -p /www/wangmingqu/

#主机:192.168.131.130
echo "王茗渠测试页面,主机IP:192.168.131.130" > /www/wangmingqu/index.html

#主机:192.168.131.131
echo "王茗渠测试页面,主机IP:192.168.131.131" > /www/wangmingqu/index.html

注意:生成环境中两台web主机的资源内容需要保持一致,此处是为了演示负载均衡分配到了两台机器上

  • 启动web服务
shell 复制代码
systemctl stop firewalld
setenforce 0
nginx -t
systemctl start nginx
curl -iv  wang.mingqu.com

配置负载均衡

地址:192.168.131.129

路径:/etc/nginx/conf.d/wangmingqu.conf

nginx 复制代码
upstream web {
    server 192.168.131.130;
    server 192.168.131.131;
}

server {
    listen 80;
    server_name wang.wangmingqu.com;
    charset utf-8;

    location / {
        proxy_pass http://web; 
    }  

}

检查配置

shell 复制代码
nginx -t
systemctl reload nginx

验证负载均衡


四层负载

四层负载均衡简介

什么是Nginx四层负载均衡?

四层负载均衡是基于传输层协议包来封装的(如:TCP/IP),那我们前面使用到的七层是指的应用层,他的组装在四层的基础之上,无论四层还是七层都是指的OSI网络模型。

四层负载均衡应用场景
  1. 四层+七层来做负载均衡,四层可以保证七层的负载均衡的高可用性;如:nginx就无法保证自己的服务高可用,需要依赖LVS或者keepalive。
  2. 如:tcp协议的负载均衡,有些请求是TCP协议的(mysql、ssh),或者说这些请求只需要使用四层进行端口的转发就可以了,所以使用四层负载均衡。
四层负载均衡总结
  1. 四层负载均衡仅能转发TCP/IP协议、UDP协议、通常用来转发端口,如:tcp/22、udp/53;
  2. 四层负载均衡可以用来解决七层负载均衡端口限制问题;(七层负载均衡最大使用65535个端口号)
  3. 四层负载均衡可以解决七层负载均衡高可用问题;(多台后端七层负载均衡能同时的使用)
  4. 四层的转发效率比七层的高得多,但仅支持tcp/ip协议,不支持http和https协议;
  5. 通常大并发场景通常会选择使用在七层负载前面增加四层负载均衡;

添加四层负载模块

查看四层负载均衡模块
shell 复制代码
/usr/local/nginx/sbin/nginx -V 2>&1 | grep stream
安装四层负载均衡模块
shell 复制代码
cd /usr/local/nginx/conf/
./configure --prefix=/usr/local/nginx \
--user=nginx --group=nginx \
--with-http_realip_module \
--with-http_v2_module \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-stream \
--with-stream_ssl_module \
--with-http_sub_module \
--with-http_random_index_module

创建配置文件

shell 复制代码
mkdir -p /usr/local/nginx/conf/conf.stream/

主配置文件

路径:/usr/local/nginx/conf/nginx.conf

主机地址:192.168.131.129

nginx 复制代码
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}

include /usr/local/nginx/conf/conf.stream/*.conf;

http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /usr/local/nginx/conf/conf.d/*.conf;
}

子配置文件

路径:/usr/local/nginx/conf/conf.d/stream.conf

主机地址:192.168.131.129

nginx 复制代码
stream {
  upstream web_test_01 {
    server 192.168.131.130:22;
  }

  upstream web_test_02 {
      server 192.168.131.131:22;
  }

  server {
    listen 8081;
    proxy_connect_timeout 1s;
    proxy_timeout 3s;
    proxy_pass web_test_01;
  }

  server {
    listen 8082;
    proxy_connect_timeout 1s;
    proxy_timeout 3s;
    proxy_pass web_test_02;
  }
}

验证四层负载

  1. 检查配置文件
shell 复制代码
/usr/local/nginx/sbin/nginx -t
systemctl reload nginx
  1. 验证四层负载
shell 复制代码
ssh -p 8081 root@192.168.131.129
ssh -p 8082 root@192.168.131.129


相关推荐
苹果醋36 小时前
快速玩转 Mixtral 8x7B MOE大模型!阿里云机器学习 PAI 推出最佳实践
spring boot·nginx·毕业设计·layui·课程设计
大G哥13 小时前
记一次K8S 环境应用nginx stable-alpine 解析内部域名失败排查思路
运维·nginx·云原生·容器·kubernetes
妍妍的宝贝13 小时前
k8s 中微服务之 MetailLB 搭配 ingress-nginx 实现七层负载
nginx·微服务·kubernetes
叶北辰CHINA16 小时前
nginx反向代理,负载均衡,HTTP配置简述(说人话)
linux·运维·nginx·http·云原生·https·负载均衡
Lansonli18 小时前
云原生(四十八) | Nginx软件安装部署
nginx·云原生·ecs服务器
加油,旭杏1 天前
【中间件学习】fastCG介绍和使用
学习·nginx·fastcgi
苹果醋31 天前
大模型实战--FastChat一行代码实现部署和各个组件详解
java·运维·spring boot·mysql·nginx
tanxiaomi1 天前
vue 不是spa 单页面应用吗? 配置路由工作模式为history 后 ,为什么配置Nginx的 try_files 可以根据url 找到对应的文件?
前端·vue.js·nginx
twins35201 天前
配置Nginx以支持通过HTTPS回源到CDN
网络·nginx·https
astuv2 天前
在树莓派上部署开源监控系统 ZoneMinder
linux·nginx·树莓派·监控·摄像头·zoneminder·apache2