You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在EC2上用Nginx实现路径到不同端口的动态路由?

Node.js实现动态路径到EC2多端口的反向代理

核心思路

用Node.js的http-proxy库搭建反向代理服务器,维护一个路径-端口映射表:

  • 静态配置已知路径(如/jan1po→8000、/po02an→8080)
  • 编写随机路径生成逻辑,动态添加新的路径-端口映射
  • 收到请求时匹配路径,将请求转发到对应EC2端口

实现步骤

1. 安装依赖

首先安装http-proxy(Node.js生态常用的反向代理工具):

npm install http-proxy

2. 完整代码示例

const http = require('http');
const httpProxy = require('http-proxy');
const url = require('url');

// 创建代理服务器实例
const proxy = httpProxy.createProxyServer({});

// 路径-端口映射表:初始静态配置 + 后续动态添加
const pathPortMap = {
  '/jan1po': 8000,
  '/po02an': 8080
};

// 生成随机路径的工具函数(可自定义规则)
function generateRandomPath() {
  const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
  let path = '/';
  for (let i = 0; i < 6; i++) {
    path += chars[Math.floor(Math.random() * chars.length)];
  }
  return path;
}

// 动态添加新的路径-端口映射(示例:可定时调用或通过接口触发)
function addNewMapping(targetPort) {
  let newPath = generateRandomPath();
  // 避免重复路径
  while (pathPortMap[newPath]) {
    newPath = generateRandomPath();
  }
  pathPortMap[newPath] = targetPort;
  console.log(`已添加映射:${newPath} → ${targetPort}`);
  return newPath;
}

// 示例:自动添加一个新映射(端口9000)
addNewMapping(9000);

// 创建HTTP服务器处理请求
const server = http.createServer((req, res) => {
  const parsedUrl = url.parse(req.url);
  const requestPath = parsedUrl.pathname;

  // 匹配映射表中的路径
  const targetPort = pathPortMap[requestPath];
  if (targetPort) {
    // 转发请求到EC2对应端口(假设Node.js进程和目标服务在同一EC2实例)
    proxy.web(req, res, {
      target: `http://localhost:${targetPort}`
    });
  } else {
    // 路径未匹配时返回404
    res.writeHead(404, { 'Content-Type': 'text/plain' });
    res.end('404 Not Found');
  }
});

// 监听80端口(需确保进程有足够权限,或用反向代理如Nginx转发到Node.js端口)
server.listen(80, () => {
  console.log('反向代理服务器已启动,监听80端口');
  console.log('当前映射表:', pathPortMap);
});

// 捕获代理错误
proxy.on('error', (err, req, res) => {
  res.writeHead(500, { 'Content-Type': 'text/plain' });
  res.end(`代理错误:${err.message}`);
});

关键说明

  • 静态映射:直接在pathPortMap对象中添加固定路径与端口的对应关系
  • 动态映射:addNewMapping函数可根据需求调用(比如定时生成、通过API接口触发),自动生成不重复的随机路径并绑定到指定端口
  • 请求转发:通过proxy.web将请求转发到EC2本地的对应端口,若目标服务在其他EC2实例,只需修改target为对应实例的内网IP+端口
  • 端口监听:示例中监听80端口,若没有root权限,可改为监听非特权端口(如3000),再通过Nginx将example.com的请求转发到Node.js的3000端口

测试方式

启动服务后,访问:

  • http://example.com/jan1po → 转发到EC2的8000端口
  • http://example.com/po02an → 转发到EC2的8080端口
  • 自动生成的随机路径(如http://example.com/xyz123)→ 转发到对应绑定的端口

内容的提问来源于stack exchange,提问作者Sanniv Choudhuri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 09:22:45