编辑
2023-07-10
计算机网络
00
请注意,本文编写于 227 天前,最后修改于 219 天前,其中某些信息可能已经过时。

目录

代理
正向代理
反向代理
总结

在互联网中,有一种特殊的网络服务,叫做代理(Proxy),也称网络代理。它是指一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。代理可以起到中介的作用,实现不同的目的和功能。根据代理的方向和对象,可以分为正向代理和反向代理两种模式。本文将介绍这两种模式的区别和应用,并给出一些常见的实现方式和代码示例。

在学习正向代理和反向代理之前,要先了解什么是代理?

代理

你可以把代理想象成一个中间人,它可以帮助你和别人进行沟通。

比如,你想和一个外国人聊天,但是你不会说外语,那么你就可以找一个会说外语的翻译来做你的代理,让他把你想说的话翻译给对方听,然后再把对方说的话翻译给你听。

这样,你就可以和外国人聊天了,而且对方也不知道你是谁,只知道你的代理是谁。

在互联网中,代理也是类似的作用。比如,你想访问一个网站,但是这个网站不让你进,或者进去了也很慢,那么你就可以找一个能访问这个网站的代理服务器来帮你。

你把你想访问的网址告诉代理服务器,然后代理服务器去访问这个网站,并把网站的内容传回给你。这样,你就可以看到这个网站了,而且这个网站也不知道你是谁,只知道代理服务器是谁。

下面是一个互联网中使用代理的示例图:

image.png

正向代理和反向代理是两种常见的代理模式,它们都可以在客户端和服务器之间起到中介的作用,但是它们的目的和实现方式有所不同。

正向代理

正向代理是指客户端通过代理服务器来访问目标服务器,代理服务器对客户端是透明的,目标服务器对客户端是不可见的。

正向代理的作用有:

  • 突破网络限制,访问被屏蔽或者无法直接访问的资源,例如翻墙。
  • 提高访问速度,代理服务器可以缓存客户端经常访问的资源,减少网络延迟和带宽消耗。
  • 隐藏客户端真实身份,提高安全性和隐私性,例如使用匿名代理。

正向代理的实现方式有:

  • 配置浏览器或者操作系统的代理设置,指定代理服务器的地址和端口,例如使用socks5协议。
  • 使用专门的代理软件或者服务,例如VPN、Shadowsocks、V2Ray等。
  • 使用专门的反向代理软件或者服务,例如Nginx、Apache、HAProxy等。

正向代理的示意图如下:

image.png

正向代理的代码示例(使用node.js):

js
// 引入http模块 const http = require('http'); // 创建一个正向代理服务器 const proxy = http.createServer((req, res) => { // 解析客户端请求的目标地址 const targetUrl = new URL(req.url); // 创建一个目标请求选项对象 const options = { hostname: targetUrl.hostname, port: targetUrl.port || 80, path: targetUrl.pathname, method: req.method, headers: req.headers }; // 向目标服务器发起请求 const targetReq = http.request(options, (targetRes) => { // 将目标服务器的响应头复制给客户端 res.writeHead(targetRes.statusCode, targetRes.headers); // 将目标服务器的响应数据转发给客户端 targetRes.pipe(res); }); // 监听目标请求的错误事件 targetReq.on('error', (err) => { // 返回一个500错误给客户端 res.writeHead(500); res.end(err.message); }); // 将客户端的请求数据转发给目标服务器 req.pipe(targetReq); }); // 监听8080端口 proxy.listen(8080, () => { console.log('正向代理服务器启动在8080端口'); });

反向代理

反向代理是指客户端通过代理服务器来访问目标服务器,代理服务器对客户端是不透明的,目标服务器对客户端是可见的。

反向代理的作用有:

  • 实现负载均衡,根据不同的规则将客户端的请求分发到不同的后端服务器,提高系统性能和可用性。
  • 实现缓存和压缩,代理服务器可以缓存后端服务器的静态资源,减少后端服务器的压力,同时可以对资源进行压缩,提高传输效率。
  • 实现安全防护,代理服务器可以过滤掉恶意的请求,防止攻击和篡改,同时可以对请求和响应进行加密,提高安全性。

反向代理的实现方式有:

  • 使用专门的反向代理软件或者服务,例如Nginx、Apache、HAProxy等。
  • 使用编程语言或者框架提供的反向代理功能,例如node.js、express、koa等。

反向代理的示意图如下:

image.png

反向代理的代码示例(使用node.jsexpress):

js
// 引入express模块 const express = require('express'); // 引入http-proxy-middleware模块 const { createProxyMiddleware } = require('http-proxy-middleware'); // 创建一个反向代理服务器 const proxy = express(); // 定义一个后端服务器列表 const servers = [ 'http://localhost:3000', 'http://localhost:3001', 'http://localhost:3002' ]; // 定义一个负载均衡策略,轮询法 let i = 0; const balance = () => { const target = servers[i]; i = (i + 1) % servers.length; return target; }; // 使用中间件将所有请求转发到后端服务器 proxy.use('/', createProxyMiddleware({ target: balance, // 动态获取目标地址 changeOrigin: true, // 修改请求头中的host为目标地址的host })); // 监听8080端口 proxy.listen(8080, () => { console.log('反向代理服务器启动在8080端口'); });

总结

正向代理和反向代理都是代理模式的一种,它们的区别在于:

  • 正向代理是客户端主动使用的,反向代理是服务器端主动使用的。
  • 正向代理对客户端是透明的,反向代理对客户端是不透明的。
  • 正向代理可以隐藏客户端的真实身份,反向代理可以隐藏服务器的真实身份。
  • 正向代理主要用于突破网络限制和提高访问速度,反向代理主要用于实现负载均衡和安全防护。

希望这篇博文能够帮助你了解代理服务器的两种模式:正向代理和反向代理,并学会一些常见的实现方式和代码示例。

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:CreatorRay

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!