AWS Ubuntu 16.04 EC2实例中两Express服务器跨端口访问文件问题
问题排查与解决方案
嘿,我来帮你梳理下几个最可能的问题点,毕竟在EC2上跑多端口服务时,这类跨端口加载资源的坑真的很常见!
1. 别再用localhost了!这是核心误区
你在HTML里写的//localhost:84/test.js,是浏览器端的请求——浏览器里的localhost指的是用户自己的本地电脑,而不是你的EC2实例!
你需要把localhost替换成EC2实例的公网IP或者绑定的域名,比如:
<script type="text/javascript" src="//your-ec2-public-ip:84/test.js"></script>
如果你的EC2实例有弹性IP或者域名,直接用那个就行。
2. EC2安全组没开放84端口
就算你改对了IP,AWS的安全组默认会阻止大部分端口的外部访问。你需要:
- 登录AWS控制台,找到你的EC2实例对应的安全组
- 添加一条入站规则:协议选TCP,端口范围填84,来源可以暂时设为
0.0.0.0/0(测试用,生产环境建议限制为特定IP)
3. 第二个Express服务器没配置静态文件服务
你说把test.js放在了各种位置,但如果第二个服务器没告诉Express要托管静态文件,它根本不会返回这个文件。比如:
- 把
test.js放在第二个服务器项目的public文件夹里 - 在第二个服务器的代码里添加静态文件托管配置:
const express = require('express'); const app = express(); // 关键:托管public目录下的静态文件 app.use(express.static('public')); app.listen(84, '0.0.0.0', () => { console.log('Second server running on port 84'); });
这样访问/test.js就会对应到public/test.js文件。
4. 跨域资源共享(CORS)限制
因为两个服务器在不同端口,浏览器会触发同源策略,阻止加载跨端口的JS文件。你需要在第二个Express服务器上启用CORS:
- 先安装cors包:
npm install cors
- 在第二个服务器代码里添加:
const cors = require('cors'); app.use(cors()); // 测试阶段允许所有来源,生产环境可以配置具体的origin(比如第一个服务器的地址)
5. 第二个服务器绑定了错误的地址
如果你的第二个服务器是这样写的:
app.listen(84, 'localhost', () => { ... });
那它只会监听EC2实例内部的127.0.0.1地址,外部请求根本打不进来。必须改成绑定0.0.0.0,这样才能接受来自任意IP的请求:
app.listen(84, '0.0.0.0', () => { console.log('Second server is accessible externally on port 84'); });
建议你按照这个顺序一步步排查,先改localhost为EC2公网IP,再检查安全组,这两个是最容易踩的坑!
内容的提问来源于stack exchange,提问作者dennis
相关产品推荐
相关产品推荐

