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.hqwc.cn/news/496013.html

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

相关文章

ChatGPT 正测试Android屏幕小组件;联想ThinkBook 推出透明笔记本电脑

▶ ChatGPT 测试屏幕小组件 近日 ChatGPT 正在测试 Android 平台上的屏幕小组件&#xff0c;类似于手机中的悬浮窗&#xff0c;按住 Android 手机主屏幕上的空白位置就可以调出 ChatGPT 的部件菜单。 菜单中提供了许多选项&#xff0c;包括文本、语音和视频查询的快捷方式&…

【OpenCV C++】Mat img.total() 和img.cols * img.rows 意思一样吗?二者完全相等吗?

文章目录 1 结论及区别2 Mat img的属性 介绍1 结论及区别 在大多数情况下,img.total() 和 img.cols * img.rows 是相等的,但并不总是完全相等的。下面是它们的含义和一些区别: 1.img.total() 表示图像中像素的总数,即图像的总像素数量。2.img.cols * img.rows 也表示图像中…

springboot003图书个性化推荐系统的设计与实现(源码+调试+LW)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于SpringBoot的图书个…

【GitHub】修改默认分支

GitHub的默认分支为main&#xff0c;但我们常常习惯使用master作为默认分支&#xff0c;那在GitHub上如何将master修改为默认分支呢&#xff1f; 全局修改 点击头像&#xff0c;选择菜单栏中的设置 输入master作为默认分支&#xff0c;然后执行updating即可&#xff01; 单项…

如何使用程序通过OCR识别解析PDF中的表格

https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7/ppstructure/table/README_ch.md#41-%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B Paddle-structure是目前我们能找到的可以做中英文版面分析较好的一个基础模型&#xff0c;其开源版可以识别十类页面元素。这篇文章介绍…

数据结构:树/二叉树

一、树的概念 逻辑结构&#xff1a;层次结构&#xff0c;一对多 节点&#xff1a;树中的一个数据元素根节点&#xff1a;树中的第一个节点&#xff0c;没有父节点孩子节点&#xff1a;该节点的直接下级节点父(亲)节点&#xff1a;该结点的直接上级节点兄弟节点&#xff1a;有…

在GLviewwidget中添加文本,比如数字之类的

最近有个需求&#xff0c;想要在GLviewwidget里面的指定三维位置添加文本&#xff0c;但是找到的版本都太老久了&#xff0c;或者用的是open3d实现的&#xff0c;在实际中的应用效果并不是很好。因此自己就写了一个&#xff0c;代码如下&#xff1a; plot gl.GLTextItem(pos(…

亚信安慧AntDB数据库与流式处理的有机融合

流式处理的概念 2001年9月11日&#xff0c;美国世贸大楼被袭击&#xff0c;美国国防部第一次将“主动预警”纳入国防的宏观战略规划。而IBM作为当时全球最大的IT公司&#xff0c;承担了大量基础支撑软件研发的任务。其中2009年正式发布的IBM InfoSphere Streams&#xff0c;就是…

飞天使-学以致用-devops知识点1-安装gitlabharbor

文章目录 rpm 安装gitlab页面配置配置secretsecret 查看信息-chatgpt回复 为项目配置webhook,等jenkins部署完毕后在配置卸载 harbor配置secret所有k8s集群节点安装信任 http rpm 安装gitlab # 下载安装包 wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitla…

K8S之Deployment的介绍和使用

Deployment的理论和实操 Deployment控制器&#xff1a;概念、原理解读概述工作原理 编写Deployment资源清单文件使用案例&#xff1a;创建一个web站点Deployment管理pod&#xff1a;扩容、缩容通过deployment管理应用&#xff0c;实现扩容&#xff0c;把副本数变成3通过deploym…

mysql中创建外键只会在索引处出现解决办法

我在mysql中创建的外键总是不成功 只有索引的地方多了一条记录&#xff0c;外键那里一保存就没有了&#xff0c;也不报错 为什么会产生这个问题&#xff0c;这个坑的的来源是有以下三点&#xff1a; MySQL建表的时候&#xff0c;可以不指定表引擎&#xff0c; 这时候MySQL就会…

wpf 3d 后台加载模型和调整参数

下载了一个代码&#xff0c;加载obj模型&#xff1b;它的参数在xaml里&#xff0c;模型加载出来刚好&#xff1b; 然后加载另一个obj模型&#xff1b;加载出来之后大&#xff0c;偏到很高和左的位置&#xff1b; 它之前的摄像机位置&#xff0c; Position"9.94759830064…