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

Node.js中如何根据子域名将请求路由到指定端口服务

基于子域名的Node.js反向代理实现方案

方案1:纯Node.js实现(满足监听3000端口的自定义服务要求)

你之前用的路径匹配类中间件不支持按域名路由,直接用http-proxy库读取请求头的Host字段做匹配即可,逻辑非常简单。

  1. 初始化项目并安装依赖
mkdir subdomain-proxy && cd subdomain-proxy
npm init -y
npm install http-proxy
  1. 新建proxy.js写入以下代码
const http = require('http');
const httpProxy = require('http-proxy');
const proxy = httpProxy.createProxyServer({});

// 子域名到后端服务端口的映射表
const routeTable = {
  'example1.mydomain.com': 'http://127.0.0.1:4000',
  'example2.mydomain.com': 'http://127.0.0.1:5000'
};

const server = http.createServer((req, res) => {
  // 提取host字段,剔除端口部分、统一转小写避免匹配失败
  const reqHost = req.headers.host.split(':')[0].toLowerCase();
  const targetService = routeTable[reqHost];

  if (!targetService) {
    res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });
    res.end('当前域名未绑定对应服务');
    return;
  }

  // 转发普通HTTP请求
  proxy.web(req, res, {
    target: targetService,
    changeOrigin: true
  }, (err) => {
    res.writeHead(500, { 'Content-Type': 'text/plain; charset=utf-8' });
    res.end('代理转发失败:' + err.message);
  });
});

// 处理WebSocket升级请求,兼容React热更新、长连接场景
server.on('upgrade', (req, socket, head) => {
  const reqHost = req.headers.host.split(':')[0].toLowerCase();
  const targetService = routeTable[reqHost];
  if (targetService) {
    proxy.ws(req, socket, head, {
      target: targetService,
      changeOrigin: true
    });
  }
});

// 监听3000端口
server.listen(3000, () => {
  console.log('子域名代理服务已启动,监听3000端口');
});
  1. 启动服务
    测试启动直接执行node proxy.js即可,生产环境建议用pm2托管保证进程常驻:
npm install -g pm2
pm2 start proxy.js --name subdomain-proxy
pm2 save
pm2 startup

部署注意点

  • 提前确认两个子域名的A记录已经解析到当前服务器公网IP,防火墙放开3000端口入站规则
  • 后端4000、5000端口的React服务建议绑定127.0.0.1,不要暴露公网,避免绕过代理直接访问
  • 代码里已经加了changeOrigin: true配置,不会出现后端服务识别host异常的问题
  • 如果需要支持HTTPS,只需要把服务改成https模块加载SSL证书即可,转发逻辑不需要改动

方案2:Nginx实现(更轻量,无需维护Node进程)

如果你不需要强制用Node做代理层,Nginx做子域名路由比Node方案更简单稳定,配置如下:

# example1子域名转发规则
server {
  listen 80;
  server_name example1.MyDomain.com;
  location / {
    proxy_pass http://127.0.0.1:4000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    # 支持WebSocket
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }
}

# example2子域名转发规则
server {
  listen 80;
  server_name example2.MyDomain.com;
  location / {
    proxy_pass http://127.0.0.1:5000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }
}

把配置放到Nginx的站点配置目录下,执行nginx -t校验通过后重载Nginx即可生效。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.21 16:16:02