什么是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; # 定义服务器的名称,这里是localhostlocation / { # 定义一个新的location块,这个块的路径是/,意味着它匹配所有的URLroot html; # 定义请求的根目录,这里是htmlindex 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.htmllocation = /50x.html { # 定义一个新的location块,这个块的路径是/50x.htmlroot 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块,这个块的路径是/,意味着它匹配所有的URLroot html; # 定义请求的根目录,这里是htmlindex 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服务器,而由于代理对象是服务器不是客户端,所以这是反向代理。
相关文章:
什么是nginx正向代理和反向代理?
什么是代理? 代理(Proxy), 简单理解就是自己做不了的事情或实现不了的功能,委托别人去做。 什么是正向代理? 在nginx中,正向代理指委托者是客户端,即被代理的对象是客户端 在这幅图中,由于左边内网中…...
【Go】面向萌新的Gin框架知识梳理学习笔记
目录 Gin框架简介 路由&路由组 1. 定义基本路由 2. 参数传递 3. 查询字符串参数 4. 路由组 5. 路由中间件 模板渲染 1. 加载模板 2. 定义模板 3. 渲染模板 4. 自定义模板函数 返回json 1. 导入 Gin 包 2. 创建 Gin 引擎 3. 定义路由和处理器函数 4. 运行服…...
baseDao增删改查.
这里写目录标题 1、baseDao增删改查介绍2、basDao类3、BasDao类的作用 1、baseDao增删改查介绍 (1)、增加Create)操作: 通过BaseDao的insert方法可以向数据库中插入一条新的记录。 该方法接受一个实体对象作参数,将该对象的属性映射到表的字…...
什么是面向对象【大白话Java面试题】
什么是面向对象 同样是解决一个问题,面向对象的角度是将问题抽象成对象的形式。通过分类的思维方式,将问题分成几个解决方案的对象。给每个对象赋值属性和方法,对每个对象的细节进行面向过程的思维,执行自己的方法来解决问题。 …...
PyTorch 教程-快速上手指南
文章目录 PyTorch Quickstart1.处理数据2.创建模型3.优化模型参数4.保存模型5.加载模型 PyTorch 基础入门1.Tensors1.1初始化张量1.2张量的属性1.3张量运算1.3.1张量的索引和切片1.3.2张量的连接1.3.3算术运算1.3.4单元素张量转变为Python数值 1.4Tensor与NumPy的桥接1.4.1Tens…...
【有芯职说】数字芯片BES工程师
一、 数字芯片BES工程师简介 今天来聊聊数字芯片BES工程师,其中BES是Back End Support的缩写,就是后端支持的意思。其实这个岗位是数字IC前端设计和数字IC后端设计之间的一座桥,完成从寄存器传输级设计到具体工艺的mapping和实现。这个岗位在…...
暴力破解pdf文档密码
首先安装pdfcrack工具包 apt install pdfcrack 默认密码字典存储在/usr/share/wordlists里,是gz文件,将它解压并copy到pdf目录 然后使用pdfcrack破解 密码在最后一行user-password的单引号里...
蓝桥杯刷题第四天
思路: 这道题很容易即可发现就是简单的暴力即可完成题目,我们只需满足所有数的和为偶数即可保证有满足条件的分法,同时也不需要存下每个输入的数据,只需要知道他是偶数还是奇数即可,因为我们只需要偶数个奇数搭配在一块…...
03-数据库的用户管理
一、创建新用户 mysql> create user xjzw10.0.0.% identified by 1; Query OK, 0 rows affected (0.01 sec) 二、查看当前数据库正在登录的用户 mysql> select user(); ---------------- | user() | ---------------- | rootlocalhost | ---------------- 1 row …...
每日一题 --- 三数之和[力扣][Go]
三数之和 题目:15. 三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 **注意&#x…...
vue render 函数详解 (配参数详解)
vue render 函数详解 (配参数详解) 在 Vue 3 中,render 函数被用来代替 Vue 2 中的模板语法。 它接收一个 h 函数(或者是 createElement 函数的别名),并且返回一个虚拟 DOM。 render 函数的语法结构如下: render(h) …...
ubuntu23.10配置RUST开发环境
系统版本: gcc版本 下载rustup安装脚本: curl --proto =https --tlsv1.2 https://sh.rustup.rs -sSf | sh下载完成后会自动执行 选择默认安装选项 添加cargo安装目录到环境变量 vim ~/.bashrc<...
Vue性能优化--gZip
一、gZip简单介绍 1.1 什么是gzip gzip是GNUzip的缩写,最早用于UNIX系统的文件压缩。HTTP协议上的gzip编码是一种用来改进web应用程序性能的技术,web服务器和客户端(浏览器)必须共同支持gzip。目前主流的浏览器,Chro…...
蓝桥杯第七届大学B组详解
目录 1.煤球数量; 2.生日蜡烛; 3.凑算式 4.方格填数 5.四平方和 6.交换瓶子 7.最大比例 1.煤球数量 题目解析:可以根据题目的意思,找到规律。 1 *- 1个 2 *** 3个 3 ****** 6个 4 ********** 10个 不难发现 第…...
荣誉 | 人大金仓连续三年入选“金融信创优秀解决方案”
3月28日,由中国人民银行领导,中国金融电子化集团有限公司牵头组建的金融信创生态实验室发布“第三期金融信创优秀解决方案”,人大金仓新一代手机银行系统解决方案成功入选,这也是人大金仓金融行业解决方案连续第三年获得用户认可。…...
【关于jupyter notebook】一打开就闪退的问题
在Anaconda Prompt中输入jupyter notebook发现是有个错误。 里面多了一个__init__.py的文件导致报错。删除之后,就可以使用了...
若依 3.8.7版本springboot前后端分离 整合mabatis plus
1.去掉mybatis 这一步我没有操作,看别人的博客有说不去掉可能冲突,也可能不冲突,我试下来就没去掉如需要去除,到总的pom.xml中properties标签下的<mybatis-spring-boot.version>x.x.x</mybatis-spring-boot.version>…...
vue做移动端自适应插件实现rem
1.实现方式 postcss-pxtorem:将px转换为rem amfe-flexible:为html、body提那家font-size,窗口调整的时候重新设置font-size 2.安装与使用 npm install amfe-flexible --save npm install postcss-pxtorem --save-dev 1.再main.js入口文件…...
android 快速实现 图片获取并裁剪(更换头像)
1.获取图片框架:https://github.com/LuckSiege/PictureSelector 2.图片裁剪框架:https://github.com/jdamcd/android-crop 3.Glide图片加载框架:https://github.com/bumptech/glide 2.build.gradle依赖: dependencies {// Pic…...
垃圾回收机制--GC 垃圾收集器--JVM调优-面试题
1.触发垃圾回收的条件 新生代 Eden区域满了,触发young gc (ygc)老年代区域满了,触发full gc (fgc)通过ygc后进入老年代的平均大小大于老年代的可用内存,触发full gc(fgc).程序中主动调用的System.gc()强制执行gc,是full gc,但是不必然执行。…...
Java基础知识总结(29)
Java虚拟机 运行时数据区 程序计数器 方法区:Java 8以后没有方法区,改为了元空间(MetaSpace) 虚拟机栈 堆 本地方法栈 程序计数器 它可以看作是当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里,…...
vue js金额转中文
在Vue.js项目中,实现金额转中文的功能通常涉及编写一个JavaScript方法来处理数字转换逻辑,并在Vue组件中调用该方法。下面是一个基本的示例,展示如何在Vue组件中定义一个计算属性或方法来实现这一功能: /*** 思路: …...
《QT实用小工具·二》图片文字转base64编码
1、概述 源码放在文章末尾 base64编码转换类 图片转base64字符串。base64字符串转图片。字符转base64字符串。base64字符串转字符。后期增加数据压缩。Qt6对base64编码转换进行了重写效率提升至少200%。 下面是demo演示: 项目部分代码如下所示: #ifn…...
Django安装及第一个项目
1、安装python C:\Users\leell>py --version Python 3.10.6 可以看出我的环境python的版本3.10.6,比较新 2、 Python 虚拟环境创建 2.1 官网教程 目前,有两种常用工具可用于创建 Python 虚拟环境: venv 在 Python 3.3 及更高版本中默…...
专升本-物联网
物联网(IOT,Internet of things) 体系结构: 感知层(感知执行层) 网络层 应用层 基本特征: 全面感知 可靠传输 智能处理 作用: 信息采集、转换、收集 信息传递和处理 数据…...
二叉树的遍历C语言
二叉树作为FDS课程最核心的数据结构之一,要求每个人都掌握! 这是一道简单的二叉树问题! 我们将给出一颗二叉树,请你输出它的三种遍历,分别是先序遍历,中序遍历,后序遍历! 输入格式…...
PostgreSQL到Doris的迁移技巧:实时数据同步新选择!
PostgreSQL可以说是目前比较抢手的关系型数据库了,除了兼具多样功能和强大性能之外,还具备非常优秀的可扩展性,更重要的是它还开源,能火不是没有理由的。 虽然PostgreSQL很强大,但是它也有短板,相对于专业…...
【三维】关于万向节锁的直白解释
1. 分析理解 万向节长什么样子,请参考这篇文章中的图片:https://zhuanlan.zhihu.com/p/42519819。 看了很多篇解释性的文章,没怎么看懂。因为我个人最关注的问题点在于: 现实物体旋转为什么没有所谓的万向节锁的bug,…...
程序员的修养 - 变量
变量几乎代码程序程序 中最基础的组成单元,程序员几乎无时无刻都在接触变量。但你对变量的理解真的足够吗? 首先,什么是变量?! 第一层理解:一个可以改变的量,区别于常量,用户可以修…...
判断一个元素是否在可视区域中
文章目录 一、用途二、实现方式offsetTop、scrollTop注意 getBoundingClientRectIntersection Observer创建观察者传入被观察者 三、案例分析 参考文献 一、用途 可视区域即我们浏览网页的设备肉眼可见的区域,如下图 在日常开发中,我们经常需要判断目标…...
c 能用来做网站吗/百度地图广告投放
2010年7月份,NASA和Rackspace公司将Openstack开源。到今天,Openstack马上六周岁了。而6周岁正是孩子上小学一年级的时候,Openstack是否也准备好上小学了呢? Openstack在刚开始的3年受到了整个市场的热捧,很多国际大牌不…...
网站开发流程 图书/网站seo搜索引擎的原理是什么
一个开始 想起来,这个话题,犹如散文一般;以前写过类似的随笔,随着spaces的离开,渐渐忘却那个故事 今天,我想起这个,是因为我想用一个特定的环境来模拟一段痕迹,而不仅仅是一个…...
用vue做pc端网站好吗/线上营销活动案例
经常有人问到oracle中的Where子句的条件书写顺序是否对SQL性能有影响,我的直觉是没有影响,因为如果这个顺序有影响,Oracle应该早就能够做到自动优化,但一直没有关于这方面的确凿证据。在网上查到的文章,一般认为在RBO优…...
一个新网站要怎么做seo/西部数码域名注册官网
jsp使用jdk8时,需要tomcat7以及以上版本,jsp在使用jdk7的时候,tomcat使用tomcat6即可...
wordpress主题 外贸网站/黑帽seo联系方式
本说明是以Git为托管工具发布SpringBoot的Jar包,SVN的请参考Linux环境利用SVNMavenTomcat自动发布项目工程 直接上代码 start.sh 文件 #!/bin/bash# ################################### # # # # 定义变量 …...
网站建设流程效果/惠州seo按天付费
为什么80%的码农都做不了架构师?>>> 这个错误的产生原因是代码中使用了since 1.4, 标记代码只能在jdk 1.4 之后的版本中才能使用,但是项目的编译环境在 1.4 之前,所以idea 给出了这个错误提示。 修复方式:…...