将本地Express+Node后端部署至带子域名的云服务器遇阻
解决Plesk+Apache环境下Express后端部署到子域名的问题
核心问题分析
不用单独部署服务器,你的问题出在没有配置反向代理,以及Node服务的运行方式、监听地址可能存在问题:
- 直接访问
api.mydomain.com:3000超时,大概率是服务器防火墙未对外开放3000端口,且这种带端口的访问不符合API域名的使用规范; - 访问
api.mydomain.com/login出现Plesk错误页面,是因为Apache默认接管了80/443端口,没有把请求转发到你的Node服务。
具体解决步骤
1. 在Plesk中配置Apache反向代理
这是让子域名直接映射到Node服务的关键:
- 登录Plesk面板,找到
api.mydomain.com对应的「网站与域名」设置; - 进入「Apache & nginx 设置」(纯Apache环境找「附加Apache指令」);
- 在「附加指令」的Apache区域添加以下规则:
ProxyPass / http://localhost:3000/ ProxyPassReverse / http://localhost:3000/
- 保存设置,Apache会自动重载配置,此时访问
api.mydomain.com/login就会被转发到本地3000端口的Express服务。
2. 让Node服务后台稳定运行
直接通过npm run start启动的服务,SSH断开后会终止,必须用进程管理工具托管:
- 安装PM2(常用Node进程管理器):
npm install -g pm2
- 进入项目目录,启动服务并命名(方便管理):
pm2 start npm --name "api-mydomain" -- run start
- 查看服务状态:
pm2 status
- 设置开机自启(避免服务器重启后服务中断):
pm2 startup
执行命令后会生成一条系统级启动指令,复制并执行即可。
3. 调整Express服务的监听地址
确保你的Express代码监听的是0.0.0.0而非localhost,否则服务只能被本地进程访问,Apache无法转发请求:
// 替换原有的listen代码 app.listen(3000, '0.0.0.0', () => { console.log('Server running on 0.0.0.0:3000'); });
修改后用PM2重启服务:
pm2 restart api-mydomain
4. 防火墙配置(可选)
反向代理配置完成后,不需要对外暴露3000端口,只需要允许本地Apache访问该端口即可:
- 查看当前防火墙状态:
ufw status
- 允许本地访问3000端口:
ufw allow from 127.0.0.1 to any port 3000
如果之前对外开了3000端口,也可以关闭:
ufw deny 3000
关于是否需要单独部署服务器
完全不需要。Plesk本身支持在同一服务器上通过反向代理、端口隔离的方式运行多个站点和服务,只要你的Node服务使用的端口(比如3000)和其他服务不冲突,就可以和现有网站共存。
内容的提问来源于stack exchange,提问作者Bocanegra Apps
相关产品推荐
相关产品推荐

