nginx的正向代理,反向代理和负载均衡

news2024/12/28 19:17:52

nginx当中有两种代理方式以及含义:

1.七层代理 (http协议)

  核心:代理的是http的请求和响应

  客户端请求代理服务器:由代理服务器转发客户端的httpd请求,转发到内部的服务器(可以是单台和可以是一组)。

后端的web server再把响应送达代理服务器,最后再到客户端。

反向代理:客户端访问的是代理服务器,代理服务器转发http请求,但是客户端不知道访问的是哪一台服务器

正向代理:客户端访问代理服务器,代理服务器转发请求,客户端只知道代理服务器的地址,后端的web server的IP地址,客户端也不知道。

2. 四层代理 (基于tcp,udp流量转发)

四层代理属于传输层,基于tcp/ip协议层的转发代理方式,基于IP和端口号实现负载均衡。

四层代理无法获取http请求中的url信息,只能对tcp/udp的数据包进行转发。

四层代理和七层代理的区别

1.七层代理总都是用户态,需要对http的请求进行处理和解析,解析过程中,可以根据请求头和请求体的内容进行流量控制,内容过滤。转发速度比较慢,但是提供的功能更高级,用户的体验更好。

四层代理是基于IP地址和端口号,只负责将IP和端口转发到后台服务器上,不对请求做任何处理,只是负责转发而已

四层走的内核,不对请求做出处理,四层代理无法提供更高级的功能,只是转发。所以四层转发速度更快 

速度而言,四层更快,因为四层在内核,而且不做任何处理直接转发。

七层走的用户态,需要对内容进行处理,转发速度相对较慢。

2.选择场景:

七层代理:需要对http请求进行控制和处理,只能选择7层代理(最为常见)

四层代理:只需要转发tcp或者udp的数据包,可以选择四层,也可以选择七层。

七层可以对IP或者端口进行转发,也可以对域名进行代理。

四层只能是IP和端口

3.模块

七层代理只能写在http模块的全局配置当中。

upstream:用于处理http请求,支持反向代理,负载均衡;缓存功能

在upstream模块中,可以配置多个服务器。

四层代理的模块:stream只能写在全局模块当中的单独配置。stream代理无谓协议,只管流量。

对请求做处理:七层

单纯数据转发:四层

正向代理的配置方法

正向代理类似于vpn,科学上网,加速器

test 1:

location / {
  root html;
  index index.html index.htm
  proxy_pass http://20.0.0.30
}

给test2,test3配置index.html:

访问test1(20.0.0.10),显示的结果是test2(20.0.0.30)。这就是正向代理。

正向代理的局限性很低,因为他是一对一的,所以不符合企业级的架构需求,所以用的更多的是反向代理。

反向代理

七层的反向代理:

vim nginx.conf

http {
    ......
        upstream zzr{
        server 20.0.0.20;
        server 20.0.0.30;  //后端服务器的IP地址
    } 
    ......
        location {
        proxy_pass http://zzr;    //次数名字要与upstream一致

    }
}

点击浏览器的刷新会访问的后端服务器

由上述实验可以看到,点击刷新后会改变后端服务器的地址从而是导致页面内容不一致,但其实这里涉及到负载均衡算法,目的是让客户端可以尽可能去访问其中一个服务器,防止工作量过载。

负载均衡的算法

1.rr (round robin):

负载均衡最简单的算法,轮询。请求轮流分配到后端服务器,默认算法,可以不加。

默认算法,每发一次都是最新的请求,服务器上没有缓存。

服务器处理能力相近,而且,对访问量比较小的网站适用。

2.加权轮询(weight):

建立在默认轮询算法的基础之上,为后端服务器分配不同的权重,处理能力强的服务器可以分配的权重值要高一些。(一般权重高的轮询访问次数多,权重少的轮询次数少,但也不绝对)

轮询次数基本按照权重进行分配。服务器上也没有缓存。

中大型网站可以使用加权轮询。

权重高的服务器会被频繁的请求响应。权重低的可能闲置。会和另外一种算法配合使用

