Nginx之正向代理与反向代理

news2025/1/20 10:45:26

1.什么是代理

打工人张三最近换了新工作,原来的住房离公司的路程太远,于是乎想要重新找一个离工作地不那么远的住房,由于工作繁忙,没有时间看房。

房东王五名下有2套住房,一套自己住,另一套想租出去,难免会与形形色色的租客打交道,带他们实地看房,但是自己社恐,不喜欢与陌生人打交道。

打工人张三没时间找房,房东王五社恐不愿与陌生人打交道,于是乎,房屋中介应运而生。

张三委托房屋中介李四为自己寻找住房,房东王五授权房屋中介李四带看,两者的问题迎刃而解。

这里的房屋中介就是一种代理。

2.正向代理与反向代理

在代理中,分为3个角色,客户端代理服务器服务端。并且针对被代理的角色不同,又分为正向代理和反向代理。

正向代理:被代理的对象是客户端。张三发起看房需求,属于客户端。

反向代理:被代理的对象是服务端。王五提供住房资源,属于服务端。

是不是一脸懵逼?

我们来理理正向代理和反向代理的过程。

2.1 正向代理

在正向代理过程中,代理服务器代理的是客户端,我们将客户端和代理服务器看作是一个整体,客户端知晓真实服务端地址,但是无法直接访问,因此通过代理服务器向服务端发送请求,服务端并不知晓真实客户端的信息。

正向代理使用场景:

  • 通过正向代理服务器,隐藏客户端信息,匿名访问。
  • 通过正向代理服务器,访问无法直接访问的资源。

2.2 反向代理

可以看到,在反向代理过程中,代理服务器代理的服务端,我们将代理服务器和服务端看作是一个整体,客户端无法知晓真实服务端的地址,只能通过代理服务器进行访问,服务端通过代理服务器接收并响应请求。

反向代理使用场景:

  • 通过反向代理服务器,解决跨域问题。
  • 通过反向代理服务器,统一访问入口。
  • 通过反向代理服务器,避免暴露真实服务端信息,提高安全性。
  • 通过反向代理服务器,实现负载均衡。

4.Nginx提供代理服务

Nginx作为代理服务器,提供了ngx_http_proxy_module模块来实现正向代理和反向代理。按照惯例,我们先来看看该模块提供的常用指令。

官方文档:https://nginx.org/en/docs/http/ngx_http_proxy_module.html

4.1 正向代理

Nginx作为正向代理服务器常用的指令如下:

1)resolver指令

该指令配置域名解析服务器的地址,如果客户端通过域名访问服务端,需要配置该指令。

作用域:http, server, location

语法:resolver address … [valid=time] [ipv4=on|off] [ipv6=on|off [status_zone=zone];

2)proxy_pass指令

在正向代理中,该指令配置的地址从客户端的请求中获取。

作用域:location, if in location, limit_except

语法:proxy_pass URL;

示例:

proxy_pass http://$host$request_uri;

3)正向代理示例

服务端:192.168.110.98

代理服务器:192.168.110.101

代理服务器配置:

server {
	listen 8080;
	server_name localhost;
	# 解析域名时需要配置
	# resolver 8.8.8.8;
	location / {
		proxy_pass http://$host$request_uri;
	}
}

服务端配置:

server {
	listen 80;
	server_name localhost;
	location / {
		root html;
		index index.html;
	}
}

客户端配置:

在这里插入图片描述

访问http://192.168.110.98

查看服务端的access.log,可以看到访问者的IP是192.168.110.101,说明代理成功。

4.2 反向代理

Nginx作为反向代理服务器常用的指令如下:

1)proxy_pass指令

在反向代理中,该指令配置被代理的服务端的URL地址。

作用域:location, if in location, limit_except

语法:proxy_pass URL;

示例:

# 访问的服务端地址为:http://192.168.110.98
location / {
	proxy_pass http://192.168.110.98;
}

# 访问的服务端地址为:http://192.168.110.98,意味着URL的结尾加不加/都一样
location / {
	proxy_pass http://192.168.110.98/;
}

# 访问的服务端地址为:http://192.168.110.98/proxy1
location /proxy1 {
	proxy_pass http://192.168.110.98;
}

# 访问的服务端地址为:http://192.168.110.98
location /proxy2 {
	proxy_pass http://192.168.110.98/;
}

🔔Tips:根据实际需要判断proxy_pass的URL值是否需要以/结尾。

