什么是nginx正向代理和反向代理?

什么是代理?

代理(Proxy), 简单理解就是自己做不了的事情或实现不了的功能,委托别人去做。
在这里插入图片描述

什么是正向代理?

在nginx中,正向代理指委托者是客户端,即被代理的对象是客户端
在这里插入图片描述

在这幅图中,由于左边内网中的主机无法访问服务器,被防火墙拦住了,但是右边内网中的主机可以正常访问服务器。于是左边内网中的主机找到了一台可以连接server的nginx服务器,请它作为代理,实现自己无法访问server的功能。由于代理者是客户端,所以这个代理被称为正向代理。此时,nginx服务器对server是不可知的,server并不知道有一个nginx代理服务器,它只会把向自己发送请求的对象当作普通客户端,进行响应即可。对于左边内网中的主机来说,明确知道自己使用了nginx代理服务器进行请求的转发响应获取。
在这里插入图片描述

什么是反向代理?

反向代理委托者就是服务器。
在这里插入图片描述

由于服务器并发压力大,于是向用多个服务器实例处理请求。这些多个服务器之间如何调度,一个请求到了如何选择服务器来响应,这些都是原本服务器无法具备的功能,于是,将这个请求委托给nginx服务器。ngxin来帮代理这个请求转发,选择服务器响应请求的这个功能。由于在这个情况下,nginx服务器是对服务器可知的,而对于客户端主机来说,并不知道存在一个nginx代理服务器,也不知道有多个服务器在进行请求响应。在主机视角,是往某一个域名或ip地址进行请求,然后就会响应。
在这里插入图片描述
把它们结合一下
在这里插入图片描述
nginx服务器1是正向代理服务器,因为它对客户端是可知的,它代理了客户端所不能实现的功能。
nginx服务器2是反向代理服务器,因为它对服务端是可知的,它代理了服务端所不能实现的功能。

Nginx正向代理的实现

https://blog.csdn.net/justinqin/article/details/119519019

Nginx反向代理的实现

在这里插入图片描述

案例-静态动态资源分离

案例说明

假设有一个电商网站,采用前后端分离的方式开发。在后端,分为业务模块(mall)和支付模块(pay)。一共三个团队在开发这个项目,不同团队的命名风格不同:

  • 业务模块会监听8080端口,项目的根路径是/。即会监听 http://127.0.0.1:8080/ 下的所有请求。
  • 支付模块会监听8081端口,项目的根路径是/pay/。即会监听 http://127.0.0.1:8081/pay 下的所有请求。
  • 前端项目,前端项目统一使用默认的80端口向后端发起请求,由于80是默认端口,所以可以省去不写端口。对支付模块是这样请求的:http://127.0.0.1/pay。 对业务模块是这样请求的 http://127.0.0.1/api/
  • 后端开发人员经常沟通,业务模块知道支付模块的请求路径是http://127.0.0.1:8081/pay,所以业务模块在调用支付模块时,直接请求的是http://127.0.0.1:8081/pay

现在希望将项目部署到服务器上,希望服务器不暴露8080和8081端口,指把80端口开启,客户端访问80端口会到访问到前端的页面。有前端项目访问业务模块和支付模块

在这里插入图片描述

使用nginx反向代理,实现静/动态资源分离访问

nginx.conf配置如下:

server {  # 开始一个新的服务器配置块

    listen       80;  # 指定服务器监听的端口号,这里是80,HTTP的默认端口

    server_name  localhost;  # 定义服务器的名称,这里是localhost

    location / {  # 定义一个新的location块,这个块的路径是/,意味着它匹配所有的URL
        root   html;  # 定义请求的根目录,这里是html
        index  index.html index.htm;  # 定义默认的索引文件,这里是index.html和index.htm
    }

    location /pay/ {  # 定义一个新的location块,这个块的路径是/pay/
        proxy_pass http://127.0.0.1:8081/pay/;  # 定义一个反向代理,所有匹配这个路径的请求都会被转发到http://127.0.0.1:8081/pay/
    }

    location /api/ {  # 定义一个新的location块,这个块的路径是/api/
        proxy_pass http://127.0.0.1:8080/;  # 定义一个反向代理,所有匹配这个路径的请求都会被转发到http://127.0.0.1:8080/
    }

    error_page   500 502 503 504  /50x.html;  # 定义错误页面,当服务器返回500、502、503或504错误时,用户会被重定向到/50x.html

    location = /50x.html {  # 定义一个新的location块,这个块的路径是/50x.html
        root   html;  # 定义请求的根目录,这里是html
    }
}  # 结束服务器配置块

