nginx实现http反向代理

一、代理概述

1、代理概念

1.1 正向代理(Forward Proxy)

  • 概念:正向代理是位于客户端和目标服务器之间的代理服务器,代表客户端向目标服务器发送请求。客户端将请求发送给代理服务器,然后代理服务器将请求转发给目标服务器,并将响应返回给客户端

  • 作用:隐藏客户端的真实 IP 地址,访问受限网站、保护客户端隐私、提高访问速度等。

  • 示例:企业内部网络中的代理服务器、翻墙工具

1.2 反向代理(Reverse Proxy)

  • 概念:反向代理是位于目标服务器和客户端之间的代理服务器,代表目标服务器向客户端返回响应。客户端发送请求给反向代理,反向代理根据配置将请求转发给相应的目标服务器,然后将目标服务器的响应返回给客户端。

  • 作用:负载均衡、安全防护、缓存加速、隐藏服务器真实 IP 地址等。

  • 示例:CDN(内容分发网络)、负载均衡器、应用服务器集群等

 1.3 正向代理与反向代理的区别

区别正向代理反向代理
位置位于客户端和目标服务器之间位于目标服务器和客户端之间
目的代理客户端向外部服务器发送请求代理服务器向客户端返回响应
隐藏对象隐藏客户端的真实 IP 地址隐藏服务器的真实 IP 地址
常见应用翻墙、保护隐私等个人使用场景负载均衡、安全防护等企业和网站运维场景

2、同构代理与异构代理

2.1 同构代理

  • 概念:同构代理是一种代理服务器,它与目标服务器具有相同的协议和功能特性。简单来说,同构代理与目标服务器使用相同的协议进行通信
  • 作用:通常是在客户端和服务器之间充当中间人,以提供增强的功能,如缓存、负载均衡或安全性增强。同构代理可以实现请求的拦截、处理和转发,但不会更改协议类型
  • 示例:如果目标服务器是一个 HTTP 服务器,同构代理也是一个 HTTP 代理。同样,如果目标服务器是一个 SOCKS5 代理服务器,同构代理也是一个 SOCKS5 代理。

2.2 异构代理

  • 概念:异构代理是一种代理服务器,它与目标服务器使用不同的协议进行通信。简单来说,异构代理与目标服务器使用不同的协议
  • 作用:异构代理通常用于在不同协议之间进行桥接和转换,从而允许连接和通信的两端使用不同的协议。这可以在多个网络环境中提供灵活性和互操作性
  • 示例:如果目标服务器使用 HTTP 协议,但异构代理使用 SOCKS5 协议与目标服务器通信,那么它是一个异构代理。异构代理在协议转换和协议适配上起到了关键作用。

2.3  同构代理与异构代理的区别

在于代理服务器与目标服务器之间使用的协议是否相同

同构代理与目标服务器具有相同的协议,而异构代理则使用与目标服务器不同的协议

二、反向代理基础配置

1、反向代理模块

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

Nginx 除了可以在企业提供高性能的web服务之外,另外还可以将 nginx 本身不具备的请求通过某种预定义的协议转发至其它服务器处理,不同的协议就是Nginx服务器与其他服务器进行通信的一种规范,主要在不同的场景使用以下模块实现不同的功能

模块功能
ngx_http_proxy_module将客户端的请求以http协议转发至指定服务器进行处理
ngx_http_upstream_module用于定义为proxy_pass,fastcgi_pass,uwsgi_pass等指令引用的后端服务器分组
ngx_stream_proxy_module将客户端的请求以tcp协议转发至指定服务器处理
ngx_http_fastcgi_module将客户端对php的请求以fastcgi协议转发至指定服务器助理
ngx_http_uwsgi_module将客户端对Python的请求以uwsgi协议转发至指定服务器处理

2、反向代理配置指令

proxy_pass; 
#用来设置将客户端请求转发给的后端服务器的主机,可以是主机名(将转发至后端服务做为主机头首部)、IP
地址:端口的方式
#也可以代理到预先设置的主机群组,需要模块ngx_http_upstream_module支持

3、实现单台反向代理(基于ip)

