http-proxy-middleware 低配置反向代理,Nginx 直接吃灰

483 阅读4分钟

大家好,我是凌览。

如果本文能给你提供启发或帮助,欢迎动动小手指,一键三连(点赞评论转发),给我一些支持和鼓励谢谢。

前言

已有一个去水印下载鸭后端服务,域名配置、服务器端口均已配置稳定。

现在我另有一个后端服务,假设取名叫去水印下载鸭后端服务Pro。

现在需要去水印下载鸭后端服务、去水印下载鸭后端服务Pro部署在同一台服务器,并且两者都通过80、443公开端口对外访问。这时大多选择Nginx反向代理让去水印下载鸭后端服务、去水印下载鸭后端服务Pro共用一个门牌号,流量自动分流,证书复用。

对于并发量大的后台选择Nginx没毛病,但对流量小到连“并发”俩字都嫌重,再搬出 Nginx 就是拿青龙偃月刀切葱花——刀好,但真没必要。

Node 玩家直接 http-proxy-middleware 一把梭,省出配 nginx 的功夫,早把需求迭代上线了。

本文就来介绍怎样用 http-proxy-middleware 三分钟搭好反向代理,让“去水印下载鸭”与“Pro 版”同吃 80/443,零 Nginx、低配置。

http-proxy-middleware是什么

http-proxy-middleware是一个基于 Express.js 框架的中间件,它能够将一个或多个 HTTP 请求代理到另一个服务器上。常用场景如:前端开发遇到跨域问题时,通过配置http-proxy-middleware,可以将前端请求代理到后端服务器,从而巧妙地避开浏览器的跨域限制。

安装与基础使用

首先安装http-proxy-middleware:

npm install http-proxy-middleware

安装完成后,我们就可以在项目中引入并使用它了。以下是一个简单的 Express 应用中使用http-proxy-middleware代理请求的示例:

const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');
const app = express();
// 创建一个代理中间件,将所有以/api开头的请求代理到目标服务器
app.use('/api', createProxyMiddleware({
    target: 'http://target-server.com', // 目标服务器地址
    changeOrigin: true, // 允许修改请求头中的origin字段
}));
const port = 3000;
app.listen(port, () => {
    console.log(`Server running on port ${port}`);
});

运用到实际项目

去水印下载鸭后端服务跑在 3000,在生产环境中会占住公网 80;去水印下载鸭后端服务Pro躲在 3010,只对内敞开。现在把 http-proxy-middleware 直接塞进3000去水印下载鸭后端服务,只加一条路由规则:

接口一旦撞上 /api/gold-price/*/**,当场被悄悄转给3010端口服务。

const proxyGoldPrice = require('./middleware/proxyGoldPrice.js');
//省略
// 👇 新增:代理 gold-price 路由
app.use('/api/gold-price', proxyGoldPrice);

//省略

在middleware目录创建proxyGoldPrice.js 文件,Express中间件配置放置在一起.

image.png

proxyGoldPrice.js内容:

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

const proxyGoldPrice = createProxyMiddleware({
    target: "http://127.0.0.1:3010",
    changeOrigin: true,
    // 如果目标服务不需要 /api 前缀,可启用 pathRewrite:
    pathRewrite: {
        //重写路径
        '^/': '/api/gold-price/',
    }
});

module.exports = proxyGoldPrice;

在上述代码中,我们通过createProxyMiddleware函数创建了一个代理中间件。当应用接收到以/api/gold-price开头的请求时,它会自动将该请求转发到http://127.0.0.1:3010。

举个例子:访问http://127.0.0.1:3000/api/gold-price/realtime时,命中app.use('/api/gold-price', proxyGoldPrice)路由,http-proxy-middleware会把http://127.0.0.1:3000/api/gold-price/realtime转发到http://127.0.0.1:3010/realtime

上述例子中转发后的访问的是http://127.0.0.1:3010/realtime,但在去水印下载鸭后端服务Pro路由前缀都有/api/gold-price,所以会出错没找到对应路由。

pathRewrite则是解决些问题的配置,它用于路径重写:

 pathRewrite: {
        //重写路径
        '^/': 'http://127.0.0.1:3010/realtime',
    }

表示把/替换成/api/gold-price/。转发后路径就是http://127.0.0.1:3010/api/gold-price/realtime。该字段可配可不配,取决于你的目标服务器。

好了,http-proxy-middleware基础使用方法介绍完毕。有不同代理需求功能可以移步看它的官方文档。

工具对比

来个简单对比:

特性http-proxy-middlewarehttp-proxynginx
配置复杂度中等
Node.js 集成优秀优秀需要单独进程
开发便利性优秀良好一般
性能良好优秀优秀
WebSocket 支持
路径重写有限
适用场景轻量网关、Node 栈一体化底层库、自定义代理逻辑高并发、多语言、企业级网关

http-proxy-middleware是http-proxy二次封装,本质是一个东西。http-proxy-middleware的存在让http-proxy更易使用。

最后

通过在 Node.js 应用中集成 http-proxy-middleware 中间件,只需几行代码配置就能让多个后端服务共用 80/443 端口,实现请求分流和路由转发。相比 Nginx,这种方案配置简单、与 Node.js 深度集成、开发便利性高,特别适合流量不大的项目快速部署,避免"杀鸡用牛刀"的资源浪费。