最近研究了一下怎么用Nodejs来写一个http代理服务器,起因就是因为公司网络管理太过严格,服务器访问其他服务器总是要申请权限。
我们NGINX服务器上设置了一些反向代理需要将请求转发到其他的后端服务器,然而我们刚新建的服务器没有权限,但是最近公司IT都放假了,申请权限也来不及了。
跟部门后台大佬讨论了一下,大佬一语点醒了我,他说可以用公司上网代理代理过去。服务器申请了访问上网代理服务器的权限,而且代理服务器也属于公司内网。
下面开始着手写一个http代理服务。
首先先了解一下HTTP代理的原理:
代理服务器是介于浏览器和Web服务器之间的一台服务器,有了它之后,浏览器不是直接到Web服务器去取回网页而是向代理服务器发出请求,Request信号会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并传送给你的浏览器。
现在知道代理服务器就是浏览器将请求发送到代理服务器,代理服务器再去请求对应的地址。下一个问题就是浏览器是通过什么样的方式去告诉代理服务器目标地址是什么呢?这在《HTTP权威指南》第六章中6.5中有介绍:
客户端向服务器而不是代理发送请求时,HTTP请求报文中的URI会有所不同。客户端向Web服务器发送请求时,请求行中只包含部分URI(没有方案、主机或端口),但当客户端向代理发送请求时,请求行中则包含完整的URI。
现在基本清楚了,开始着手撸代码了。
一、创建一个HTTP服务器
根据上面的了解,代理服务器既是一个HTTP服务器也是一个HTTP客户端,所以我们先创建一个HTTP服务器:
// index.js
const http = require('http')
const PORT = 3128
const server = http.createServer()
server.on('request', (req, res) => {
console.log(req.url)
let reqBody = ''
req.on('data', chunk => {
reqBody += chunk
})
req.on('end', () => {
res.end('Request is receive.')
})
})
server.on('error', err => {
console.error(err)
})
server.listen(PORT, () => {
console.log(`Server is running at port ${PORT}`)
})
运行起来:
[图片上传失败...(image-17a1a6-1674866212143)]
网友评论