Heroku Go 应用崩溃
Heroku Go app crashing
在 this tutorial 之后,一切都在本地运行。在我将我的应用程序部署到 Heroku 并在浏览器上访问该应用程序后,我收到 503 错误 和消息:
Application Error
An error occurred in the application and your page could not be served. Please try again in a few moments.
If you are the application owner, check your logs for details.
日志说:
2015-09-08T16:31:53.976824+00:00 heroku[web.1]: State changed from crashed to starting
2015-09-08T16:31:56.174376+00:00 heroku[web.1]: Starting process with command `mywebsite`
2015-09-08T16:31:59.312461+00:00 app[web.1]: Listening on port: 39461
2015-09-08T16:32:56.471550+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
2015-09-08T16:32:56.471550+00:00 heroku[web.1]: Stopping process with SIGKILL
2015-09-08T16:32:57.390752+00:00 heroku[web.1]: Process exited with status 137
2015-09-08T16:32:57.404208+00:00 heroku[web.1]: State changed from starting to crashed
2015-09-08T16:32:57.645135+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=boiling-eyrie-6897.herokuapp.com request_id=ec26... fwd="xx.xxx.xxx.xxx" dyno= connect= service= status=503 bytes=
2015-09-08T16:32:58.233774+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=boiling-eyrie-6897.herokuapp.com request_id=ef40...fwd="xx.xxx.xxx.xxx" dyno= connect= service= status=503 bytes=
我明白错误是什么,但是这么小的教程应用程序怎么会导致启动超时 (R10)?
我怎样才能更好地调试它并修复应用程序以便它运行?
您的应用需要监听所有网络连接。如果它只监听本地主机,heroku 的进程观察器将无法检测到您绑定了端口,也无法向您的应用发送请求。
这意味着代替:
http.ListenAndServe("127.0.0.1:"+port, nil)
您需要致电:
http.ListenAndServe(":"+port, nil)
另请参阅 heroku Go 应用入门:https://github.com/heroku/go-getting-started/blob/master/cmd/go-getting-started/main.go#L27
当您通过 heroku 部署应用程序时,它不允许您指定端口号.
换句话说,您不能将 Web 服务的 port 编号指定为 8000 或其他,heroku 在运行时决定端口号。
所以,你不能使用下面的代码:
log.Fatal(http.ListenAndServe(":8000", router))
你可以做的是获取 heroku 的运行时端口。
简而言之,只需使用以下代码:
log.Fatal(http.ListenAndServe(":" + os.Getenv("PORT"), router))
在 this tutorial 之后,一切都在本地运行。在我将我的应用程序部署到 Heroku 并在浏览器上访问该应用程序后,我收到 503 错误 和消息:
Application Error An error occurred in the application and your page could not be served. Please try again in a few moments. If you are the application owner, check your logs for details.
日志说:
2015-09-08T16:31:53.976824+00:00 heroku[web.1]: State changed from crashed to starting
2015-09-08T16:31:56.174376+00:00 heroku[web.1]: Starting process with command `mywebsite`
2015-09-08T16:31:59.312461+00:00 app[web.1]: Listening on port: 39461
2015-09-08T16:32:56.471550+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
2015-09-08T16:32:56.471550+00:00 heroku[web.1]: Stopping process with SIGKILL
2015-09-08T16:32:57.390752+00:00 heroku[web.1]: Process exited with status 137
2015-09-08T16:32:57.404208+00:00 heroku[web.1]: State changed from starting to crashed
2015-09-08T16:32:57.645135+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=boiling-eyrie-6897.herokuapp.com request_id=ec26... fwd="xx.xxx.xxx.xxx" dyno= connect= service= status=503 bytes=
2015-09-08T16:32:58.233774+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=boiling-eyrie-6897.herokuapp.com request_id=ef40...fwd="xx.xxx.xxx.xxx" dyno= connect= service= status=503 bytes=
我明白错误是什么,但是这么小的教程应用程序怎么会导致启动超时 (R10)?
我怎样才能更好地调试它并修复应用程序以便它运行?
您的应用需要监听所有网络连接。如果它只监听本地主机,heroku 的进程观察器将无法检测到您绑定了端口,也无法向您的应用发送请求。
这意味着代替:
http.ListenAndServe("127.0.0.1:"+port, nil)
您需要致电:
http.ListenAndServe(":"+port, nil)
另请参阅 heroku Go 应用入门:https://github.com/heroku/go-getting-started/blob/master/cmd/go-getting-started/main.go#L27
当您通过 heroku 部署应用程序时,它不允许您指定端口号.
换句话说,您不能将 Web 服务的 port 编号指定为 8000 或其他,heroku 在运行时决定端口号。
所以,你不能使用下面的代码:
log.Fatal(http.ListenAndServe(":8000", router))
你可以做的是获取 heroku 的运行时端口。
简而言之,只需使用以下代码:
log.Fatal(http.ListenAndServe(":" + os.Getenv("PORT"), router))