反向代理服务器配置:

[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server{listen 80;server_name www.dh.com;root /mnt;location / {proxy_pass http://172.16.12.12;  #访问本机的根等于访问指定目的服务器的根}       
}
[root@localhost ~]#nginx -s reload
[root@localhost ~]#echo "welcome to proxy_server" > /mnt/index.html

目的服务器配置:

[root@localhost ~]#yum install -y httpd
[root@localhost ~]#systemctl start httpd
[root@localhost ~]#cd /var/www/html/
[root@localhost html]#vim index.html 
<html>
<body>
<h1>welcome to destination_server </h1>
</body>

客户端测试:

4、实现单机反向代理(基于端口)

反向代理服务器配置:

[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server{listen 80;server_name www.dh.com;root /mnt;location / {proxy_pass http://172.16.12.12:9527;}       
}
[root@localhost ~]#nginx -s reload

目的服务器配置:

[root@localhost ~]#vim /etc/httpd/conf/httpd.conf
Listen 9527
[root@localhost ~]#systemctl restart httpd

客户端测试:

5、反向代理的常见错误状态码

5.1 502(Bad Gateway

表示服务器作为网关或代理,收到目的服务器的无效响应。当请求通过代理服务器转发到目的服务器时,如果代理服务器收到目的服务器的响应无效(例如无响应,格式错误等),就会返回502错误给客户端。通常,这种错误表明目的服务器无法正常工作或响应异常

模拟一:给目的服务器作防火墙规则

[root@localhost ~]#iptables -A INPUT -s 172.16.12.10 -j REJECT
#客户端再次访问,会出现502,一般出现502代表目的服务器挂了
[root@localhost ~]#iptables -vnL --line-numbers

客户端测试:

模拟二:直接关闭目的服务器

[root@localhost ~]#systemctl stop httpd

客户端测试:

5.2 504(Gateway Timeout

表示服务器作为网关或代理,但在完成请求时等待响应超时。当客户端向代理服务器发送请求后,代理服务器将请求转发给目的服务器,但在规定的时间内未能从目的服务器获取到响应,就会返回504错误给客户端。这可能是由于目的服务器过载、响应时间过长或网络连接问题导致

模拟一:给目的服务器作防火墙规则

[root@localhost ~]#iptables -R INPUT 1 -s 172.16.12.10 -j DROP
#客户端再次访问会出现504网关超时(有可能只是处理时间久,服务器不一定挂了),时间较长1分钟,没有定义代理超时时间
[root@localhost ~]#iptables -vnL --line-numbers

客户端测试:

6、反向代理服务器配置文件不加/与加/

情况一:当代理服务器配置文件不加/

反向代理服务器配置:

[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server{listen 80;server_name www.dh.com;root /mnt;location /api {proxy_pass http://172.16.12.12;}       
}
[root@localhost ~]#nginx -s reload
[root@localhost ~]#mkdir /mnt/api
[root@localhost ~]#echo "api api api api" > /mnt/api/index.html

目的服务器配置: 

[root@localhost ~]#mkdir /var/www/html/api/
[root@localhost ~]#echo "api api api api" > /var/www/html/api/index.html

情况二:当代理服务器配置文件加/

反向代理服务器配置:

[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server{listen 80;server_name www.dh.com;root /mnt;location /api {proxy_pass http://172.16.12.12/;}       
}
[root@localhost ~]#nginx -s reload

总结:

  • 是否在代理目标后面添加斜杠 / 主要取决于后端服务器对请求 URI 的要求
  • 不使用 / 作为代理目标,Nginx 会将匹配到的 URI 去除掉,然后将剩余部分添加到代理目标中

如果后端服务器只需要请求 URI 的一部分,就不需要添加斜杠 /

  • 使用 / 作为代理目标时,Nginx 会将请求的 URI 原封不动地发送到代理服务器

如果后端服务器期望接收完整的请求 URI,就需要在代理目标后面加上斜杠 /

注:

/api能匹配的可能性太多,一般不加/,不允许替换,只能追加

三、实现反向代理的动静分离

1、动态资源和静态资源

静态资源:静态资源是指在服务器上事先准备好的,内容不会随着用户请求的变化而变化的资源。它们在服务器上存储为静态文件,并通过 HTTP 协议直接提供给用户。常见的静态资源包括 HTML 文件、CSS 样式文件、JavaScript 文件、图像文件、字体文件等。这些文件的内容不会随请求的变化而改变。

动态资源:动态资源是指在服务器端根据用户请求的参数或其他信息生成的,内容可能会随着请求的变化而变化的资源。它们需要服务器端的处理逻辑来生成最终的响应。常见的动态资源包括动态网页、动态图片生成、个性化内容等。这些资源的内容是根据用户的请求和服务器端的处理逻辑动态生成的

2、反向代理的动静分离操作过程

反向代理服务器进行动静分离是为了提高网站性能和用户体验。动静分离指的是将动态内容和静态内容分开处理,以便更有效地管理和优化它们 

目的服务器1(静态资源处理)配置:

[root@localhost ~]#yum install -y httpd
[root@localhost ~]#systemctl start httpd
[root@localhost ~]#cd /var/www/html
[root@localhost ~]#echo "static resources" > index.html
[root@localhost html]#ls         #再放入一张图片
1.jpg  index.html

目的服务器2(动态资源处理)配置:

[root@localhost ~]#yum install -y httpd
[root@localhost ~]#systemctl start httpd
[root@localhost ~]#mkdir /var/www/html/api/
[root@localhost ~]#echo "dynamic resources" > /var/www/html/api/index.html

反向代理服务器配置:

[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server {listen 80;server_name www.dh.com;root /mnt/;location ~* \.(jpg|jpeg|png|gif|bmp|html|mp4|txt)$ {proxy_pass http://172.16.12.12;}location ~* /api {proxy_pass http://172.16.12.13; }
}
[root@localhost ~]#nginx -s reload

客户端测试:

当访问静态资源时,代理服务器分析并将请求转送到目的服务器1进行处理

当访问动态资源时,代理服务器分析并将请求转送到目的服务器2进行处理

四、开启反向代理服务器的缓存功能

1、开启缓存功能的作用

  • 性能优化:当代理服务器缓存请求的响应时,它可以直接返回缓存的内容,而不必每次都请求源服务器,从而节省了带宽和服务器资源
  • 提高可用性:当目的服务器出现故障或不可用,反向代理服务器仍然可以提供已缓存的内容,确保用户仍然能够访问网站并减少服务中断的可能性
  • 降低延迟:由于缓存服务器通常位于更接近用户的位置,因此可以减少数据传输的时间和网络延迟。这可以加快网站的加载速度,提高用户体验
  • 降低延迟:通过缓存经常请求的内容,可以减少对源服务器的请求次数,从而减少服务器的带宽使用量,降低运营成本

 2、缓存功能配置指令

proxy_cache zone_name | off; 默认off
#指明调用的缓存,或关闭缓存机制;Context:http, server, location
#zone_name 表示缓存的名称.需要由proxy_cache_path事先定义

3、反向代理服务器开启缓存功能的过程

反向代理服务器配置:

主配置文件配置:

[root@localhost ~]# vim /apps/nginx/conf/nginx.conf
proxy_cache_path /opt/nginx/proyxcache  levels=1:1:1    keys_zone=proxycache:20m inactive=120s max_size=1g;
#开启缓存           缓存路径            生成文件夹比例是3级  从内存中借调20M专门存放缓存  有效期120秒     最大存储空间为1g
[root@localhost ~]# nginx -s reload
[root@localhost ~]# mkdir /opt/nginx/
[root@localhost opt]#mkdir /opt/nginx   #还要新建存放缓存对应的目录

 子配置文件配置:

[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server {listen 80;server_name www.dh.com;root /mnt/;proxy_cache proxycache;proxy_cache_key $request_uri;            #对指定的数据进行MD5的运算做为缓存的key#proxy_cache_key $host$uri$is_args$args; proxy_cache_valid 200 302 301 10m;       #指定的状态码返回的数据缓存多长时间proxy_cache_valid any 5m;                #除指定的状态码返回的数据以外的缓存多长时间,必须设置,否则不会缓存location ~* \.(jpg|jpeg|png|gif|bmp|html|mp4|txt)$ {proxy_pass http://172.16.12.12;}location ~* /api {proxy_pass http://172.16.12.13; }
}
[root@localhost ~]#nginx -s reload

测试:客户端访问代理服务器

查看代理服务器的缓存内容

 测试:关闭目的服务器1和目的服务器2的apache服务

[root@localhost ~]#systemctl stop httpd

客户端还能访问到请求的资源

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Prompt 编程的优化技巧

一、为什么要优化 一&#xff09;上下文限制 目前 GPT-3.5 以及 GPT-4最大支持 16K 上下文&#xff0c;比如你输入超过 16k 的长文本&#xff0c;ChatGPT 会提示文本过大&#xff0c;为了避免 GPT 无法回复&#xff0c;需要限制 上下文在16k 以内 上下文对于 GPT 来说是非常重…

【手机端测试】adb基础命令

一、什么是adb adb&#xff08;Android Debug Bridge&#xff09;是android sdk的一个工具 adb是用来连接安卓手机和PC端的桥梁&#xff0c;要有adb作为二者之间的维系&#xff0c;才能让用户在电脑上对手机进行全面的操作。 Android的初衷是用adb这样的一个工具来协助开发人…

第103讲:配置Mycat的Schema逻辑库列表

文章目录 1.Schema逻辑库2.自定义Mycat连接后显示那些Schema 1.Schema逻辑库 使用Mycat登录到数据库后&#xff0c;发现仅显示了一个TESTDB&#xff0c;这个TESTDB并不是后台数据库节点中的数据库&#xff0c;只是Mycat定义的逻辑库Schema&#xff0c;接下来我们就来说明如果自…

蓝桥杯Learning

Part 1 递归和递推 1. 简单斐波那契数列 n int(input())st [0]*(47) # 注意这个地方&#xff0c;需要将数组空间设置的大一些&#xff0c;否则会数组越界 st[1] 0 st[2] 1 # 这个方法相当于是递推&#xff0c;即先求解一个大问题的若干个小问题 def dfs(u):if u 1:print(…

CKA认证,开启您的云原生之旅!

在当今数字化时代&#xff0c;云计算已经成为企业和个人发展的关键技术。而获得CKA&#xff08;Certified Kubernetes Administrator&#xff09;认证&#xff0c;将是您在云原生领域迈出的重要一步。 CKA认证是由Kubernetes官方推出的权威认证&#xff0c;它旨在验证您在Kuber…

OSI模型

OSI模型 TCP/IP参考模型 TCP/IP常见协议 应用层 FTP&#xff08;用于文件的下载和上传&#xff0c;采用C/S结构&#xff09; Telnet&#xff08;用于远程登陆服务&#xff09; DNS&#xff08;域名解析&#xff09; HTTP&#xff08;接收和发布Html页面&#xff09; 传输层…

MetaGPT 1 安装与配置踩坑实录

安装 与 配置直接参考这里就行&#xff1a;Hugging Muti Agent&#xff08;二月学习&#xff09; - 飞书云文档 (feishu.cn) 这里按照教程安装的是metagpt 0.6.6 &#xff0c;经过跟0.7.0对比&#xff0c;个人认为0.7对其他llm接入可能更好&#xff0c;文档也更清晰。 0.6.6的…

VUE3:统计分析页面布局+自适应页面参考

一、布局 <template><div class"container1"><div class"form white"><el-form :inline"true" :rules"rules" :model"queryParams" label-width"80px" ref"querParmRef"><e…

java springmvc/springboot 项目通过HttpServletRequest对象获取请求体body工具类

请求 测试接口 获取到的 获取到打印出的json字符串里有空格这些&#xff0c;在json解析的时候正常解析为json对象了。 工具类代码 import lombok.extern.slf4j.Slf4j; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.we…

Fastjson2 <== 2.0.26反序列漏洞

根据Y4TACKER作者在2023-03-20发布了一篇关于Fastjson原生反序列化的文章&#xff0c;文章中引入注目的是利用条件限制条件&#xff0c;不常常关注漏洞预警或者内容的几乎都是未发觉Fastjson2 到Fastjson2 2.0.26版本都有问题&#xff0c;其实如果单独去使用一些关键词去搜索&a…

华为手动ipv6-to-ipv4隧道

中间r2的两个接口配置两个地址就行了&#xff0c;其它什么都不用配置 两边出接口R1和R3手动隧道建立&#xff1a;先把IPV4打通&#xff0c;并配置默认路由 再起隧道接口上进行配置&#xff0c;再配置带隧道的默认路由 PC上和上联接口网关只有IPV6地址 最终两个PC可以ping通 …

雾锁王国服务器要开服务器吗?

雾锁王国要开服务器吗&#xff1f;可以使用官方服务器&#xff0c;也可以自己搭建多人联机服务器&#xff0c;更稳定不卡&#xff0c;畅玩开黑。阿腾云分享atengyun.com给大家目前阿里云和腾讯云均提供雾锁王国服务器和一键搭建程序&#xff0c;成本26元即可搭建一台自己的雾锁…

Python爬虫进阶:爬取在线电视剧信息与高级检索

简介&#xff1a; 本文将向你展示如何使用Python创建一个能够爬取在线电视剧信息的爬虫&#xff0c;并介绍如何实现更高级的检索功能。我们将使用requests和BeautifulSoup库来爬取数据&#xff0c;并使用pandas库来处理和存储检索结果。 目录 一、爬取在线电视剧信息 …

YOLOv9尝鲜测试五分钟极简配置

pip安装python包&#xff1a; pip install yolov9pip在https://github.com/WongKinYiu/yolov9/tree/main中下载好权重文件yolov9-c.pt。 运行下面代码&#xff1a; import yolov9model yolov9.load("yolov9-c.pt", device"cpu") # load pretrained or c…

Apache POl

介绍 Apache POl是一个处理Miscrosoft Ofice各种文件格式的开源项目。简单来说就是&#xff0c;我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作,一般情况下&#xff0c;POI都是用于操作 Excel 文件。 Apache POl 的应用场景 1.银行网银系统导出交易…

RK3568平台 RTC时间框架

一.RTC时间框架概述 RTC&#xff08;Real Time Clock&#xff09;是一种用于计时的模块&#xff0c;可以是再soc内部&#xff0c;也可以是外部模块。对于soc内部的RTC&#xff0c;只需要读取寄存器即可&#xff0c;对于外部模块的RTC&#xff0c;一般需要使用到I2C接口进行读取…

VR系统的开发流程

虚拟现实&#xff08;Virtual Reality&#xff0c;VR&#xff09;系统是一种通过计算机技术模拟出的具有三维视角和交互性的虚拟环境&#xff0c;使用户能够沉浸在其中并与虚拟环境进行交互。这种技术通常利用头戴式显示器和手柄等设备&#xff0c;使用户能够感觉到仿佛身临其境…

【pytorch】函数记录

你好你好&#xff01; 以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 torch.sum()torch.argmax()torch.nn.Parametertorch.unbindtorch.optim.Adam()[^adam]torch.cattorch.unsqueeze()torch.normalize()[^l2]torch.eyetorch.mmto…

kubectl使用及源码阅读

目录 概述实践样例yaml 中的必须字段 kubectl 代码原理kubectl 命令行设置pprof 抓取火焰图kubectl 中的 cobra 七大分组命令kubectl createcreateCmd中的builder模式createCmd中的visitor访问者模式外层VisitorFunc分析 结束 概述 k8s 版本 v1.24.16 kubectl的职责 1.主要的…

R语言实现分位数回归和二次分位数回归

大家好&#xff0c;我是带我去滑雪&#xff01;新的一年&#xff0c;新的气象&#xff0c;在接下来的日子里我将继续和各位小伙伴们分享我在科研道路上&#xff0c;学习的一些知识&#xff01; 分位数回归和二次分位数回归是统计学中用于分析因变量与自变量之间关系的方法&…