如何将Express.js应用部署在子路径下且无需占用80端口
项目当前运行状态
你搭建的是一个极简Express.js应用,入口文件为 server.js,完整代码如下:
const express = require('express'); const app = express(); app.get('/', (req, res) => { res.status(200).send({ "message": "Welcome to the application. Express JS is outputting this JSON. " }); }); app.get('/all', (req, res) => { res.status(200).send({ "message": "All the things. " }); }); app.listen(3000, () => { console.log("Server is listening on port 3000"); });
目前应用的访问表现:
- 本地执行
node server.js启动后,可通过http://localhost:3000正常访问 - 部署到局域网服务器(地址为192.168.100.105)后,可通过
http://192.168.100.105:3000正常调用所有接口
需求与现有约束
希望调整访问入口,让用户可以直接通过 http://192.168.100.105/app1 访问到这个Express应用,不需要手动加3000端口号。
常规的实现方式是把Express应用监听端口改为80,再给所有路由加上 /app1 的统一前缀,但当前场景下无法采用这个方案:服务器的80端口已经被其他线上应用占用,既没有权限停掉现有应用,也没有权限修改现有应用的运行配置。
需要找到一种不直接占用80端口的实现方式,满足上述访问需求。
可行实现路径
整个方案的核心是:不直接把Express服务绑定到80端口,而是借助已有的端口能力做流量转发映射,完全规避端口冲突:
- 路径1:复用现有80端口服务的反向代理能力
如果当前跑在80端口的应用支持自定义路径转发规则,只需要新增一条转发配置:把所有命中/app1前缀的请求,剥离前缀后转发到本地回环地址的127.0.0.1:3000,也就是你已经在运行的Express服务地址。
这种方式不需要改动你自己写的任何Express业务代码,也不会和现有80端口的应用产生冲突——你只是给现有代理加了一条转发规则,不需要重启、停掉原有服务,只要代理配置生效,就能实现目标地址的访问效果。 - 路径2:结合系统端口转发规则实现
如果拿不到现有80端口服务的配置权限,可以先在自己的Express代码里,用app.use('/app1', 你的路由模块)的方式给所有接口加上统一路径前缀,再通过操作系统自带的端口转发规则,把80端口上命中/app1路径的流量,直接转发到你自己跑在3000端口的Express服务上。整个过程不需要你自己的服务去监听80端口,也就不存在端口占用的问题。
内容的提问来源于stack exchange,提问作者Debadeep Sen
相关产品推荐
相关产品推荐