2)proxy_set_header指令

该指令可以更改客户端请求的请求头信息或添加新的请求头信息,并将这些信息传递给被代理的服务端。

作用域:http, server, location

语法:proxy_set_header field value;

默认值:proxy_set_header Host $proxy_host;
proxy_set_header Connection close;

$proxy_host指的是被代理的服务端的IP名称和端口。

🔔Tips:在经过反向代理之后,被代理的服务器获取到的$remote_addr将是代理服务器的地址,因此在获取真实客户端的IP地址时需要注意。

如果要获取客户端的真实IP地址,我们可以使用通过proxy_set_header 指令添加新的header在反向代理服务器中进行设置。

proxy_set_header X-Real-IP $remote_addr;

然后在服务端就可以通过$http_X_Real_IP或者$http_x_real_ip来获取。

如果是代理websocket,则需要进行如下配置:

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

3)反向代理示例

服务端:192.168.110.98

代理服务器:192.168.110.101

代理服务器配置:

location /proxy {
	proxy_set_header X-Real-IP $remote_addr;
	proxy_pass http://192.168.110.98;
}

服务端配置:

location /proxy {
	default_type text/plain;
	return 200 $host===$remote_addr===$http_x_real_ip;
}

访问http://192.168.110.101/proxy

前面我们知道$remote_addr是用来获取客户端的IP地址,但是我们这里获取到的是代理服务器的IP地址,因此我们新定义一个X-Real-IP字段来传递发起请求的客户端的真实IP。

以上就是Nginx实现正向代理和反向代理,Nginx是多模块化的,还有很多高级功能,我们后面继续探索。

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

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

相关文章

shell脚本----sed命令

文章目录 一、sed的工作流程二、sed的操作三、Sed命令使用3.1打印内容3.2删除行3.3替换3.4插入3.5分组调用 一、sed的工作流程 sed概述 sed编辑器时一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。 sed编辑器可以根据命令来处理…

(转载)从0开始学matlab(第3天)—多维数组

正如我们所看到的,MATLAB 的数组可能是一维或多维的。一维的数组可以形象地看作一系列的数垂直地罗列起来,用一个下标就可以调用数组中的元素(如图 a)。这样的数组适用于一个变量的函数,例如在规定的时间间隔后一系列…

C语言实战 - 贪吃蛇(图像界面)

由于本人精力有限,暂时先把素材和代码放上,等以后有空再补教程。 目录 效果预览 准备工作 EasyX图形库 音频素材 代码编写 Transfer.h文件 game.cpp文件 main.c文件 效果预览 先来看一下最终成品效果 贪吃蛇图形界面 准备工作 EasyX图形库 这…

Stable Diffusion云端部署只需三步, 不吃电脑配置, 模型快速部署

牙叔教程 简单易懂 我是小白, 小白跟我一步一步做就可以了, 鼠标点两下就OK了, 学点新东西, 好吗? 不想学的就走吧, 离我远点. Stable Diffusion是什么 Stable diffusion是一个基于Latent Diffusion Models(潜在扩散模型,LDMs)的文图生成…

瑞吉外卖 - 后台系统登陆功能(3)

某马瑞吉外卖单体架构项目完整开发文档,基于 Spring Boot 2.7.11 JDK 11。预计 5 月 20 日前更新完成,有需要的胖友记得一键三连,关注主页 “瑞吉外卖” 专栏获取最新文章。 相关资料:https://pan.baidu.com/s/1rO1Vytcp67mcw-PD…

Baumer工业相机堡盟工业相机IO介绍与配置

Baumer工业相机堡盟工业相机IO介绍与配置 Baumer工业相机Baumer工业相机IO的作用Baumer工业相机IO的作用Baumer工业相机IO上点连 Baumer工业相机 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运…

Android基础复习:Service组件详解

Android基础复习:Service组件详解 概况 Service组件是一种可在后台执行长时间运行操作而不提供界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。此外,组件可通过绑定到服务与之进…

【动手学深度学习】现代卷积神经网络汇总

