无法从本地主机访问 AWS EC2 服务器(卷曲超时)

Posted

技术标签:

【中文标题】无法从本地主机访问 AWS EC2 服务器(卷曲超时)【英文标题】:Cannot access AWS EC2 server from localhost (curl times out) 【发布时间】:2017-09-18 08:54:35 【问题描述】:

我正在尝试使用 ngnix 代理 node.js 服务器。我的问题是我无法访问(curl 或 nginx)本地主机上的 node.js 服务器,

当它的 3000 端口对外开放时,我可以看到我的 node js 服务器正在运行。但是 curl 和 nginx 无法访问它。

奇怪的是,我们启动了一个 mongodb,并且可以在 localhost 上毫无问题地访问它

我的实例 ID 如下:i-0fef394cbc350a4f4

这里是 nginx 服务器的链接,它找不到本地主机,因此超时:http://ec2-54-246-136-64.eu-west-1.compute.amazonaws.com/

我找不到其他方法来证明我们无法访问 curl localhost:3000

var sticky = require("socketio-sticky-session");
sticky(function () 
  // This code will be executed only in slave workers

  var http = require('http');
  var socketIO = require('socket.io');

  var server = http.createServer(app);

  var io = socketIO(server);
  require('./app_api/config/socketio')(io);

  io.on('connection', (socket) => 
    log.trace("new user connected");
    socket.on('disconnect', () => 
      log.trace("user disconnected");
    );
  );
  connectToDispatcher();

  process.title = "share_place";

  return server;
).listen(3000, function () 
      console.log((cluster.worker ? 'WORKER ' + cluster.worker.id : 'MASTER') + '| PORT ' + 3000)

      app.domain.on('error', (er) => 
        log.error('error', er.stack);

        try 
          // make sure we close down within 30 seconds
          var killtimer = setTimeout(() => 
            process.exit(1);
          , 30000);
          // But don't keep the process open just for that!
          killtimer.unref();

          // stop taking new requests.
          server.close();

          // Let the master know we're dead.  This will trigger a
          // 'disconnect' in the cluster master, and then it will fork
          // a new worker.
          cluster.worker.disconnect();

          // try to send an error to the request that triggered the problem
          res.statusCode = 500;
          res.setHeader('content-type', 'text/plain');
          res.end('Oops, there was a problem!\n');
         catch (er2) 
          // oh well, not much we can do at this point.
          log.error('Error sending 500!', er2.stack);
        
      );

    
);

更奇怪的情况:我们将节点代码安装在 beanstalk 实例上。

我们从外部访问节点服务器:http://share-place.eu-west-1.elasticbeanstalk.com:8081/

但是来自亚马逊的默认 nginx 会回复一条连接被拒绝的消息(对于我们可以从外部访问的公共资源)

/var/log/nginx/error.log

2017/04/21 14:32:19 [警告] 3360#0:在 /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf:42 中重复 MIME 类型“text/html” 2017/04/21 14:37:48 [警告] 7358#0:在 /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf:42 中重复 MIME 类型“text/html” 2017/04/21 14:38:41 [错误] 7362#0: *1 connect() 失败(111:连接被拒绝)同时连接到上游,客户端:41.226.2.5,服务器:,请求:“GET / HTTP/ 1.1”,上游:“http://127.0.0.1:8081/”,主机:“share-place.eu-west-1.elasticbeanstalk.com” 2017/04/21 14:38:41 [错误] 7362#0: *1 connect() 在连接到上游时失败(111:连接被拒绝),客户端:41.226.2.5,服务器:,请求:“GET /favicon。 ico HTTP/1.1”,上游:“http://127.0.0.1:8081/favicon.ico”,主机:“share-place.eu-west-1.elasticbeanstalk.com”,推荐人:“http://share-place.eu-west-1.elasticbeanstalk.com/” 2017/04/21 14:38:45 [错误] 7362#0: *1 connect() 失败(111:连接被拒绝),同时连接到上游,客户端:41.226.2.5,服务器:,请求:“GET / HTTP/ 1.1”,上游:“http://127.0.0.1:8081/”,主机:“share-place.eu-west-1.elasticbeanstalk.com”

【问题讨论】:

【参考方案1】:

也许你使用了 net 模块,所以在某些情况下你不能发出 http 请求。

检查 socketio-sticky-session 使用的是模块 net.createServer 还是 http.createServer。

【讨论】:

感谢 Marwen,我们实际上不得不使用 socketio-sticky-session 而不是单独处理我们的工人,我猜想有一天它必须是一个回旋镖(然后我忘了它:))。你是绝对正确的:它是 net.startServer 让服务器接收请求但从不回答【参考方案2】:

这里可能存在很多问题,而且信息太少,没有提供代码,不可能给你任何明确的答案。

您的应用可以侦听端口 3000,但它可能绑定到特定接口,因此它可以通过外部 IP 访问,而不是使用环回接口的 localhost。

您的应用程序可能在将其端口转发到外部接口但不转发到其他容器的本地主机的容器中运行。

您在问题中包含的 URL 实际上可能是并且很可能是处理连接的反向代理,您在打开的端口上看到的内容可能无法反映运行您的服务的主机的实际状态。

您可以尝试使用其他外部 IP 而不是 localhost,看看它是否有效。您可以尝试绑定到 Node 应用程序中特定接口的端口(我不知道您目前是如何做到的,因为您没有在问题中包含任何代码示例)。然后,您可以尝试关闭外部可用端口并限制访问,看看它何时停止工作,但一次只做一件事以缩小问题范围。

【讨论】:

感谢@rsp 的建议。我没有包含任何代码,因为它没有什么特别之处。我可以把它贴在这里仅供参考。我不明白“您的应用程序可以在端口 3000 上侦听,但它可能绑定到特定接口”是什么意思在浏览器中)

以上是关于无法从本地主机访问 AWS EC2 服务器(卷曲超时)的主要内容,如果未能解决你的问题,请参考以下文章

将Rstudio与PostgreSQL在AWS EC2中连接

如何从 AWS 胶水访问 VPC 中的 aws 资源?

无法从我的本地 ubuntu 机器推送到 aws ec2

无法访问 AWS ECS EC2 实例中的端口

通过 ELB 访问 AWS EC2 实例

如何通过 SSH 隧道通过 AWS 堡垒/跳转服务器从笔记本电脑访问 phpMyAdmin 到使用 .ssh/config 的 EC2 实例