Node.js中如何根据子域名将请求路由到指定端口服务
基于子域名的Node.js反向代理实现方案
方案1:纯Node.js实现(满足监听3000端口的自定义服务要求)
你之前用的路径匹配类中间件不支持按域名路由,直接用http-proxy库读取请求头的Host字段做匹配即可,逻辑非常简单。
- 初始化项目并安装依赖
mkdir subdomain-proxy && cd subdomain-proxy npm init -y npm install http-proxy
- 新建
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端口'); });
- 启动服务
测试启动直接执行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
相关产品推荐
相关产品推荐