配置解析

我们一段一段通过图解的方式来解析这个配置文件。

server {  # 开始一个新的服务器配置块}
listen       80;  # 指定服务器监听的端口号,这里是80,HTTP的默认端口

这里开启了80端口的监听,注意服务器防火墙也要开启80端口。然后所有访问43.142.181.137 80端口的http请求都会被nginxHTTP服务器处理。
在这里插入图片描述

由于80端口是默认端口,所以对43.142.181.137的http请求,如果省去了端口,会默认访问43.142.181.137:80/。没写路径,默认就是根路径

location / {  # 定义一个新的location块,这个块的路径是/,意味着它匹配所有的URL
        root   html;  # 定义请求的根目录,这里是html
        index  index.html index.htm;  # 定义默认的索引文件,这里是index.html和index.htm
    }

第一行:所有对43.142.181.137:80/路径下的请求,都会去请求根路径,nginx安装路径下的html目录
第二行:对直接访问根路径的url获取解析成访问index.html。即43.142.181.137:80/会解析成43.142.181.137:80/index.html
在这里插入图片描述

location /pay/ {  # 定义一个新的location块,这个块的路径是/pay/
        proxy_pass http://127.0.0.1:8081/pay/;  # 定义一个反向代理,所有匹配这个路径的请求都会被转发到http://127.0.0.1:8081/pay/
    }

由于前端项目使用的是80端口,访问的pay路径http://127.0.0.1/pay/,所以是访问不到的部署在同一个服务器上的支付项目的。但是,所有对于80端口的请求都会被nginx拦截,然后发现符合/pay/这个路径格式,所以会 proxy_pass代理转发到http://127.0.0.1:8081/pay/,即可以访问到支付模块。前端不用修改请求后端的url就可以实现,在前端看来,好像我就是访问http://127.0.0.1/pay/得到结果的。
支付模块请求nginx代理一下,因为自己无法去监听80端口下的pay路径,即http://127.0.0.1/pay/。对服务器的代理就是反向代理。在这里插入图片描述

location /api/ {  # 定义一个新的location块,这个块的路径是/api/
        proxy_pass http://127.0.0.1:8080/;  # 定义一个反向代理,所有匹配这个路径的请求都会被转发到http://127.0.0.1:8080/
    }

与前面一样,前端项目访问夜幕模块时用的url时http://127.0.0.1/api,即访问的是80端口下/api/路径。http://127.0.0.1:80/api/。而业务代码开发团队并没将自己的项目路径写成api,而是就是用根路径,且监听的是8080端口。前端不想修改请求url,后端无法同时实现监听80端口的功能,所以把这个功能代理给了nginx服务器,而由于代理对象是服务器不是客户端,所以这是反向代理。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构(六)——图的存储及基本操作

6.2 图的存储及基本操作 6.2.1 邻接矩阵法 邻接矩阵存储无向图、有向图 #define MaxVertexNum 100 //顶点数目的最大值typedef struct{char Vex[MaxVertexNum]; //顶点表int Edge[MaxVertexNum][MaxVertexNum]; //邻接矩阵,边表int vexnum,arcnum; //图的当前…

pytest--python的一种测试框架--pycharm创建项目并进行接口请求

前言 学习request的使用,在用之前,用官方文档提供的接口:https://api.github.com/events; ctrl鼠标左键可以进入被调用函数源码,可以看到第一个参数URL是必须参数,params是选填,**kwargs是关键…

【论文通读】AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation

AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation 前言AbstractMotivationFrameworkConversable AgentsConversation Programming ApplicationA1: Math Problem SolvingA2: Retrieval-Augmented Code Generation and Question AnsweringA3: Decision…

HarmonyOS 应用开发之FA模型启动Stage模型UIAbility

本文介绍FA模型的三种应用组件如何启动Stage模型的UIAbility组件。 PageAbility启动UIAbility 在PageAbility中启动UIAbility和在PageAbility中启动PageAbility的方式完全相同。 import featureAbility from ohos.ability.featureAbility; import { BusinessError } from oh…

Roxlabs代理服务:智能化数据采集的加速器

TOC 一、引言 在这个数据驱动的时代,无论是企业还是个人,对于准确、及时的信息获取都有着前所未有的需求。网络数据采集已成为洞察市场趋势、分析竞争对手动态、优化营销策略的关键手段。然而,面对全球范围内的网站和服务,如何高…

数据结构与算法 循环双链表基本运算与对称算法

一、实验内容 1、实现循环双链表的各种基本运算的算法 (1)初始化循环双链表h (2)依次采用尾插法插入a,b,c,d,e元素 (3)输出循环双链表h; (4)输出循环双链表h长度&am…

Linux初学(十一)中间件

一、web服务 1.1 中间件简介 中间件其实就是一类软件,中间件的作用是让用户可以看到一个网页 总结:客户端可以向服务端发送请求,服务器端会通过中间件程序来接收请求,然后处理请求,最后将处理结果返回给客户端 1.2 中…

vscode初始化node项目

首先需要安装node环境,推荐直接使用nvm 安装node,方便切换node版本 1.npm init 初始化node项目 在命令行输入npm init指令 根据指令创建完成后会在当前目录下生成一个package.json文件,记住运行npm init执行的目录必须是一个空目录 2.创建…

qupath再度更新:使用WSInfer进行深度学习

Open and reusable deep learning for pathology with WSInfer and QuPath Open and reusable deep learning for pathology with WSInfer and QuPath | npj Precision Oncology (nature.com) 以前:数字病理图像分析的开源软件qupath学习 ①-CSDN博客 背景 深度学…

idea从零开发Android 安卓 (超详细)

首先把所有的要准备的说明一下 idea 2023.1 什么版本也都可以操作都是差不多的 gradle 8.7 什么版本也都可以操作都是差不多的 Android SDK 34KPI 下载地址: AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载 …

没有与参数列表匹配的构造函数“cv::VideoWriter::VideoWriter”实例

今天在使用Visual Studio开发与OpenCV相关的程序时,遇到了这样的情况: 第一个参数的下方被打上了红波浪线,我本能的觉得是第一个参数出的问题,于是改成了这样: 红线依然存在,没有消失,把鼠标放在红线下方&#xff0c…

OpenHarmony error: signature verification failed due to not trusted app source

问题:error: signature verification failed due to not trusted app source 今天在做OpenHarmony App开发,之前一直用的设备A在测试开效果,今天换成了设备B,通过DevEco Studio安装应用程序的时候,就出现错误&#xf…

【笔记】动⼿学深度学习(花书)|| Aston Zhang Mu Li Zachary C. LiptonAlexander J. Smola

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 前言 第一章 深度学习简介 第二章 P 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录前言本书…

场效应管(MOS管)知识点总结

目录 一、场效应管(FET)基础知识 1.名称 2.电路符号 3.分类 4.应用场景 5.厂商介绍 二、MOS管G、S、D以及判定 三、耗尽型场效应管工作原理 (耗尽型:depletion mode) 四、NMOS与PMOS的区别 (区别:difference) (多晶硅:polysilicon) …

K8S中部署yaml文件(如Java项目)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

Java学习笔记(23)

多线程 并发 并行 多线程实现方式 1.继承Thread类 自己创建一个类extends thread类 Start方法开启线程,自动执行重写之后的run方法 2.实现runable接口 自己创建一个类implements runnable Myrun不能直接使用getname方法,因为这个方法是thread类的方法…

Kafka入门到实战-第四弹

Kafka入门到实战 Kafka集群搭建官网地址Kafka概述使用Kraft搭建Kafka集群更新计划 Kafka集群搭建 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://kafka.apache.org/Kafka概述 Apache Kafka 是一个开源的分布式事件…

ubuntu2204配置zabbix6.4高可用

zabbix6.4-HA 配置keepalived配置haproxy数据库高可用配置zabbix-server配置proxy配置客户端agent 本实验VMware搭建zabbix6.4高可用集群,搭配haproxykeepalived。 master,node节点搭建haproxykeepalibed主备并配置vip地址 三台控制节点搭建数据库高可用…

rabbitMQ版本问题与下载

都到现在了,大家不会安装东西还是不看版本吧 云服务器买的是centos7,而erlang在24版本后不支持centos7了 所以需要找24版本以下的erlang,而不同erlang对应不同rabbitmq所以需要对应 下载erlang 说实话,自己安装,还是…

无论PC还是Mac,都能畅快地使用移动硬盘 Mac使用NTFS移动硬盘不能读写

如果你拥有一台Mac设备,总会遇到尴尬的那一刻——你在Mac上用得好好的移动硬盘怎么都不能被PC识别到。又或者你朋友在PC上用得好好的移动硬盘,连上你的Mac后,Mac里的文件死活就是拷贝不进移动硬盘里。这种坑,相信大多数使用Mac的小…