http {
 ......
 upstream zzr {
    server 20.0.0.30 weight=2;  // 大概率五次有两次访问20.0.0.30
    server 20.0.0.40 weight=3;  // 大概率五次有三次访问20.0.0.40
  }
}

3.最少连接数算法。会把请求发送到连接数较少的后端服务器。

最少连接数算法可以单独使用,但是一般都是结合加权轮询一块使用,避免所有的请求都发送到处理能力强的服务器。提高整个集群的稳定性。

中型网站,大型网站,日常访问可以满足

vim nginx.conf

http {
    ......
        upstream zzr{
        least_conn;
        #最小连接数限制
        server 20.0.0.20 weight=2;
        server 20.0.0.30 weight=3;
    } 
    ......
}

4.ip_hash:

ip_hash会根据客户端的IP地址解析出一个hash值,然后将请求发送到对应的后端服务器,下次用户在访问时,同意客户端的请求将会被分配到同一台服务器

vim nginx.conf

http {
    ......
        upstream zzr{
        ip_hash;
        server 20.0.0.20 weight=2;
        server 20.0.0.30 weight=3;
    } 
    ......
}

首次访问返回值是200,刷新之后返回值是304(即读取缓存)

特点:

ip_hash第一次访问之后,后续访问是有缓存的,如果后端服务器的数量发送变化,可能会进行重新分配

ip_hash:适用于高并发,请求不会跳转,请求的是缓存。

5.url_hash

根据请求的url地址计算hash值,然后将请求发送到相应的后端服务器,相同的url地址请求会被分配到同一个服务器。

vim nginx.conf

http {
    ......
        upstream zzr{
        hash $request_uri consistent;
        server 20.0.0.20 weight=2;
        server 20.0.0.30 weight=3;
    } 
    ......
}

url_hash 和 ip_hash是结合在一块使用的(不绝对,看实际情况),可以适用于并发较高的场景。主要是ip_hash 和 url_hash,访问之后都是访问本地缓存,可以降低后端服务器的压力

基于域名的反向代理

test1(20.0.0.10)

http {
    upstream zzr {
        server www.kfc.com weight=2;
        server www.bennet.com weight=3;
    }
}

server {
    liisten 80;
    server_name www.zzzr.cc;
    location / {
        root html;
        index index.html index.htm;
        proxy_pass http://zzr;
        proxy_set_header HOST $host;
        #把请求的主机名发送给后端
        proxy_set_header X-Real-IP $remote_addr;
        #后端服务器获取客户端的真实IP
    }
}
wq! 
systemctl restart nginx

域名访问一定要做映射!!!!!!

vim /etc/hosts
20.0.0.10 www.zzzr.cc    代理服务器
20.0.0.30 www.kfc.com    后端服务器1
20.0.0.40 www.bennet.com 后端服务器2

域名访问一定要做地址解析!!!!!!

test2:

test2(20.0.0.30)

vim nginx.conf

