×
新网 > 建站推广 > 正文

怎么编写网站的HTTP 反向代理服务器

  • 作者:新网
  • 来源:新网
  • 浏览:100
  • 2018-02-24 17:44:49

怎么编写网站的HTTP 反向代理服务器?在 Node.js 上实现一个简单的 HTTP 代理程序还是非常简单的,本文章的例子的核心代码只有 60 多行,只要理解 内置 http 模块 的基本用法即可,具体请看下文。

 怎么编写网站的HTTP 反向代理服务器?在 Node.js 上实现一个简单的 HTTP 代理程序还是非常简单的,本文章的例子的核心代码只有 60 多行,只要理解 内置 http 模块 的基本用法即可,具体请看下文。

 
接口设计与相关技术
 
使用 http.createServer() 创建的 HTTP 服务器,处理请求的函数格式一般为 function (req, res) {} (下文简称为 requestHandler ),其接收两个参数,分别为 http.IncomingMessage 和 http.ServerResponse 对象,我们可以通过这两个对象来取得请求的所有信息并对它进行响应。
 
主流的 Node.js Web 框架的中间件(比如 connect )一般都有两种形式:
 
中间件不需要任何初始化参数,则其导出结果为一个 requestHandler
 
中间件需要初始化参数,则其导出结果为中间件的初始化函数,执行该初始化函数时,传入一个 options 对象,执行后返回一个 requestHandler
 
为了使代码更规范,在本文例子中,我们将反向代理程序设计成一个中间件的格式,并使用以上第二种接口形式:
 
// 生成中间件
 
const handler = reverseProxy({
 
// 初始化参数,用于设置目标服务器列表
 
servers: ["127.0.0.1:3001", "127.0.0.1:3002", "127.0.0.1:3003"]
 
});
 
// 可以直接在 http 模块中使用
 
const server = http.createServer(handler);
 
// 作为中间件在 connect 模块中使用
 
app.use(handler);
 
说明:
 
上面的代码中, reverseProxy 是反向代理服务器中间件的初始化函数,它接受一个对象参数, servers 是后端服务器地址列表,每个地址为 IP 地址:端口 这样的格式
 
执行 reverseProxy() 后返回一个 function (req, res) {} 这样的函数,用于处理 HTTP 请求,可作为 http.createServer() 和 connect 中间件的 app.use() 的处理函数
 
当接收到客户端请求时,按顺序循环从 servers 数组中取出一个服务器地址,将请求代理到这个地址的服务器上
 
服务器在接收到 HTTP 请求后,首先需要发起一个新的 HTTP 请求到要代理的目标服务器,可以使用 http.request() 来发送请求:
 
const req = http.request(
 
{
 
hostname: "目标服务器地址",
 
port: "80",
 
path: "请求路径",
 
headers: {
 
"x-y-z": "请求头"
 
}
 
},
 
function(res) {
 
// res 为响应对象
 
console.log(res.statusCode);
 
}
 
);
 
// 如果有请求体需要发送,使用 write() 和 end()
 
req.end();
 
要将客户端的请求体( Body 部分,在 POST 、 PUT 这些请求时会有请求体)转发到另一个服务器上,可以使用 Stream 对象的 pipe() 方法,比如:
 
// req 和 res 为客户端的请求和响应对象
 
// req2 和 res2 为服务器发起的代理请求和响应对象
 
// 将 req 收到的数据转发到 req2
 
req.pipe(req2);
 
// 将 res2 收到的数据转发到 res
 
res2.pipe(res);
 
说明:
 
req 对象是一个 Readable Stream (可读流),通过 data 事件来接收数据,当收到 end事件时表示数据接收完毕
 
res 对象是一个 Writable Stream (可写流),通过 write() 方法来输出数据, end() 方法来结束输出。
 
以上就是小编对于怎么编写网站的HTTP 反向代理服务器的解答。
 

免责声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,也不承认相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,请发送邮件至:operations@xinnet.com进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

免费咨询获取折扣

Loading