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


相关推荐
打工的小王16 小时前
nginx(一)nginx简介
nginx
李少兄19 小时前
深入解析 Nginx 413 Request Entity Too Large 错误
运维·nginx
漏刻有时1 天前
宝塔服务器被篡改 Nginx Location 配置的安全风险剖析与修复指南(流量劫持、服务器资源消耗、站点功能异常、溯源困难)
服务器·nginx·安全
你知道“铁甲小宝”吗丶1 天前
nginx代理ip哈希用法
nginx·哈希算法
代码的奴隶(艾伦·耶格尔)1 天前
Nginx
java·服务器·nginx
液态不合群1 天前
Nginx多服务静态资源路径冲突解决方案
运维·nginx
岁岁种桃花儿1 天前
详解kubectl get replicaset命令及与kubectl get pods的核心区别
运维·nginx·容器·kubernetes·k8s
zbguolei1 天前
CentOS 7.6离线安装Nginx
linux·nginx·centos
倒流时光三十年2 天前
阿里云 CentOS 7 使用 docker 安装 Nginx
nginx·阿里云·docker·centos
羱滒2 天前
Docker Compose + Nginx + 后端服务运行环境搭建全流程指南(redis、mongdb、nginx、nacos-registry)
redis·nginx·docker·docker-compose