server {
    listen       80;
    server_name  www.kfc.com;
    #修改为域名地址
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
wq!
systemctl restart nginx
# 做域名访问映射
 vim /etc/hosts
 20.0.0.10 www.zzzr.cc
 20.0.0.30 www.kfc.com

test3:
 

test3(20.0.0.40)

vim nginx.conf

server {
    listen       80;
    server_name  www.bennet.com;
    #修改为域名地址
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
wq!
systemctl restart nginx
# 做域名访问映射
 vim /etc/hosts
 20.0.0.10 www.zzzr.cc
 20.0.0.40 www.bennet.com

访问结果:

四层的反向代理:

stream {
    upstream test {
         server 20.0.0.20:80;
         server 20.0.0.30:80;
    }
    server {
        listen 80;
        proxy_pass test;
    }
    
}
http {
    ......
}

四层的反向代理的注意事项:

1. 在四层代理中可以使用加权轮询 最小连接数算法也可以实现负载均衡

2. 但是ip_hash,url_hash不可用在stream中使用

3. 因为四层代理只是转发数据包,不能对请求进行处理,只是转发数据包。

3. 只有http七层代理 可以处理请求地址和请求的url

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

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

相关文章

【Android】android.view.WindowManager$BadTokenException 异常fix 解决

背景 爆出如上的问题:官方文档 解决: 我的问题是在于 activity销毁了,结果还要弹出Dialog导致的崩溃,异步处理。 if(isFinishing()){// 在异步情况下,如果activity销毁后再弹dialog 会导致异常,故如果正在…

转行要趁早!盘点网络安全的岗位汇总!

前段时间,知名机构麦可思研究院发布了《2022年中国本科生就业报告》,其中详细列出近五年的本科绿牌专业,信息安全位列第一。 对于网络安全的发展与就业前景,知了姐说过很多,作为当下应届生收入较高的专业之一&#xf…

Vue配置全局变量config.js

Vue配置全局变量config.js 若config.js在public目录下 在index.html中引入 这样配置是为了防止路由前缀&#xff0c;如果直接“/config.js”&#xff0c;若路由没有前缀还好&#xff0c;要是有就需要配置为“<% BASE_URL %>config.js”

windows应用程序告警:帐户名与安全标识间无任何映射完成

目录 一、问题现象 二、问题解决 &#xff08;一&#xff09;官方方法 &#xff08;二&#xff09;问题定位 &#xff08;三&#xff09;问题处理 一、问题现象 今天巡检域控服务器时&#xff0c;发现告警如下&#xff1a; 安全策略已传播&#xff0c;但有警告信息。 0x534…

实战:在Nginx服务器安装SSL证书并配置强制跳转https-2023.10.16(测试成功)

实战&#xff1a;在Nginx服务器安装SSL证书并配置强制跳转https-2023.10.16(测试成功) 原文链接 https://help.aliyun.com/zh/ssl-certificate/user-guide/install-ssl-certificates-on-nginx-servers-or-tengine-servers?spma2c4g.11186623.0.0.7ab93cb39AuLXF 更新时间&…

1-k8s1.23.6-底座搭建-基于docker

这里写自定义目录标题 一、服务器准备二、安装docker三、安装k8s四、安装部署dashboard 一、服务器准备 服务器准备 服务器名称服务器IP角色CPU(最低要求)内存(最低要求)master192.168.248.10master2核2Gworker1192.168.248.11node2核2Gworker2192.168.248.12node2核2G 修改ip&…

JavaSE入门---数据类型与变量

文章目录 数据类型基本数据类型引用数据类型 常量变量变量类型类型转换自动类型转换&#xff08;隐式&#xff09;强制类型转换&#xff08;显式&#xff09; 类型提升 字符串类型 数据类型 在Java中&#xff0c;数据类型基本分为俩类&#xff1a;基本数据类型和引用数据类型。…

代理IP可以用于哪些实际场景?遇到问题如何解决

代理IP的应用场景非常广泛&#xff0c;可以在不同领域提供许多有用的功能。以下是关于代理IP应用场景的详细扩充&#xff0c;包括每个场景的优势和应用建议&#xff0c;以及在使用代理IP时可能遇到的问题和应对方法。 1.价格监控&#xff1a; 商业竞争很大程度上是价格竞争。在…

解决Maven依赖下载缓慢的问题(亲测管用)

解决Maven依赖下载缓慢 众所周知&#xff0c;欲练神功&#xff0c;必先自宫。最好的方式就是不用镜像&#xff0c;自己在本地下载一个稳定版本的Maven&#xff0c;以后每次用的时候直接在IDEA里面一导入就可以。&#xff08;为了保险&#xff0c;在以下的步骤里配置了aliyun镜像…

高防CDN怎样保护网站安全的

在当今数字化时代&#xff0c;互联网安全问题日益严重。网络攻击和数据泄露威胁着个人隐私、企业机密以及关键基础设施的安全。在应对这些挑战方面&#xff0c;高防CDN&#xff08;内容分发网络&#xff09;崭露头角&#xff0c;它不仅提高了性能&#xff0c;还加强了网络安全。…

算法学习——贪心算法

目录 一&#xff0c;柠檬水找零 1.题目 2.题目接口 3.题目解题思路 二&#xff0c;将数组减半的最小操作数 1.题目 2.题目接口 3.解题思路及代码 三&#xff0c;摆动序列 1.题目 2.题目接口 3.解题代码及思路 一&#xff0c;柠檬水找零 1.题目 在柠檬水摊上&#xf…

Linux文件系统 struct file 结构体解析

文章目录 一、open系统调用1.1 简介1.2 files_struct1.2.1 简介1.2.2 init_files1.2.2 CLONE_FILES 1.3 源码分析1.3.1 get_unused_fd_flags1.3.2 do_filp_open1.3.3 fd_install 二、struct file简介三、其他参考资料 一、open系统调用 1.1 简介 NAMEopen, creat - open and …

手撸java对象拷贝工具类(赶快来试试)

今天心血来潮想自己手撸一个对象拷贝工具学习学习&#xff0c;感觉很不错&#xff0c;使用纯原生java&#xff0c;不依赖任何工具类&#xff0c;健壮性就不优化了。技术主要用到了反射和stream&#xff0c;赶快来试试&#xff0c;炒鸡好用&#xff01; /*** 对象拷贝注入* 参数…

加权平均、EMD、小波等方法去噪效果对比

加权平均、EMD、小波等方法去噪效果对比 代码 整体代码如下 %% clear all; clc;load(data_filter120Hz.mat); %可自己生成随机噪声 fs1000;%采样频率是1000Hz %% %生成正弦波信号 tlinspace(0, length(data)/fs-1/fs, length(data)); y1 15*sin(2*pi* 2.8 *t);%生成频率为2.…

如何选择一款适合的工单管理系统?“的修”工单系统有什么优势?

在如今快节奏的单位环境中&#xff0c;一个高效、便捷的工单管理系统对于单位的重要性不言而喻。面对琳琅满目的工单管理系统&#xff0c;单位该如何选择最合适的一款呢&#xff1f;本文将详细评测“的修”工单管理系统&#xff0c;带您了解它的强大功能和优势&#xff0c;帮您…

游戏缺少dll文件用什么修复?dll多种修复方法指南

在玩游戏时&#xff0c;有时候可能会遇到游戏缺少dll文件的问题。dll文件是动态链接库的缩写&#xff0c;它包含了一些函数和资源&#xff0c;游戏运行需要依赖这些文件。如果缺少了某个dll文件&#xff0c;游戏就可能无法正常运行。那么游戏缺少dll文件用什么修复&#xff1f;…

C语言---预处理详解

1.预定义符号 在C语言中有一些内置的预定义符号 __FILE__ __LINE__ __DATE__ __TIME__ __STDC__//进行编译的源文件 //文件当前的行号 //文件被编译的日期 //文件被编译的时间 //如果编译器遵循ANSI C&#xff0c;其值为1&#xff0c;否则未定义 编译器在__STDC__报错,说明,v…

基于IPSec VPN隧道技术的国密加密网关保障电力工控数据安全

IPSec VPN&#xff08;Internet Protocol Security Virtual Private Network&#xff09;隧道技术为电力工控系统提供了重要的数据安全传输手段。该技术能实现身份鉴别和数据加密传输&#xff0c;为系统的防护工作增添了有力的支持。 电力工控系统对数据传输的可靠性要求较高。…

String的intern()方法详解

文章目录 前言一、new String&#xff08;&#xff09;创建了几个对象&#xff1f;二、Stting anew String("ab")new String("c")创建了几个对象三、String的intern()方法四&#xff1a;面试题五&#xff1a;总结 前言 在开发过程中很多朋友&#xff0c;由…

vue.config.js配置proxy代理产生404错误的原因

在使用vue做开发时&#xff0c;请求api接口时为了解决跨域问题&#xff0c;一般会设置proxy代理&#xff0c; 但有时候会莫名其妙的出现404错误&#xff0c;这里总结一下vue设置proxy代理产生404错误的几种原因&#xff1a; 原因1&#xff1a;没有注意vue proxy代理优先级的规…