Nginx反向代理与负载均衡

2023-10-29

一、网关、代理与反向代理的关系

众所周知路由器可以连接不同网段的局域网,不同网段的局域网想要进行数据的传递需要经过相应的网关。由于每一个发出去的请求或回来的响应都要经过网关我们便可以在网关处进行一下流量的管理。nginx恰恰可以做到这一点。nginx服务器可以正向代理用户也可以反向代理业务服务器。代理谁谁就是他要保护的对象。nginx在此过程中往往做的就是请求转发的活,并不会真正的处理实际的业务。网关处的带宽往往决定了集群的带宽,所以在进行数据响应时往往会做一些操作。

lvs是一个专业的负载均衡器。

  • 常见的反向代理模式
  • 隧道式模型:业务服务器收到的请求与响应都要经过Nginx服务器(能力受带宽限制)。
  • DS模型:业务服务器收到的请求走Nginx服务器,但是响应直接由业务处理服务器进行响应。

二、反向代理在系统架构中的应用场景

用户使用电脑向目标主机发送请求,请求会先经过路由器,由路由器转发给DNS等服务器进行域名解析,然后数据到达目标服务器所处的机房网关,在机房网关内如果合法能够通过防火墙,进入Nginx服务器使用Nginx服务器进行负载均衡打到相应的业务服务器上即可,业务服务器通常会有一个专门进行身份校验。

请添加图片描述
请添加图片描述
请添加图片描述

三、Nginx反向代理配置

1.不重定向配置

这种代理模式不会将路由重定向,而是直接对需要操作的动作进行转发(响应状态码是200,源主机是Nginx服务器主机,可以很好的将所代理的主机隐藏起来)

配置文件如下:

server {
    listen       80;
    server_name  *.aiecp.com;
    
    location / {
    	# 核心代码
    	proxy_pass http://www.atguigu.com/;
    }
    
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
    	root   html;
    }

}

请添加图片描述

请添加图片描述

2.重定向配置

这种代理模式客户端会先向代理服务器发送一个请求,然后代理服务器将路由重定向到指定主机。

配置文件如下:

server {
    listen       80;
    server_name  *.aiecp.com;
    
    location / {
    	# 核心代码
    	proxy_pass http://atguigu.com/;
    }
    
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
    	root   html;
    }

}

请添加图片描述

四、基于反向代理的负载均衡器(不支持https)

由于我的电脑与硬盘太菜,就没有像张一明老师那样开三台虚拟机了,我是直接在宿主机上跑了三个项目分别占用宿主机的8080,8081,8082端口如下:
请添加图片描述
请添加图片描述
由于在内网上进行的实验,内网路由器又在我手里于是就将宿主机的防火墙关掉了。
请添加图片描述

以下是在本地跑的三个项目,都可以访问到。

请添加图片描述

在进行配置的时候一直说我请求头非法于是替换了策略(后面研究到修改请求头的时候再进行深究)
将三个项目改成了两个,这两个都是Golang写的主要是为了方便观察。

被代理的第一个主机
请添加图片描述
被代理的第二个主机:
请添加图片描述
这里实验的过程中,可以发现虽然设置了权重之类的属性,但是依旧没哟办法做到百分百轮询或者按比例访问,nginx会根据两个端口的响应速率进行转发
在负载均衡的两个端口内,博客明显响应的更慢一些,所以在询问的时候更偏向于转发到8081端口。这时候怎么观察到负载均衡的效果呢?看下面的图片:
请添加图片描述
之后就可以看到负载均衡的效果啦。

五、负载均衡介绍

1.负载均衡策略

  • weight:权重

  • down : 当前server暂不参与负载均衡

  • backup : 预留的备份服务器; 其它所有的非backup机器down或者忙的时候,请求backup机器。

  • max_fails : 请求失败次数限制

  • fail_timeout : 经过max_fails后服务暂停时间

  • max_conns : 限制最大的连接数

