来源:Node.js

反向代理

反向代理(Reverse Proxy)是一种网络通信模式,它充当服务器和客户端之间的中介,将客户端的请求转发到一个或多个后端服务器,并将后端服务器的响应返回给客户端

反向代理的特点如下

  • 负载均衡:反向代理可以根据预先定义的算法将请求分发到多个后端服务器,以实现负载均衡,避免某个后端服务器过载,提高整体性能和可用性
  • 高可用性:反向代理可以将请求转发到多个后端服务器,以提供冗余和故障转移,如果一个后端服务器出现故障,代理服务器可以将请求转发到其他可用的服务器,从而实现高可用性
  • 缓存和性能优化:反向代理可以缓存静态资源或经常访问的动态内容,以减轻后端服务器的负载并提高响应速度,还可以通过压缩、合并和优化资源等技术来优化网络性能。
  • 安全性:反向代理可以作为防火墙,过滤恶意请求、检测和阻止攻击,并提供安全认证和访问控制,保护后端服务器免受恶意请求和攻击
  • 域名和路径重写:反向代理可以根据特定的规则重写请求的域名和路径,以实现 URL 路由和重定向,能提高系统架构的灵活性和可维护性

使用

需要先安装http-proxy-middleware

1
pnpm install http-proxy-middleware

proxy代理配置项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
module.exports = {
serve: {
proxy: {
// 设置代理,其实可以写多个
'/api': { // 代理路径
target: 'http://localhost:1919', // 代理目标
changeOrigin: true, // 是否跨域
pathRewrite: { // 重写路径,也可以写多个
'^/api': '
}
}
}
}
}

端口11451,使用/api代理http://localhost:1919

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
const http = require('node:http')
const url = require('node:url')
const fs = require('node:fs')

const { createProxyMiddleware } = require('http-proxy-middleware')
const config = require('./my.config.js')

const html = fs.readFileSync('index.html', 'utf-8')

http.createServer((req, res) => {

// 获取请求路径
const { pathname } = url.parse(req.url)
// console.log(pathname)

// 获取代理列表
const proxyList = Object.keys(config.serve.proxy)

// 检查代理
proxyList.forEach(path => {
if(pathname.startsWith(path)) {
// 请求路径匹配,执行代理
const proxy = createProxyMiddleware(config.serve.proxy[path])
proxy(req, res)
return
}
})

// 设置响应头
res.writeHead(200, {
'Content-Type': 'text/html',
})

// 页面路由
if(pathname === '/') {
res.end(html)
}

}).listen(11451, () => {
console.log('http://localhost:11451')
})

端口1919,11451端口/api开头的路由请求通过代理转发到了这里

1
2
3
4
5
6
7
8
9
10
11
12
13
const http = require('node:http')
const url = require('node:url')

http.createServer((req, res) => {
const { pathname } = url.parse(req.url)
console.log(pathname)

if(pathname === '/test') {
res.end('hello api')
}
}).listen(1919, () => {
console.log('http://localhost:1919')
})

http://localhost:11451/api/test被成功转发到http://localhost:1919/test