反向代理在系统结构中的应用场景

1848 字
9 分钟
反向代理在系统结构中的应用场景
  • 正向代理:代理的是客户端。客户端知道自己要访问哪个服务器,但通过代理服务器中转请求。代理代表客户端去访问目标服务器。例如:科学上网、公司内网访问外网。
  • 反向代理:代理的是服务器端。客户端不知道最终处理请求的是哪台具体服务器,只与反向代理服务器通信。反向代理根据规则将请求转发给后端的某台真实服务器,再将结果返回给客户端。例如:负载均衡、CDN、Web服务器入口(如Nginx代理后端应用)。

“反向”的核心含义:代理的角色与正向代理正好相反——不代理客户端的请求外出,而是代理服务器端接收请求,对外隐藏真实服务器的存在。

反向代理 在系统结构中的应用场景#

image-20220430170948611
image-20220430170948611

反向代理方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

反向代理服务器通常有两种模型,一种是作为内容服务器的替身,另一种作为内容服务器集群的负载均衡器。

  • 作内容服务器的替身

如果您的内容服务器具有必须保持安全的敏感信息,如信用卡号数据库,可在防火墙外部设置一个代理服务器作为内容服务器的替身。当外部客户机尝试访问内容服务器时,会将其送到代理服务器。实际内容位于内容服务器上,在防火墙内部受到安全保护。代理服务器位于防火墙外部,在客户机看来就像是内容服务器。

当客户机向站点提出请求时,请求将转到代理服务器。然后,代理服务器通过防火墙中的特定通路,将客户机的请求发送到内容服务器。内容服务器再通过该通道将结果回传给代理服务器。代理服务器将检索到的信息发送给客户机,好像代理服务器就是实际的内容服务器。如果内容服务器返回错误消息,代理服务器会先行截取该消息并更改标头中列出的任何 URL,然后再将消息发送给客户机。如此可防止外部客户机获取内部内容服务器的重定向 URL。

这样,代理服务器就在安全数据库和可能的恶意攻击之间提供了又一道屏障。与有权访问整个数据库的情况相对比,就算是侥幸攻击成功,作恶者充其量也仅限于访问单个事务中所涉及的信息。未经授权的用户无法访问到真正的内容服务器,因为防火墙通路只允许代理服务器有权进行访问。

  • 作为内容服务器的负载均衡器

可以在一个组织内使用多个代理服务器来平衡各 Web 服务器间的网络负载。在此模型中,可以利用代理服务器的高速缓存特性,创建一个用于负载平衡的服务器池。此时,代理服务器可以位于防火墙的任意一侧。如果 Web 服务器每天都会接收大量的请求,则可以使用代理服务器分担 Web 服务器的负载并提高网络访问效率。

对于客户机发往真正服务器的请求,代理服务器起着中间调停者的作用。代理服务器会将所请求的文档存入高速缓存。如果有不止一个代理服务器,DNS 可以采用“轮询法”选择其 IP 地址,随机地为请求选择路由。客户机每次都使用同一个 URL,但请求所采取的路由每次都可能经过不同的代理服务器。

可以使用多个代理服务器来处理对一个高用量内容服务器的请求,这样做的好处是内容服务器可以处理更高的负载,并且比其独自工作时更有效率。在初始启动期间,代理服务器首次从内容服务器检索文档,此后,对内容服务器的请求数会大大下降。

Nginx的反向代理配置#

Terminal window
location / {
proxy_pass http://www.atguigu.com;
# root html;
# index index.html index.htm;
}
root proxy_pass 只能选一个
proxy_pass 是反向代理
root是直接找静态资源

image-20260508111558261
image-20260508111558261

成功代理

image-20260508111951805
image-20260508111951805

基于反向代理的负载均衡器#

轮询模式

Terminal window
worker_processes 1; #允许进程数量,建议设置为cpu核心数或者auto自动检测,注意Windows服务器上虽然可以启动多个processes,但是实际只会用其中一个
events {
#单个进程最大连接数(最大连接数=连接数*进程数)
#根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。
worker_connections 1024;
}
http {
#文件扩展名与文件类型映射表(是conf目录下的一个文件)
include mime.types;
#默认文件类型,如果mime.types预先定义的类型没匹配上,默认使用二进制流的方式传输
default_type application/octet-stream;
#sendfile指令指定nginx是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度。
sendfile on;
#长连接超时时间,单位是秒
keepalive_timeout 65;
#定义一组服务器
upstream httpds{
server 192.168.8.102:80;
server 192.168.8.103:80;
}
#虚拟主机的配置
server {
#监听端口
listen 80;
#域名,可以有多个,用空格隔开
server_name test80.xzj520520.cn;
#配置根目录以及默认页面
location / {
proxy_pass http://httpds;
# root /www/test80;
# index index.html index.htm;
}
#出错页面配置
error_page 500 502 503 504 /50x.html;
#/50x.html文件所在位置
location = /50x.html {
root html;
}
}
}

其他负载均衡策略(不常用) ip_hash 根据客户端的ip地址转发同一台服务器,可以保持会话,但是很少用这种方式去保持会话,例如我们当前正在使用wifi访问,当切换成手机信号访问时,会话就不保持了。

least_conn 最少连接访问,优先访问连接最少的那一台服务器,这种方式也很少使用,因为连接少,可能是由于该服务器配置较低,刚开始赋予的权重较低。

url_hash(需要第三方插件) 根据用户访问的url定向转发请求,不同的url转发到不同的服务器进行处理(定向流量转发)。

fair(需要第三方插件) 根据后端服务器响应时间转发请求,这种方式也很少使用,因为容易造成流量倾斜,给某一台服务器压垮。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
反向代理在系统结构中的应用场景
https://ztl123z.github.io/posts/反向代理在系统结构中的应用场景/
作者
三叶草
发布于
2026-05-08
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
三叶草
Hello, I'm Clover.
公告
欢迎来到三叶草☘️的博客
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
47
分类
14
标签
53
总字数
52,789
运行时长
0
最后活动
0 天前

目录