使用端口3000在AWS上部署的NodeJs应用无法从互联网访问

3
我正在使用免费套餐的AWS Linux实例,我已经安装了NodeJs并启动了我的Express JS应用程序(sudo node bin/www),我的应用程序运行在3000端口。
当我ssh到实例并使用cURL时,我的应用程序有响应,但是从Chrome使用实例公共IP没有响应。
我已经在安全组中添加了端口80、22、3000,以便从任何地方访问该应用程序。[见附图]此实例正在N. Virginia region中运行。
以下是我尝试使其工作的情况:
  • 使用带有端口3000的Public IP启动我的应用程序
  • 使用带有端口3000的Private IP启动我的应用程序
  • 使用带有端口3000的0.0.0.0启动我的应用程序
  • 使用带有端口3000的localhost启动我的应用程序
上述所有情况都失败了,当我ssh到实例并使用cURL时,我的应用程序有响应。
有人能给我更多的见解吗?或者我有什么遗漏的吗?我一直被这个问题困扰着。
当我将端口设置为80时,我能够访问应用程序,但是因为我在端口80上运行前端框架,所以我需要使用端口3000
已经使用yum在服务器上安装的软件:
  • yum update
  • gcc-c++ make
  • openssl-devel
  • 来自官方网站的nodejs
  • npm install -g npm // 更新npm
  • mongodb
AWS安全组截图
备注:我已经阅读了所有关于无法从互联网访问应用程序的StackOverflow问题,但在我的情况下,我的应用程序可以从端口80访问,而不是从3000

您的安全组看起来没问题,不过它也应该在组上指定类型吧?您有在任何地方看到类型吗?另外,您能发布一下启动节点服务器所用的代码吗?问题也可能出在那里。 - Lucas Hendren
@Hammer 是的,我已经在“安全组”中将端口 3000 的类型设置为任何位置。启动应用程序的代码:sudo node bin/www - Rohith
抱歉让我澄清一下,我的意思是您运行的文件中实际的代码,用于设置您的服务器。 - Lucas Hendren
@Hammer,我正在使用Express JS,我使用express generator命令开发了我的应用程序:npm install express-generator -g有一个标准的www文件来运行应用程序,我只是更改了 var port = normalizePort('3000');如果您需要更多信息,请告诉我。 - Rohith
你是否允许了CORS/origins?var allowedOrigins = [config.allowedOrigins]
res.header('Access-Control-Allow-Origin', allowedOrigins);
- Lucas Hendren
我遇到了完全相同的问题。同样的代码在其他机器上(非 aws)都可以工作。这似乎是AWS特有的问题。我也被卡住了。 - user2848810
3个回答

3

可能是因为您正在尝试从禁止使用端口3000的网络访问应用程序。大多数企业网络仅允许特定类型的流量离开网络,通常是http(s)等。 请尝试从另一个网络或来自不同地区的ec2主机进行测试。


假设我有一个AWS实例,我需要在端口80上运行我的前端框架和在端口3000上运行我的后端框架,我该如何解决这个问题?我该如何使企业网络中的用户也能够无缝访问我的应用程序? - Rohith
2
@Rohith 你可能需要一个反向代理。例如,你可以在端口4000上运行前端,端口3000上运行后端。在端口80上,你设置一个反向代理(apache或nginx),并配置它将请求转发到端口3000和4000,具体取决于URL,例如所有以/api开头的请求都会转发到后端,其他所有请求都会转发到前端。 - Andrei Socaciu
谢谢你提供的信息。实际上,我也是这样做的。 - Rohith

2

我在这个问题上浪费了3天时间。你需要禁用内部防火墙。我使用的是CentOS 7:

sudo systemctl disable firewalld sudo systemctl stop firewalld


0

你是否允许了CORS/来源?

var allowedOrigins = [origionDomain] 
res.header('Access-Control-Allow-Origin', allowedOrigins)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接