在Heroku上使用AdonisJS部署API时出现错误R10

时间:2019-03-28 13:34:50

标签: node.js heroku adonis.js

这是错误:

  

错误R10(引导超时)-> Web进程在启动后60秒内未能绑定到$ PORT

分析日志时,我注意到每次在Heroku上“运行”该应用程序时,它都会定向到另一个端口。

我已经遇到了许多解决此问题的示例,但是使用Express而不是显式地使用AdonisJS(我发现它非常有限)。

我遇到的另一个问题是为我的应用程序使用域,该域应该与Heroku提供的域名或本地主机(127.0.0.1)相同吗?

我的日志:

2019-03-28T12:54:19.688098+00:00 app[web.1]: info: serving app on http://127.0.0.1:48470
2019-03-28T12:55:17.075091+00:00 heroku[web.1]: State changed from starting to crashed
2019-03-28T12:55:17.081028+00:00 heroku[web.1]: State changed from crashed to starting
2019-03-28T12:55:16.883066+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
2019-03-28T12:55:16.883174+00:00 heroku[web.1]: Stopping process with SIGKILL
2019-03-28T12:55:17.056876+00:00 heroku[web.1]: Process exited with status 137
2019-03-28T12:55:20.176409+00:00 heroku[web.1]: Starting process with command `ENV_SILENT=true npm start`
2019-03-28T12:55:22.553527+00:00 app[web.1]: 
2019-03-28T12:55:22.553548+00:00 app[web.1]: > adonis-api-app@4.1.0 start /app
2019-03-28T12:55:22.553551+00:00 app[web.1]: > node server.js
2019-03-28T12:55:22.553552+00:00 app[web.1]: 
2019-03-28T12:55:23.598805+00:00 app[web.1]: info: serving app on http://127.0.0.1:37943
2019-03-28T12:56:20.763929+00:00 heroku[web.1]: State changed from starting to crashed
2019-03-28T12:56:20.660053+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
2019-03-28T12:56:20.660202+00:00 heroku[web.1]: Stopping process with SIGKILL
2019-03-28T12:56:20.747895+00:00 heroku[web.1]: Process exited with status 137
2019-03-28T12:56:23.940320+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=***** protocol=https
2019-03-28T13:21:40.085858+00:00 heroku[web.1]: State changed from crashed to starting
2019-03-28T13:21:43.920685+00:00 heroku[web.1]: Starting process with command `ENV_SILENT=true npm start`
2019-03-28T13:21:46.419408+00:00 app[web.1]: 
2019-03-28T13:21:46.419429+00:00 app[web.1]: > adonis-api-app@4.1.0 start /app
2019-03-28T13:21:46.419431+00:00 app[web.1]: > node server.js
2019-03-28T13:21:46.419433+00:00 app[web.1]: 
2019-03-28T13:21:47.899057+00:00 app[web.1]: info: serving app on http://127.0.0.1:51104

我的.env文件:

HOST=127.0.0.1
PORT=8080
NODE_ENV=development
APP_NAME=AdonisJs
APP_URL=https://${HOST}:${PORT}
APP_KEY=*******

如何防止端口被更改?

1 个答案:

答案 0 :(得分:1)

这里发生了一些事情。

环境配置

configuring your application from the environment有两个主要优点:

  • 它使配置特定于环境,例如因此您可以在开发中使用与生产中使用的数据库不同的数据库,邮件服务器等
  • 它使您可以将敏感值(如API密钥和密码)保留在代码库之外

在存储库中包含.env文件会抵消这两个好处。在开发中使用它很好,它可以是设置环境变量的便捷方法,但是不应将其提交到存储库或在Heroku中使用。

Heroku natively supports configuration from the environment。您可以在Web UI中或通过命令行上的heroku:config来设置变量。这是您的环境变量应在生产环境中使用的地方。

强烈敦促您使用

从存储库中删除.env文件
git rm --cached .env

将其添加到您的.gitignore中,并改用Heroku基于本机环境的配置。您还应该使该文件中包含的所有API密钥或密码无效,并生成新的密钥或密码。

有关其价值,请参阅AdonisJS文档agrees with this approach

  

绝对不要将.env文件提交给源代码管理或与他人共享。

不同的端口

This is entirely expected

  

在Heroku上,应用程序是完全独立的,并且不依赖于将运行时的Web服务器注入执行环境来创建面向Web的服务。每个Web进程仅绑定到一个端口,并侦听该端口上的请求。 Heroku将port to bind to分配为PORT环境变量。

Heroku通过PORT环境变量告诉您​​要绑定到哪个端口,您必须使用它。但这不是从外部可见的端口。标准的HTTP端口将自动路由到您的应用程序。

IP地址

您的应用程序应侦听所有IP地址。如果您使用的是Express,我认为这意味着您在.listen()通话中没有提供IP地址。您只应在此处提供端口,该端口应来自PORT环境变量。