2.负载均衡调度算法

  • 轮询:默认算法按时间顺序逐一分配到不同的后端服务器;

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

    • upstream test {
      server 192.168.31.253:8080;
      server 192.168.31.253;
      }

      server {
      listen 81;
      server_name localhost;
      client_max_body_size 1024M;
      location / {
      proxy_pass http://test;
      proxy_set_header Host h o s t : host: host:server_port;
      }
      }

  • 加权轮询:Weight值越大,分配到访问几率越高(但不是百分百按比例);

    • 权重指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况
    • upstream test {
      server 192.168.31.253:8081 weight=1;
      server 192.168.31.253:8080 weight=9;
      }
  • ip_hash:为每一个请求访问的IP的hash结果分配,可以将来自一个IP的固定访问一个后端服务器;

    • ip_hash 会话粘连, 上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用iphash了,iphash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

    • 会话粘粘可以理解为用户持续访问一个后端机器

      upstream test {
      ip_hash;
      server 192.168.31.253:8080;
      server 192.168.31.253:8081;
      }

  • url_hash:需要安装模块安装访问的URL的hash结果来分配,这样每个URL定向到同一个后端服务器

    • url_hash(第三方):按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

      在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

    • upstream backend {
      hash $request_uri;
      hash_method crc32;
      server 192.168.31.253:8080;
      server 192.168.31.253:8081;
      }

  • least_conn:按照某台机器最少连接数的进行分配访问;

    • 将请求分配到连接数最少的服务上
    • upstream dalaoyang-server {
      least_conn;
      server 192.168.31.253:8080;
      server 192.168.31.253:8081;
      }
  • fair 按后端服务器 的响应时间来分配请求,响应时间短的优先分配

    • upstream backend {
      fair;
      server 192.168.31.253:8080;
      server 192.168.31.253:8081;
      }

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx反向代理与负载均衡 的相关文章

  • 使用 Clapprjs 在网页上流式传输 .m3u8

    我使用 nginx rtmp 将 rtmp 转换为 hls 并使用 Clappr 在网页中进行流式传输 但 Clappr 采用旧的 ts 段 导致 404 错误 因为它在服务器上被删除 如何解决这个问题 抱歉 这是我第一次使用 nginx
  • 如何在Python中在后台运行长时间运行的作业

    我有一个运行长时间运行的作业 大约几个小时 的网络服务 我正在使用 Flask Gunicorn 和 nginx 来开发它 我想做的是让需要很长时间才能完成的路线 调用创建线程的函数 然后 该函数将向路由返回一个 guid 并且路由将返回一
  • Nginx 对 cms 后端的重写规则

    我需要在 nginx 服务器中制定 url 重写规则 服务器块 就像我之前的 apache 服务器一样 这是 htaccess 中的代码 我需要将其实现 转换 到我现有的代码中 RewriteRule A Za z0 9 A Za z0 9
  • 使用 nginx 代理时在 RStudio 中运行闪亮的应用程序

    我正在尝试使用通过 nginx 代理的 RStudio 服务器来开发一个闪亮的应用程序 当我使用 RStudio 而不是服务器 来运行闪亮的应用程序时 一切正常 但是 当我通过代理 RStudio 运行时 该应用程序出现在 查看器 窗格中
  • 站点启用/中不允许使用 nginx“mail”和“stream”指令

    当我尝试在 nginx 中使用流或邮件指令时遇到问题 我正在使用 nginx 1 16 1 和 Ubuntu 18 04 4 LTS 这是我的 nginx conf user www data worker processes auto p
  • Docker 与 nginx 组合不断显示欢迎页面

    我是新来的docker并尝试使用最简单的 docker compose yml 显示一个 hello world 页面 并在此基础上构建最终完整的LEMP堆栈它将与我的服务器具有相同的配置 然而大多数教程已经过时 并且有很多使用方法dock
  • 比较 nginx+Apache+mod_wsgi 与 nginx+uWSGI?

    在生产中使用 nginx Apache mod wsgi 与 nginx uWSGI vurtualenv 有何优缺点 我在自 2007 年以来开发的 mod wsgi 中看到了第一个变体的优点 并且具有更稳定的版本和易于管理 第二种变体的
  • 如何将亚马逊颁发的免费证书配置到nginx.config

    我已经安装了nginx服务器在Amazon Linux 2环境 在创建弹性负载均衡器期间 我创建了 Amazon 的免费证书 现在 我想通过以下方式访问我的服务器https port 443 我该如何配置这个SSL证书在nginx conf
  • NGINX 与 Tomcat 配置

    我是 Nginx 新手 我需要你的帮助 根据很多论坛我了解到我们所有的静态页面都存储在Nginx中 当有请求到来时 我必须将该请求传递给 tomcat 获取数据 并在 tomcat 生成响应后生成响应 目前 我刚刚做到了 我将请求直接传递给
  • Node + Express + Nginx 未设置 Cookie

    我有一个使用 Express 的 Node 应用程序 我尝试为我的客户端设置 cookie 它在本地环境 http 上运行良好 但是一旦我投入生产 https 我就很好地收到了cookie 我可以在响应中看到它 但它没有设置 任何想法 Ng
  • 当请求太大时,Nginx(我认为)会以错误的权限保存文件

    所以 我对托管和 Linux 等都是完全陌生的 所以如果我说错了 请原谅我 我还在学习 我正在使用 Django 创建一个小型个人网站 我想把它放到网上看看是否一切正常 我从 linode 买了一台便宜的服务器 并使用 Digital Oc
  • 如何将多个域路由到多个节点应用程序?

    我习惯了典型的 Lamp Web 托管环境 您只需单击 cpanel 中的几个按钮 您的域就会被分区并映射到 htdocs 中的文件夹 我经常使用 Node js 但做同样的事情似乎并不那么简单 如果我有多个节点应用程序 并且我想将doma
  • 如果我在不打算升级到 websocket 连接的 HTTP 请求中包含“Upgrade”和“Connection”标头,会发生什么情况?

    我有一个 Nginx 服务器块 用于代理对 node js 服务器的请求 该服务器同时提供 HTTP 内容和 WS websocket 内容 是否可以在不应升级到 Websocket 连接的请求上添加升级标头 即使用 Nginx 代理到服务
  • Nginx 中 uwsgi_pass 和 proxy_pass 的区别?

    我在 Nginx 后面运行 uWSGI 并一直在使用proxy pass让 Nginx 访问 uWSGI 切换到有什么好处吗uwsgi pass 如果是这样 那是什么 uwsgi pass使用一个uwsgi协议 proxy pass使用普通
  • Nginx - 自定义 404 页面

    Nginx PHP 在 fastCGI 上 对我来说非常有用 当我输入不存在的 PHP 文件的路径时 我不会得到默认的 404 错误页面 任何无效的 html 文件都会出现该错误页面 而只会得到 未指定输入文件 如何自定义此 404 错误页
  • 如何在位置中使用 Nginx Regexp

    Web 项目将静态内容放入 some content img 文件夹中 url规则为 img some md5 但文件夹中的位置 content img 前两位数字 Example url example com img fe5afe048
  • 如何在运行 NGINX Docker 容器的 AWS EC2 上启用 HTTPS?

    我在 AWS 上有一个运行 Amazon Linux 2 的 EC2 实例 在上面 我安装了 Git docker 和 docker compose 完成后 我克隆了我的存储库并运行docker compose up让我的生产环境启动 我访
  • 常规请求期间 Django AJAX 请求未通过

    我有一个带有登录网页的 Django 站点 当提交页面上的登录表单时 它会执行登录视图 该视图会在其中运行一个需要很长时间处理 30秒左右 的函数 因此 为了在登录期间向客户端显示进度 一旦提交表单 登录页面上的 JS 函数就会开始向服务器
  • nginx代理认证拦截

    我有几个服务 它们支持 nginx 实例 为了处理身份验证 在 nginx 中 我拦截每个请求并将其发送到身份验证服务 在那里 如果凭据正确 我将设置一个包含用户相关信息的 cookie 现在 请求应该被路由到适当的服务 并设置 cooki
  • Beanstalk 部署忽略 .ebextensions 中的 nginx 配置文件

    我在单实例 Elastic Beanstalk 环境中托管 Java Web 应用程序 并添加了几个 ebextension 文件 这些文件在每次部署时成功为我创建配置文件 然而 我无法找到一种方法让 Beanstalk 在 etc ngi

随机推荐

  • 执行若依(ruoyi)项目

    执行若依项目 包含下载 更改配置 报错等介绍 一 成功执行演示 二 若依官网下载 三 修改相关配置 四 执行与show 一 成功执行演示 介绍1 若依框架是开源的项目且前后端分离开发 下图所示 左边是后端成功执行 右边是前端成功执行 介绍2
  • Unity 获取虚拟相机的画面

    void Fun Camera m Camera string filePath RenderTexture rt new RenderTexture Screen width Screen height 16 m Camera targe
  • 掌握Python的X篇_20_默认参、字典的展开

    文章目录 1 默认参数 2 指定实参值对应的形参 3 接受任意多个key value方式的参数 4 字典展开为key value键值对的多个参数 1 默认参数 我们可以通过 为形参指定默认值 这样函数调用过程中如果不传对应实参 就会使用默认
  • 最小覆盖圆(smallest enclosing circle)算法 python 实现

    百度一圈没有找到合适的博客 通过外网找到了python实现 所以整理记录一下 最小圆问题 The smallest circle problem also known as minimum covering circle problem b
  • FPGA学习笔记(三) 流水灯入门FPGA设计流程及阻塞/非阻塞赋值的分析

    系列文章目录 一 FPGA学习笔记 一 入门背景 软件及时钟约束 二 FPGA学习笔记 二 Verilog语法初步学习 语法篇1 三 FPGA学习笔记 三 流水灯入门FPGA设计流程 四 FPGA学习笔记 四 通过数码管学习顶层模块和例化的
  • 云计算系列知识点——云计算基础

    系列文章目录 云计算系列知识点 云计算基础 云计算系列知识点 云服务器产品 云计算系列知识点 网络 公网 私网 VPN等 基础知识与计费模式 文章目录 系列文章目录 云计算技术架构 计算虚拟化 KVM 容器技术 数据中心等级分为T1 T4
  • 软件测试策略

    历史的车轮滚滚向前 科技的创新生生不息 大数据 虚拟现实 智能汽车 区块链等为代表的新技术和新应用层出不穷 它们都与软件息息相关 而软件的质量保证离不开软件测试 软件测试要在成本 范围 进度 资源等因素的制约下取得最佳产出 就离不开测试策略
  • 【多字典公共键】快速找到多个字典的公共键及非公共键

    前言 在进行一个项目过程中遇到一个多个URL参数对比与分析的问题 所以就有了这个博客 单纯的了解找到多个字典的公共键的问题 可以移步到 python进阶 python进阶技巧 找到2 5 快速找到多个字典的公共键 想看实操 不妨浏览一下下面
  • keil关于use MicroLIB 和半主机模式的总结

    半主机是这么一种机制 它使得在ARM目标上跑的代码 如果主机电脑运行了调试器 那么该代码可以使用该主机电脑的输入输出设备 这点非常重要 因为开发初期 可能开发者根本不知道该 ARM 器件上有什么输入输出设备 而半主基机制使得你不用知道ARM
  • 虚拟机连接本地数据库

    我们在运行虚拟机上面的项目时 可能要用到本机的数据库 在使用过程中会遇到数据库拒绝访问的情况 这是因为在安装本地数据库时没有启动远程连接 使用两种方法来解决这种问题 一 使用命令行模式 第一步 先切换到MySQL的安装路径下面的bin目录
  • 百分率的sql

    百分比的sql语句 方式一的百分比的sql 说明 这条sql是在一张表里面进行查询 将不同的级别的工程师的百分率查询出来 第一个sql select tmp job grade tmp tcount tmp1 t1count from se
  • 基于单片机的数字频率计设计

    数字频率计概述 数字频率计是计算机 通讯设备 音频视频等科研生产领域不可缺少的测量仪器 它是一种用十进制数字显示被测信号频率的数字测量仪器 它的基本功能是测量正弦信号 方波信号及其他各种单位时间内变化的物理量 在进行模拟 数字电路的设计 安
  • 【力扣】205.同构字符串

    同构字符串 同构字符串 1 题目描述 2 示例 3 代码 方式1 方式2 5 编译结果 同构字符串 1 题目描述 给定两个字符串 s 和 t 判断它们是否是同构的 如果 s 中的字符可以按某种映射关系替换得到 t 那么这两个字符串是同构的
  • 【蓝桥杯Python】2023.2.3-寻找2020

    题目描述 本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 小蓝有一个数字矩阵 里面只包含数字 00 和 22 小蓝很喜欢 20202020 他想找 到这个数字矩阵中有多少个 20202020 小蓝只关注三种构成 20
  • 2023华为OD机试真题【施肥问题】

    题目描述 思路题解 首先需要计算每个果园的施肥时间 即果园面积除以施肥机能效 然后找到最小的施肥机能效 保证施肥任务能在规定时间内完成 如果施肥天数小于果园数量 则无法完成施肥任务 返回 1 如果施肥天数等于果园数量 则直接返回最大果园面积
  • 编译原理第七章笔记 -- 中间代码生成

    本文中内容整理西安交通大学软件学院吴晓军老师的ppt中 仅供学习使用 请勿转载或他用 参考教材 程序设计语言 编译原理 第3版 陈火旺等 国防工业出版社 这一章分数在35左右 两个大题 数组的引用四元式生成 控制语句当中布尔表达式的翻译 考
  • 运维必学

    欢迎关注 全栈工程师修炼指南 设为 星标 每天带你 基础入门 到 进阶实践 再到 放弃学习 专注 企业运维实践 网络安全 系统运维 应用开发 物联网实战 全栈文章 等知识分享 花开堪折直须折 莫待无花空折枝 作者 lt 安全开发运维 gt
  • VS2012编译安装VTK-5.10.1(支持Python)

    1 源码下载 到参考资料 1 下载vtk 5 10 1 zip和vtkdata 5 10 1 zip 2 源码解压 这里以D 盘为例进行说明 在D 盘中创建一个目录VTK 然后在其中创建4个目录 source build data和inst
  • mysql explain详解

    转自 http www blogjava net persister archive 2008 10 27 236813 html 在 explain的帮助下 您就知道什么时候该给表添加索引 以使用索引来查找记录从而让select 运行更快
  • Nginx反向代理与负载均衡

    文章目录 一 网关 代理与反向代理的关系 二 反向代理在系统架构中的应用场景 三 Nginx反向代理配置 1 不重定向配置 2 重定向配置 四 基于反向代理的负载均衡器 不支持https 五 负载均衡介绍 1 负载均衡策略 2 负载均衡调度