在 Elastic Beanstalk 上运行时如何获取服务器 URL?

Posted

技术标签:

【中文标题】在 Elastic Beanstalk 上运行时如何获取服务器 URL?【英文标题】:How to get server URL when running on Elastic Beanstalk? 【发布时间】:2015-04-17 16:08:00 【问题描述】:

我使用restify 创建部署到 Elastic Beanstalk 的节点 API。

var server = restify.createServer( name: 'My API' );

server.listen(process.env.PORT || 1704, function() 
  console.log('%s listening at %s', server.name, server.url);
);

在本地运行时,我看到:

我的 API 在 http://0.0.0.0:1704 监听

但是,在 Elastic Beanstalk 上运行时,日志显示:

我的 API 在 http://0.0.0.0:8081 监听

这是为什么呢?

为什么server.url 不是http://my-api.elasticbeanstalk.com

我怎样才能获得真正的 URL(类似于http://my-api.elasticbeanstalk.com)?

【问题讨论】:

【参考方案1】:

elastic beanstalk 节点应用程序配置为在内部运行在 8081 上。你可以在node.conf看到它:

upstream nodejs 
    server 127.0.0.1:8081;
    keepalive 256;

现在 8081 只是内部端口。如果你检查这个 conf 文件,你会发现外部端口实际上是 8080,你的 ELB 将指向端口 80。我希望它不会太混乱 :) 至于您的 env URL,您可以从桌面发出 eb status 命令来查看 CNAME。它也是在 EB Web 控制台中编写的。

【讨论】:

我需要知道节点应用程序本身的完整 URL 才能构造响应标头(例如 Location: http://my-api.elasticbeanstalk.com/my-resource)。 req.url 给了我/my-resource 位,但我不确定如何获得http://my-api.elasticbeanstalk.com 位。有什么想法吗? 你的意思是编程吗?我相信“my-api”名称有一个环境变量,您可以附加到该“elasticbeanstalk.com”。查看 EB_* 环境变量。 显然,没有环境变量可以给我my-api 位。 Here 是所有环境变量的列表。我可以从哪里得到它的任何其他想法? 我想唯一的选择是手动添加它,然后在服务器中获取它。您可以在桌面上使用eb setenv 命令,然后它应该在即将到来的实例中显示为变量。 我希望动态获得my-api 位,而无需明确设置。我最终做了:'http://' + req.headers.host

以上是关于在 Elastic Beanstalk 上运行时如何获取服务器 URL?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AWS Elastic Beanstalk 上运行 celery worker?

在 Elastic Beanstalk 上运行 .config 文件?

在 AWS Elastic Beanstalk 上运行临时脚本

Celery 可以在 Elastic Beanstalk 上运行吗?

如何在 Elastic Beanstalk 实例上运行任意 npm 脚本

让 Ruby 服务在 Elastic Beanstalk 上运行