文章目录 1 LeNet2 AlexNet3 VGG4 NiN5 GoogLeNet6 ResNet7 DenseNet 本文为作者阅读学习李沐老师《动手学深度学习》一书的阶段性读书总结,原书地址为:Dive into Deep Learning。 1 LeNet 网络结构 实现代码 net nn.Sequential(nn.Conv2d(1, 6, kern…

springboot+vue社区医院管理服务系统(源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的社区医院管理服务系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者&#xff1…

从C出发 32 --- 自定义数据类型(上)

字节 指的就是 byte , 而一个 byte 占用 8 位, 在 C 语言里面有没有 直接提供 表示 8 位的数据类型? char 最小的整型,就可以表示 8 位的数据类型 char 的取值范围 -128 - 127 一个字节的取值范围是 0 - 25…

RK3308B部署mobilenetv2_ssdlite

目录 1. 在PC端运行mobilenetv2_ssdlite模型1.1 安装NCNN和Opencv1.1.1 安装NCNN1.1.2 安装Opencv 1.2 运行mobilenetv2_ssdlite模型 2. 交叉编译部署到RK3308B板子上并运行模型2.1 交叉编译NCNN和Opencv2.1.1 交叉编译Opencv2.1.2 交叉编译ONNX 2.2 交叉编译mobilenetv2_ssdli…

总结850

学习目标: 月目标:5月(张宇强化前10讲,背诵15篇短文,熟词僻义300词基础词) 周目标:张宇强化前3讲并完成相应的习题并记录,英语背3篇文章并回诵 每日必复习(5分钟&#…

深度学习环境配置系列文章(五):配置Docker深度学习开发环境

深度学习环境配置系列文章目录 第一章 专业名称和配置方案介绍 第二章 Anaconda配置Python和PyTorch 第三章 配置VS Code和Jupyter的Python环境 第四章 配置Windows11和Linux双系统 第五章 配置Docker深度学习开发环境 第五章文章目录 深度学习环境配置系列文章目录前言一, Do…

AI工具分享第二期:11款国内外AI绘画提示词工具整理

工具整理自未来百科AI工具箱,更多提示词工具可自行寻找 Midjourney中文教程 Midjourney 学习导航 PromptHero 描述 通过 DALL-E、Stable Diffusion、Midjourney 等 AI 模型搜索数以百万计的艺术图像… PromptDen AI 在线社区促使爱好者联系、协作和分享想法。 …

支付系统设计三:渠道网关设计07-后置处理

文章目录 前言一、订单数据更新1. 领域模型更新服务工厂2. 聚合创建工厂2.1 数据库更新服务2.2 聚合创建工厂 二、限流渠道入队三、异步通知1. 判断是否需要通知2. 组装异步通知报文3. 获取异步通知协议类型3. 异步通知 总结 前言 本篇将继业务处理之后的后置处理逻辑进行介绍&…

瑞吉外卖 - 后台系统退出功能(4)

某马瑞吉外卖单体架构项目完整开发文档,基于 Spring Boot 2.7.11 JDK 11。预计 5 月 20 日前更新完成,有需要的胖友记得一键三连,关注主页 “瑞吉外卖” 专栏获取最新文章。 相关资料:https://pan.baidu.com/s/1rO1Vytcp67mcw-PD…

瑞吉外卖 - 项目介绍(1)

某马瑞吉外卖单体架构项目完整开发文档,基于 Spring Boot 2.7.11 JDK 11。预计 5 月 20 日前更新完成,有需要的胖友记得一键三连,关注主页 “瑞吉外卖” 专栏获取最新文章。 相关资料:https://pan.baidu.com/s/1rO1Vytcp67mcw-PD…

CSS盒子模型、表格标签(table)、表单标签(form)

盒子:页面中所有的元素(标签),都可以看做是一个 盒子,由盒子将页面中的元素包含在一个矩形区域内,通过盒子的视角更方便的进行页面布局 盒子模型组成:内容区域(content)…

Qt扫盲-QScatterSeries理论总结

QScatterSeries理论总结 一、概述二、使用三、扩展四、扩展使用1.创建描述散点图对象2. 对散点图像添加值3. 自定义散点4. 将绘图设备与散点图对象联系5. 设置坐标轴6. 将绘图设备与GUI控件绑定并显示 一、概述 QScatterSeries 类以散点图的形式呈现数据。散点数据在图表上显示…

基于jdk1.8的Java服务监控和性能调优

JVM的参数类型 X参数 非标准参数-Xint: 解释执行-Xcomp: 第一次使用就编译成本地代码-Xmixed: JVM自己来决定是否编译成本地代码 默认使用的是mixed mode 用的不多, 只需要做了解, 用的比较多的是XX参数 XX参数 非标准化参数相对不稳定主要用来JVM调优和Debug Boolean: …