如果我在我的 Amazon EC2 服务器上运行基本的 nodejs.org 示例,我会在控制台中收到“服务器正在运行”消息。但是如果我尝试使用我的弹性 IP + 端口在浏览器中打开它,则不会得到任何结果。
我想我已经打开了 TCP 端口 22 和 1337(我不是 100% 确定,因为我对这些东西还不熟悉)。
答案1
假设你指的是这个例子:
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(1337, "127.0.0.1");
console.log('Server running at http://127.0.0.1:1337/');
您将收到的消息如下服务器运行于 http://127.0.0.1:1337/- 此处强调的部分是关键,即服务器已配置为监听 IP 地址 127.0.0.1(又名本地主机),而您正尝试通过弹性 IP 地址浏览它。
因此,您可以通过将listen()
语句中的 127.0.0.1 替换为私有/内部 IP 地址已分配给您的 EC2 实例。
变化
或者,你可以使用公共/外部 DNS 名称,它根据 DNS 查询的来源展示鲜为人知的动态 IP 地址解析,例如为什么我有两个 IP 地址和两个主机名?:
外部 DNS 名称(类似于 ec2-72-44-45-204.compute-1.amazonaws.com)解析为 Amazon EC2 网络外部实例的公共 IP 地址和 Amazon EC2 网络内部的私有 IP 地址。
最后(根据 cyberx86 的评论,谢谢!),你可能可以完全省略可选的地址参数(但请参见下文),请参阅服务器.监听(端口,[主机名],[回调]):
如果省略主机名,服务器将接受指向任何 IPv4 地址 (INADDR_ANY) 的连接。
但请注意,在高级场景中,这可能并不总是正确的,因为实际上在最近引入了以下情况后,可能会有多个网络接口可用:虚拟私有云 (VPC) 中的弹性网络接口 (ENI),即使您能够创建额外的 ENI,并将第二个 ENI 附加到实例(同样,这是在 VPC 内)。