nginx负载均衡(反向代理)
nginx负载均衡
负载均衡:由反向代理来实现。
nginx的七层代理和四层代理:
七层是最常用的反向代理方式,只能配置在nginx配置文件的http模块当中,而且配置方法名称:upstream模块,不能写在server模块中,也不能写在location模块中,在http模块中是独立的一个配置。
七层代理:七层代理的就是http的请求和响应。
工作原理:
客户端--------->http请求-------->七层代理(代理服务器)----->代理服务器转发http请求到内部的一组服务器(web集群)----->客户端不知道请求的代理服务器还是内部服务器,而且通过代理服务器隐藏了内部服务器的ip。
实际上访问的是代理服务器,请求到代理,代理转发给web服务器。web服务器响应。web服务器响应的。
四层代理:
四层代理是基于tcp/ip协议的层的代理转发方式,可以实现基于ip地址和端口进行负载均衡转发。四层代理是无法获取http请求当中的url信息,只能对tcp/udp数据包进行转发,说白了就是进行流量转发。
配置方法:
stream,steam是不能配置在http模块中,是配置在全局当中,是属于一个独立的模块,不属于其他的任何模块。
四层代理和七层代理之间的区别(面试题):
1.七层走的是http请求,四层走的是tcp/upd的数据包,转发的是流量。七层代理的http请求,可以对请求进行深入的解析和处理,流量控制,内容的过滤。
四层代理不能进行流量控制,也没办法对内容进行过滤。
四层代理通常适用于:需要处理大量连接请求的场景。
七层代理:对请求进行精确处理和控制的场景。
在实际工作中,四层和七层可以配合使用。
2.四层和七层谁的代理速度快?
四层的代理速度比七层代理速度快。
四层代理快原因如下:
1.四层只是流量转发,不能对请求进行解析和控制,所以速度快。
2.四层代理走的是内核,内核转发的是流量,所以速度快。
七层代理慢的原因:
1.七层慢,是因为他对请求进行处理和解析,速度比较慢。
2.七层走的是用户态,访问控制,流量处理,所以速度比较慢。
由此可以看出:七层代理可以提供更高级的服务和更高的用户体验。
正向代理:
proxy_pass 配置代理服务器访问的地址。只能写在location模块当中。
代理服务器配置:
vim /usr/local/nginx/conf/nginx.conf location / {root html;index index.html index.htm;proxy_pass http://20.0.0.102; #表示只要访问本机就会访问到20.0.0.102(web服务器)}改完配置文件要重启服务器:systemctl restart nginx.service
web服务器:
配置20.0.0.102的页面
cd/usr/local/nginx/html
vim index.html
写入网页内容:
hello word!!测试:在浏览器输入----->20.0.0.101
反向代理:
客户端访问代理服务器,代理服务器转发请求或者流量到后端服务器,后端的web服务器会有多台,用户并不知道最终访问的是那一台服务器。
负载均衡 :高可用 可扩展 提高可维护性
在工作中怎么做反向代理?
第一个使用upstream,第二个使用stream做反向代理。
upstream:基于https实现负载均衡。反向代理。
upstream特点:
1.是http请求的负载均衡方法。2.没有缓存。
负载均衡的算法:
1.默认算法:轮询算法(英文:rr),会把请求轮流分配给后端服务器,轮询算法使用与web服务器处理能力相近的情况,默认算法,可以不加。
配置方法:
代理服务器:
代理服务器配置:
vim /usr/local/nginx/conf/nginx.conf upstream my {server 20.0.0.102;server 20.0.0.103;
#指定通过代理服务器101,会把http的请求转到102或者103上location / {root html;index index.html index.htm;proxy_pass http://my; #调用my}小技巧:修改完成配置文件后 可以使用nginx -t查看一下语法是否有误!!
systemctl restart nginx.service #重启服务器
web服务器编写:
在20.0.0.102 和103服务器访问页面进行编写:
vim /usr/local/nginx/html/index.html
20.0.0.102服务器写:hello word 102 !!!
20.0.0.103服务器写:hello word 103 !!!测试:在浏览器输入----->20.0.0.101
2.加权轮询算法:
建立在轮询算法的基础之上,通过给不同的web服务器权重,让处理能力更强的服务器可以分配到更多的请求。虽然配置了权重值,但是轮询的结果未必准确。
配置方法:
代理服务器:
vim /usr/local/nginx/conf/nginx.conf upstream my {server 20.0.0.102 weight=2 ;server 20.0.0.103 weight=3;
#指定通过代理服务器101,转发http请求时候,会往权重高的服务器上转发次数多。
}nginx -t #查看一下语法是否有误!!
systemctl restart nginx.service #重启服务器测试:在浏览器输入----->20.0.0.101
3.ip_hash算法:
根据IP地址 计算出一个hash值,使用ip_hash算法时,同一个客户端的请求会被分配到同一个后端服务器。保证会话的稳定性。缺点是:如果后端的服务器数量发生变化时,hash值会被重新计算,请求的服务器也会发生变化。
配置方法:
代理服务器:
vim /usr/local/nginx/conf/nginx.conf upstream my {ip_hash;server 20.0.0.102 weight=2 ;server 20.0.0.103 weight=3;}
nginx -t #查看一下语法是否有误!!
systemctl restart nginx.service #重启服务器测试:在浏览器输入----->20.0.0.101
4.最少连接数算法:least_conn;会轮询,会将请求发送到当前连接数最少的后端web服务器。适用于后端服务器处理任务耗时不同的情况,避免了所有请求集中在处理能力更强的后端服务器上。会与加权轮询算法配合使用。
配置:
代理服务器配置:
upstream my {least_conn;server 20.0.0.102 weight=2 ;server 20.0.0.103 weight=3;}nginx -t #查看一下语法是否有误!!
systemctl restart nginx.service #重启服务器测试:在浏览器输入----->20.0.0.101
5.url_hash:
根据uri地址计算hash值,使用url_hash会把相同请求的uri会分配到同一个后端web服务器。
配置:
代理服务器配置:
vim /usr/local/nginx/conf/nginx.conf upstream my {hash $request_uri consistent;server 20.0.0.102 weight=2 ;server 20.0.0.103 weight=3;}
nginx -t #查看一下语法是否有误!!
systemctl restart nginx.service #重启服务器测试:在浏览器输入----->20.0.0.101
总结:
小场景:并发量很小,默认算法就可以满足适应条件。
后端web服务器的处理能力有差异:加权轮询和最小连接数配合使用。
大型并发:ip_hash,url_hash算法,第一次请求之后会有本地缓存,而且因为hash算法的原因,请求的后台web服务器不会发生变化,可以提高访问速度,因为访问的是缓存,所以大大减轻了后台服务器的请求压力。
ip_hash,后端web服务器数量发生变化,请求的服务器也会发生变化。
url_hash,请求的地址发生变化,请求的服务器也可能会发生变化。
你是如何做反向代理的?(面试题):
反向代理就是负载均衡,要做负载均衡,就要看场景的并发量(访问人数有多少)。根据这个指标,来确定负载均衡的算法。并发量小:默认轮询或加权轮询,配合最小连接数使用即可。
高并发:使用ip_hash或者url_hash来实现,因为访问一次之后,就不会再切换web服务器,下一次访问就是缓存,不但访问速度快,而且后台web服务器的请求压力也会变小。
基于域名的方式进行负载均衡(反向代理):
代理服务器配置:
upstream my {server www.my1.com;server www.my2.com;}server {listen 80;server_name www.my.com;location / {root html;index index.html index.htm;proxy_pass http://my;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}nginx -t #查看一下语法是否有误!!
systemctl restart nginx.service #重启服务器
echo "20.0.0.101 www.my.com" >> /etc/hosts #在本地做一个hosts映射
web服务器配置:
服务器一:
vim /usr/local/nginx/conf/nginx.conf server {listen 80;server_name www.my1.com;}
nginx -t #查看一下语法是否有误!!
systemctl restart nginx.service #重启服务器
echo "20.0.0.102 www.my1.com" >> /etc/hosts #在本地做一个hosts映射
服务器二:
vim /usr/local/nginx/conf/nginx.conf server {listen 80;server_name www.my2.com;}
nginx -t #查看一下语法是否有误!!
systemctl restart nginx.service #重启服务器
echo "20.0.0.103 www.my2.com" >> /etc/hosts #在本地做一个hosts映射
客户端配置:
echo "20.0.0.101 www.my.com" >> /etc/hosts #在本地做一个hosts映射echo "20.0.0.102 www.my1.com" >> /etc/hosts #在本地做一个hosts映射
echo "20.0.0.103 www.my2.com" >> /etc/hosts #在本地做一个hosts映射
stream 模块的配置方法:
events {worker_connections 1024;
}#stream是单独的模块
stream {upstream test {server 20.0.0.102:80 weight=1;server 20.0.0.103:80 weight=1; 权重轮询}server {listen 8080;proxy_pass test;}}
相关文章:

nginx负载均衡(反向代理)
nginx负载均衡 负载均衡:由反向代理来实现。 nginx的七层代理和四层代理: 七层是最常用的反向代理方式,只能配置在nginx配置文件的http模块当中,而且配置方法名称:upstream模块,不能写在server模块中&#…...
AWS上传私有windows server2019镜像64位
一.制作自己的镜像 我使用的是esxi,建立一个windows虚拟机,开启。 根据aws官方文档,虚拟机里的系统重要需要注意以下几点: 1.只有一张网卡,ip获取配置成dhcp。 2.关闭系统防火墙。 3.开启windows rdp 远程功能。 …...
查看当前仓库对应的远程仓库地址
查看当前仓库对应的远程仓库地址 git remote -v这条命令能显示你当前仓库中已经添加了的仓库名和对应的仓库地址,通常来讲,会有两条一模一样的记录,分别是fetch和push,其中fetch是用来从远程同步 push是用来推送到远程 修改仓库…...
flask-script
# django中,有命令 python manage.py runserver python manage.py makemigrations ...自定制命令(django如何自定制命令)... -python manage.py init_db excel文件路径 指定表名 # flask启动项目,像djag…...

标准的OSI七层模型(其实了解tcp足矣)
七层模型,亦称OSI(Open System Interconnection)。参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系,一般称为OSI参考模型或七层模型。 它是一个七层的、抽象的模型体&#x…...

【C++】初识模板
C模板入门 一、泛型编程 二、函数模板1. 函数模板的概念2. 函数模板格式3. 函数模板的原理4. 函数模板的实例化5. 模板参数的匹配原则 三、类模板 一、泛型编程 假设我们想实现一个交换函数,并且支持不同类型的参数实现,我们可以用 typedef 将类型进行重…...
学习Pull request
我从我的导师Xing Fan指导和帮助,利用我的导师chunlong Li提供ChatGPT,在百度搜索,学习一些资料。以下很多内容都是我的导师Xing Fan做的。谢谢Xing Fan。考虑到隐私,不适合截图公开。 第一步: 打开Git Bash Here 如…...

python爬虫实战(1)--爬取新闻数据
想要每天看到新闻数据又不想占用太多时间去整理,萌生自己抓取新闻网站的想法。 1. 准备工作 使用python语言可以快速实现,调用BeautifulSoup包里面的方法 安装BeautifulSoup pip install BeautifulSoup完成以后引入项目 2. 开发 定义请求头…...
React Hooks 详细使用介绍
useState 状态管理 useState 是 React 中的一个基础 Hook,允许你在不使用 class 组件的情况下管理组件状态。 参数 初始值 你可以直接传递状态的初始值给 useState: const [name, setName] useState("John");使用函数设置初始值 当初始…...

python版《羊了个羊》游戏开发第一天
Python小型项目实战教学课《羊了个羊》 一、项目开发大纲(初级) 版本1.0:基本开发 课次 内容 技术 第一天 基本游戏地图数据 面向过程 第二天 鼠标点击和移动 面向对象 第三天 消除 设计模式:单例模式 第四天 完整…...

【uniapp】原生子窗体subNvue的使用与踩坑
需求 最近接到个需求, 需要在video组件上弹出弹窗, 也就是覆盖video这个原生组件 未播放时, 弹窗可以覆盖, 但是当video播放时, 写的弹窗就覆盖不了了 因为video是原生组件, 层级非常高, 普通标签是覆盖不了的, map标签同理 覆盖原生组件, 官方给出解决办法一. 使用cover-view…...

浅析 C 语言的共用体、枚举和位域
前言 最近在尝试阅读一些系统库的源码,但是其中存在很多让我感到既熟悉又陌生的语法。经过资料查阅,发现是 C 语言中的共用体和位域。于是,趁着课本还没有扔掉,将一些相关的知识点记录在本文。 文章目录 前言共用体 (union)枚举…...

TartanVO: A Generalizable Learning-based VO 论文阅读
论文信息 题目:TartanVO: A Generalizable Learning-based VO 作者:Wenshan Wang, Yaoyu Hu 来源:ICRL 时间:2021 代码地址:https://github.com/castacks/tartanvo Abstract 我们提出了第一个基于学习的视觉里程计&…...

单例模式-java实现
介绍 单例模式的意图:保证某个类在系统中有且仅有一个实例。 我们可以看到下面的类图:一般的单例的实现,是属性中保持着一个自己的私有静态实例引用,还有一个私有的构造方法,然后再开放一个静态的获取实例的方法给外界…...
篇八:装饰器模式:动态增加功能
篇八:“装饰器模式:动态增加功能” 开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun/。 另外有2本不错的关于设计模式的资料,…...

算法通关村第五关——n数之和问题解析
1. 两数之和问题 力扣第1题就是两数之和问题,给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一…...

小白到运维工程师自学之路 第七十集 (Kubernetes集群部署)
一、概述 Kubernetes(简称K8S)是一个开源的容器编排和管理平台,是由Google发起并捐赠给Cloud Native Computing Foundation(CNCF)管理的项目。它的目标是简化容器化应用的部署、扩展、管理和自动化操作。 以下是Kube…...

docker 部署mysql 5.6集群
docker搭建mysql的集群(一主双从) 1.拉取镜像 docker pull mysql:5.6 2.启动master容器 docker run -it -d --name mysql_master -p 3306:3306 --ip 192.168.162.100 \ -v /data/mysql_master/mysql:/var/lib/mysql \ -v /data/mysql_master/conf.d…...
mysql基本信息查询
1.查看mysql表的数据量 select table_schema as 数据库, table_name as 表名, table_rows as 记录数, truncate(data_length/1024/1024, 2) as 数据容量(MB), truncate(index_length/1024/1024, 2) as 索引容量(MB) from information_schema.tables order by data_length des…...
C语言初学者必读:使用for循环将数字从大到小排序并输出
在学习C语言编程的过程中,了解数组的输入和排序是非常基础且重要的一部分。本文将以通俗易懂的方式,教你如何使用for循环实现将输入的n个数字按照从大到小的顺序输出,帮助你逐步掌握数组的使用和排序算法。 第一步:获取用户输入 …...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...