NGINX upstream、stream、四/七层负载均衡以及案例示例

文章目录

  • 前言
    • [1. 四/七层负载均衡](#1. 四/七层负载均衡)
      • [1.1 开放式系统互联模型 ------ OSI](#1.1 开放式系统互联模型 —— OSI)
      • [1.2 四/七层负载均衡](#1.2 四/七层负载均衡)
    • [2. Nginx七层负载均衡](#2. Nginx七层负载均衡)
      • [2.1 upstream指令](#2.1 upstream指令)
      • [2.2 server指令和负载均衡状态与策略](#2.2 server指令和负载均衡状态与策略)
        • [2.2.1 负载均衡状态](#2.2.1 负载均衡状态)
        • [2.2.2 负载均衡策略](#2.2.2 负载均衡策略)
      • [2.3 案例](#2.3 案例)
    • [3. Nginx四层负载均衡的指令](#3. Nginx四层负载均衡的指令)
      • [3.1 stream](#3.1 stream)
      • [3.2 upstream指令](#3.2 upstream指令)
      • [3.3 四层负载均衡实现tcp的转发](#3.3 四层负载均衡实现tcp的转发)

前言

  伴随单台服务器性能及单点故障问题的凸显,一方面需要增加系统的硬件处理能力,另一方面需要添加机器构建应用集群

  应用集群:将同一应用部署到多台机器上,组成处理集群,接收负载均衡设备分发的请求,进行处理并返回响应的数据

  负载均衡器:将用户访问的请求根据对应的负载均衡算法,分发到集群中的一台服务器进行处理


1. 四/七层负载均衡

1.1 开放式系统互联模型 ------ OSI

将网络通信的工作分为七层:

  应用层:为应用程序提供网络服务。

  表示层:对数据进行格式化、编码、加密、压缩等操作。

  会话层:建立、维护、管理会话连接。

  传输层:建立、维护、管理端到端的连接,常见的有TCP/UDP。

  网络层:IP寻址和路由选择

  数据链路层:控制网络层与物理层之间的通信。

  物理层:比特流传输

1.2 四/七层负载均衡

  四层负载均衡:OSI七层模型中的传输层,主要是基于IP+PORT的负载均衡

  七层负载均衡:在应用层,主要是基于虚拟的URL或主机IP

的负载均衡

  四层负载均衡数据包在底层分发,而七层负载均衡数据包则在最顶端进行分发,所以四层负载均衡的效率比七层负载均衡的要高。四层负载均衡不识别域名,而七层负载均衡识别域名。在生产实践中,一般采用四层负载(LVS)+七层负载(Nginx)


2. Nginx七层负载均衡

2.1 upstream指令

  定义一组服务器,可以是监听不同端口的服务器,也可以是同时监听TCP和Unix socket的服务器。服务器可以指定不同的权重,默认为1

2.2 server指令和负载均衡状态与策略

  指定后端服务器的名称和一些参数,可以使用域名、IP、端口或者unix socket

2.2.1 负载均衡状态

down:将该服务器标记为永久不可用,那么该代理服务器将不参与负载均衡

backup:将该服务器标记为备份服务器,当主服务器不可用时,将用来传递请求

max_conns=number:用来设置代理服务器同时活动链接的最大数量,默认为0,表示不限制,使用该配置可以根据后端服务器处理请求的并发量来进行设置,防止后端服务器被压垮

max_fails=number:设置允许请求代理服务器失败的次数,默认为1

fail_timeout=time:设置经过max_fails失败后,服务暂停的时间,默认是10秒

2.2.2 负载均衡策略

轮询 :

  upstream模块负载均衡默认的策略。每个请求会按时间顺序逐个分配到不同的后端服务器。轮询不需要额外的配置

加权轮询 :

  weight=number:用来设置服务器的权重,默认为1,权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的,所有此策略比较适合服务器的硬件配置差别比较大的情况

ip_hash :

  当对后端的多台动态应用服务器做负载均衡时,ip_hash指令能够将某个客户端IP的请求通过哈希算法定位到同一台后端服务器上。当来自某一个IP的用户在后端Web服务器A上登录后,在访问该站点的其他URL,能保证其访问的还是后端web服务器A

least_conn :

  最少连接,把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果

url_hash :

  按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url会到达同一台服务器,一旦缓存住了资源,再此收到请求,就可以从缓存中读取

fair :

  fair采用的不是内建负载均衡使用的轮换的均衡算法,而是可以根据页面大小、加载时间长短智能的进行负载均衡。fair属于第三方模块实现的负载均衡。需要添加nginx-upstream-fair模块

2.3 案例

  模拟应用(在172.18.25.49上nginx配置3个端口提供服务)

xml 复制代码
		server {
                listen 10120;
                server_name localhost;
                default_type text/html;
                return 200 '<h1>1012</h1>';
        }
        server {
                listen 10130;
                server_name localhost;
                default_type text/html;
                return 200 '<h1>1013</h1>';
        }
        server {
                listen 10140;
                server_name localhost;
                default_type text/html;
                return 200 '<h1>1014</h1>';
        }

  负载均衡器设置(fair策略,10150 端口下线)

xml 复制代码
  upstream backend{
  fair;
  server 172.18.25.49:10120;
  server 172.18.25.49:10130;
  server 172.18.25.49:10140;
  server 172.18.25.49:10150 down;
  }

  反向代理(https请求)

xml 复制代码
  server {
    listen 1443 ssl;
    server_name localhost;

    ssl_certificate cert/server.crt;
    ssl_certificate_key cert/server.key;

    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;

    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
      location / {
         proxy_pass http://backend;
       }
      }

3. Nginx四层负载均衡的指令

3.1 stream

  提供在其中指定流服务器指令的配置文件上下文。和http指令同级

3.2 upstream指令

  和http的upstream指令是类似的

3.3 四层负载均衡实现tcp的转发

  

xml 复制代码
stream {
    log_format  proxy '$remote_addr $remote_port - [$time_local] $status $protocol '
                      '"$upstream_addr" "$upstream_bytes_sent" "$upstream_connect_time"' ;
    access_log /var/log/nginx/proxy.log proxy;

#定义转发ssh的22端口
    upstream ssh_22 {
            server 172.18.25.49:22;
    }
#定义转发mysql的3306端口
    upstream mysql_3306 {
            server 172.18.25.49:3306;
    }
    server {
            listen 5555;
            proxy_connect_timeout 3s;
            proxy_timeout 300s;
            proxy_pass ssh_22 ;
    }

    server {
            listen 6666;
            proxy_connect_timeout 3s;
            proxy_timeout 3s;
            proxy_pass mysql_3306;
    }
}

相关推荐
乘云数字DATABUFF1 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
荣--3 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森3 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜4 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB5 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode6 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220707 天前
如何搭建本地yum源(上)
运维
ping某8 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树8810 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠10 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql