Nginx反向代理实战

news2024/11/26 14:24:33

使用反向代理代理服务

假设我们有三台服务器提供不同的服务
nginx作为代理服务器
代理服务器: 192.168.101.23

其余三台服务器
服务器1 192.168.101.18
服务器2 192.168.101.87
服务器3 192.168.101.20

代理服务器的nginix配置

   server {
        listen          8085;
        server_name     127.0.0.1;
        location /server1 { #根据请求路径路由到不同的服务中
                proxy_pass http://192.168.101.18:9001/;
        }
        location /server2 {
                proxy_pass http://192.168.101.87:9001/;
        }
        location /server3 {
                proxy_pass http://192.168.101.20:9001/;
        }
    }

服务器:192.168.101.18

server {
        listen          9001;
        server_name     localhost;
        default_type text/html;
        return 200 '<h1>192.168.101.18:9001</h1>';
    }

服务器:192.168.101.87

server {
        listen          9001;
        server_name     localhost;
        default_type text/html;
        return 200 '<h1>192.168.101.87:9001</h1>';
    }

服务器:192.168.101.20

server {
        listen          9001;
        server_name     localhost;
        default_type text/html;
        return 200 '<h1>192.168.101.20:9001</h1>';
    }

浏览器测试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如果三台服务是一样的可以使用nginx的负载均衡

Nginx七层负载均衡

Nginx 实现七层负载均衡主要依赖于其 proxy_pass 代理模块。这个模块在 Nginx 的默认安装中通常是已经启用的,不需要进行额外的配置来启用它。

在 Nginx 中,负载均衡是通过反向代理实现的,具体来说,用户的请求会被根据指定的算法转发到一个由多个后端服务器组成的【upstream 服务器组】。以下是一些基本的步骤和配置示例。

upstream指令

该指令是配置文件中用来定义一组后端服务器的指令块。这个指令块允许你将请求分发到多个后端服务器,通常用于负载均衡和故障转移

语法upstream name {…}
默认值-
位置http
server指令

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

语法server { … }
默认值无默认值
位置upstream

例如:

server {
    listen          8085;
    server_name     127.0.0.1;

    location / {
       proxy_pass http://backend;
   }

}

upstream backend{  #定义一组后端服务器的指令块
    server 192.168.101.18:9001; #server指令
    server 192.168.101.20:9001;
    server 192.168.101.87:9001;
}

下面使用upstream与server执行测试负载均衡

环境:三台服务器分别是192.168.101.18,192.168.101.20,192.168.101.87
三台服务器的nginx配置
192.168.101.18

server{
        listen          9001;
        server_name     localhost;
        default_type text/html;
        return 200 '<h1>192.168.101.18:9001</h1>';
    }

192.168.101.20

server{
        listen          9001;
        server_name     localhost;
        default_type text/html;
        return 200 '<h1>192.168.101.20:9001</h1>';
    }

192.168.101.87

server{
        listen          9001;
        server_name     localhost;
        default_type text/html;
        return 200 '<h1>192.168.101.87:9001</h1>';
    }

代理服务器设置

server {
        listen          8085;
        server_name     127.0.0.1;

        location / {
           proxy_pass http://backend;
       }

    }
    
    upstream backend{
        server 192.168.101.18:9001;
        server 192.168.101.20:9001;
        server 192.168.101.87:9001;
    }

页面访问测试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

负载均衡状态

代理服务器在负责均衡调度中的状态有以下几个:

down 当前的server暂时不参与负载均衡
backup 预留的备份服务器
max_fails 允许请求失败的次数
fail_timeout 经过max_fails失败后, 服务暂停时间
max_conns 限制最大的接收连接数

down 该状态一般会对需要停机维护的服务器进行设置。

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

upstream backend{
        server 192.168.101.18:9001 down; #标记为不可用
        server 192.168.101.20:9001;
        server 192.168.101.87:9001;
   }

访问测试
在这里插入图片描述
在这里插入图片描述

服务器只在两台之间轮询

backup

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

server {
        listen          8085;
        server_name     127.0.0.1;

        location / {
           proxy_pass http://backend;
       }

  }
 
 upstream backend{
        server 192.168.101.18:9001 down; #标记为不可用
        server 192.168.101.20:9001 backup;
        server 192.168.101.87:9001;
   }

测试:
标记后无论刷新多少次都只有一台服务器可以用
在这里插入图片描述
在这里插入图片描述
模拟192.168.101.87不可用
使用防火墙关闭9001端口
在这里插入图片描述
访问测试
在这里插入图片描述

此时备用服务器192.168.101.20可以连接了

max_conns

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

 server {
        listen          8085;
        server_name     127.0.0.1;

        location / {
           proxy_pass http://backend;
       }

  }
 
 upstream backend{
        server 192.168.101.18:9001 down;
        server 192.168.101.20:9001 max_conns=10;
        server 192.168.101.87:9001;
   }
max_fails和fail_timeout

max_fails=number:设置允许请求代理服务器失败的次数,默认为1。
fail_timeout=time:设置经过max_fails失败后,服务暂停的时间,默认是10秒。

  server {
        listen          8085;
        server_name     127.0.0.1;

        location / {
           proxy_pass http://backend;
       }

  }
 
 upstream backend{
        server 192.168.101.18:9001 down;
        server 192.168.101.20:9001 backup;
        server 192.168.101.87:9001 max_fails=3 fail_timeout=20;
   }

模拟192.168.101.87:9001暂时不可用,关闭9001端口
在这里插入图片描述
测试 :快速失败超过3次后 ,将防火墙端口添加回来
在这里插入图片描述

负载均衡策略

nginx有如下六种负载均衡的算法
轮询 默认方式
weight 权重方式
ip_hash 依据ip分配方式
least_conn 依据最少连接方式
url_hash 依据URL分配方式
fair 依据响应时间方式

轮询

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

 server {
        listen          8085;
        server_name     127.0.0.1;

        location / {
           proxy_pass http://backend;
       }

  }
 
 upstream backend{
        server 192.168.101.18:9001 weight=1; #默认值,无论写不写都是weight=1
        server 192.168.101.20:9001;
        server 192.168.101.87:9001;
   }
weight加权[加权轮询]

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

 server {
        listen          8085;
        server_name     127.0.0.1;

        location / {
           proxy_pass http://backend;
       }

  }

upstream backend{
        server 192.168.101.18:9001 weight=10;
        server 192.168.101.20:9001 weight=6;
        server 192.168.101.87:9001 weight=2;
   }

测试
在这里插入图片描述

访问次数
192.168.101.18 11
192.168.101.20 7
192.168.101.87 2
从结果看 87服务器是最少的访问量
18是最多的 其次是20

ip_hash

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

server {
        listen          8085;
        server_name     127.0.0.1;

        location / {
           proxy_pass http://backend;
       }

  }
  upstream backend{
        ip_hash;  # ip_hash设置
        server 192.168.101.18:9001 weight=1;
        server 192.168.101.20:9001 weight=1;
        server 192.168.101.87:9001 weight=1;
   }

访问测试
在这里插入图片描述
ip_hash的缺点是无法保证后端服务器的负载均衡,可能导致有些后端服务器接收到的请求多,有些后端服务器接收的请求少,而且设置后端服务器权重等方法将不起作用。

least_conn

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

server {
        listen          8085;
        server_name     127.0.0.1;

        location / {
           proxy_pass http://backend;
       }

  }
  
upstream backend{
        least_conn;
        server 192.168.101.18:9001;
        server 192.168.101.20:9001;
        server 192.168.101.87:9001;
   }

测试通过jmeter对18服务器施加压力测试
在这里插入图片描述

但是最终好像没什么效果 18服务器并没有因为连接过多而被减少连接。
在这里插入图片描述

url_hash

当使用 url_hash 时,Nginx 会根据请求的URL计算出一个哈希值,然后将这个哈希值映射到后端服务器,以此来实现负载均衡。这种方式可以确保具有相同URL的请求总是被分发到同一个后端服务器,从而提高缓存的一致性和效率。

upstream backend{
        hash $request_uri;
        server 192.168.101.18:9001;
        server 192.168.101.20:9001;
        server 192.168.101.87:9001;
   }

测试 :只要uri不变则返回的地址也不会变
在这里插入图片描述
地址发生变更 负载均衡的服务器也会发生变化
在这里插入图片描述

fair

fair采用的不是内建负载均衡使用的轮换的均衡算法,而是可以根据页面大小、加载时间长短智能的进行负载均衡。要使用第三方模块的fair负载均衡策略需要添加nginx-upstream-fair模块。
安装成功后测试
在这里插入图片描述
没有什么复杂业务,看不出什么效果

对特定资源实现负载均衡
upstream videobackend{
    server 192.168.101.18:9001;
    server 192.168.101.20:9001;
}
upstream filebackend{
    server 192.168.101.87:9001;
    server 192.168.101.89:9001;
}
server {
    listen 8084;
    server_name localhost;
    location /video/ { #通过指定路径负载均衡
        proxy_pass http://videobackend;
    }
    location /file/ {
        proxy_pass http://filebackend;
    }
}
对不同域名实现负载均衡
upstream homebackend{
    server 192.168.101.18:9001;
    server 192.168.101.20:9001;
}
upstream homelandbackend{
    server 192.168.101.87:9001;
    server 192.168.101.89:9001;
}
server {
    listen    8085;
    server_name www.home.com;
    location / {
        proxy_pass http://homebackend;
    }
}
server {
    listen    8086;
    server_name www.homeland.com;
    location / {
        proxy_pass http://homelandbackend; 
    }
}
实现带有URL重写的负载均衡
server {
        listen          8086;
        server_name     127.0.0.1;
        location /file/ {
                rewrite ^(/file/.*) /server /$1 last; #正则表达式说明:"^(/file/.*)"请求以file开头且"."转义后的"*"匹配任意后缀结尾 然后将地址重写到 /server location "/$1"表示前面括号的内容拼接到/server后面 "last"表示在当前的server重新查找location
        }
        location /server {
           proxy_pass http://backend;
       }
    }

   upstream backend{
        #hash $request_uri;
        fair;
        server 192.168.101.18:9001;
        server 192.168.101.20:9001;
        server 192.168.101.87:9001;
   }

测试
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1962284.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习基础】机器学习概述与实践基础

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…

Docker中使用自定义网络方式实现Redis集群部署与测试流程

场景 Docker中Docker网络-理解Docker0与自定义网络的使用示例&#xff1a; Docker中Docker网络-理解Docker0与自定义网络的使用示例-CSDN博客 参考上面的流程实现自定义网络的实现。 下面记录其应用实例&#xff0c;使用Docker的自定义网络实现redis集群部署。 注&#xf…

IP地址https证书的优势与申请途径

一、IP地址SSL证书的优势 无需域名&#xff1a;对于一些内部系统或者专用设备而言&#xff0c;它们可能不具有域名&#xff0c;但仍需保障通信安全。IP地址SSL证书正好满足这一需求。简化管理&#xff1a;对于拥有大量设备的企业来说&#xff0c;维护每个设备的域名可能是一个…

tomato-靶机渗透

tomato-靶机 一、安装靶机环境 下载双击.ova文件&#xff0c;写文件名路径导入 打开虚拟机用NAT模式 编辑–>虚拟网络编辑器查看IP段 二、信息收集 1.御剑端口扫描查找该虚拟机的IP 访问网站 扫目录 dirb http://192.168.30.130 收集到目录 /server-status /antibot_im…

成为git砖家(9): git checkout <commit> <file> 的含义

文章目录 1. 目的2. 官方文档解释3. Tower 的解释4. References 1. 目的 git checkout 命令承载了非常多的功能&#xff0c; 想要一次全弄懂&#xff0c;不太现实&#xff1b; 这次白鱼带领大家学习 git checkout <file> 的用法。 老规矩&#xff0c;先查看 git checko…

鸿蒙 HarmonyOS NEXT端云一体化开发-云数据库篇

一、概述 云数据库是一款基于对象模型的数据库&#xff0c;采用存储区、对象类型和对象三级结构。 数据模型 存储区 存储区是一个独立的数据存储区域&#xff0c;多个数据存储区之间相互独立&#xff0c;每个存储区拥有完全相同的对象类型定义 --类似于关系型数据库中的da…

如何有效管理众多账号密码:选择适合你的密码管理工具

在如今的数字化时代&#xff0c;我们的生活几乎离不开各种互联网应用和服务。从社交媒体到在线银行&#xff0c;从购物网站到工作平台&#xff0c;每个应用都要求我们注册账号并设置密码。 随着账号数量的不断增加&#xff0c;管理这些密码成为了一个令人头疼的问题。幸运的是…

AMEYA360:上海雷卯电子CAN BUS芯片静电浪涌击穿整改方案

在现代电子系统中&#xff0c;CAN Bus(Controller Area Network Bus&#xff0c;控制器局域网络总线)作为一种常用的通信协议&#xff0c;标准CAN通常指的是CAN 2.0A和CAN 2.0B协议&#xff0c;其最大通讯速率为1Mbps。而高速CAN通常指的是CAN FD(CAN Flexible Data-rate)协议&…

如何磁盘覆写

使用命令提示符写0 命令提示符是Windows系统内置的一个非常实用的工具&#xff0c;可以通过几行短短的命令来完成各种各样的电脑相关操作而无需开启应用程序&#xff0c;所以我们可以通过命令提示符中的format命令来完成硬盘写0任务。 步骤1. 在搜索框中输入cmd并以管理员身份…

每日一题系列-两个数组的交集

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” class Solution { public:int hash[1010] {0};vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {vector<int> ret;for(a…

漏洞复现-路由器TOTOLINK-A6000R-RCE

本文来自无问社区&#xff0c;更多漏洞信息可前往查看http://wwlib.cn/index.php/artread/artid/14996.html 0x01 产品简介 TOTOLINK A6000R是一款性能卓越的无线路由器&#xff0c;采用先进的技术和设计&#xff0c;为用户提供出色的网络体验。其支持最新的Wi-Fi标准&#x…

Java学习----类和对象与封装

目录 一、面向对象和面向过程二、类类的定义类的实例化this引用&#xff08;这一块一定要看懂哦&#xff09;类的构造方法成员变量的初始化 三、封装包常见的包 四、关于static初始化 五、代码块六、对象的打印--toString 一、面向对象和面向过程 众所周知&#xff0c;Java语言…

HomeServer平台选择,介绍常用功能

​​ 平台选择 HomeServer 的性能要求不高&#xff0c;以下是我的硬件参数&#xff0c;可供参考&#xff1a; ‍ 硬件&#xff1a; 平台&#xff1a;旧笔记本CPU&#xff1a;i5 4210u内存 8G硬盘&#xff1a;128G 固态做系统盘&#xff0c;1T1T 机械盘组 RAID1 做存储。硬…

计算机网络-七层协议栈介绍

之前介绍了网络世界的构成&#xff0c;从宏观角度介绍了网络设备和网络架构&#xff0c;链接: link&#xff0c;但是这种认识过于粗糙&#xff0c;过于肤浅。网络本质上是用于主机之间的通信&#xff0c;是端对端的连接通信&#xff0c;两台计算机可能距离很远&#xff0c;主机…

新书推荐:《码农职场:IT 人求职就业手册》——照亮你的职业道路

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

PHP中关于排名和显示的问题

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

【LLM】五、open-webui+ollama搭建自己的RAG服务

系列文章目录 往期文章回顾&#xff1a; 【LLM】四、RAG简介 【LLM】三、open-webuiollama搭建自己的聊天机器人 【LLM】二、python调用本地的ollama部署的大模型 【LLM】一、利用ollama本地部署大模型 文章目录 ​​​​​​​ 目录 系列文章目录 文章目录 前言 一、RAG是…

计算机网络必会面经

1.键入网址到网页显示&#xff0c;期间发生了什么 2.在TCP/IP网络模型中。TCP将数据进行分段后&#xff0c;为什么还需要IP层继续分片 3.详细说明tcp三次握手&#xff0c;为什么是三次&#xff0c;若每次握手丢了&#xff0c;解决办法是什么 4.详细说明tcp四次挥手&#xff…

基于Docker搭建ELK

目录 1.系统操作 2.搭建es 3.kibana(新起终端跟es一起启动) 4.logstash&#xff08;新起终端和es一起启动&#xff09; 5.修改logstash配置文件 6. 创建索引 7. exit #退出容器 8. 在logstash节点插入数据&#xff0c;测试是否能拿取到&#xff08;下面如果本身有数据…

前端如何实现更换项目主题色的功能?

1、场景 有一个换主题色的功能&#xff0c;如下图&#xff1a; 切换颜色后&#xff0c;将对页面所有部分的色值进行重新设置&#xff0c;符合最新的主题色。 2、实现思路 因为色值比较灵活&#xff0c;可以任意选取&#xff0c;所以最好的实现方式是&#xff0c;根据设置的…