【问题标题】:Heroku Go WebApp Error – Connection Closed Without ResponseHeroku Go WebApp 错误 - 连接关闭而没有响应
【发布时间】:2020-04-24 07:44:20
【问题描述】:

我正在尝试在 Heroku 中部署一个 Golang 应用程序。我收到 H13 错误,不知道如何解决。

应用程序查询数据库并返回结果表。数据库小,查询小。它在8080端口本地运行,完全没有问题。

H13 Error documentation 这么说

当您的 web dyno 中的进程接受 连接,但随后关闭套接字而不向其写入任何内容。

可能发生这种情况的一个例子是 Unicorn Web 服务器 配置了一个小于 30 秒的超时并且没有请求 在超时发生之前由工作人员处理。在这种情况下, Unicorn 在写入任何数据之前关闭连接,导致 一个 H13。

据我所知,我并没有运行 Unicorn Web 服务器(尽管我不得不首先配置服务器,这超出了我的舒适范围)。我正在从 vanilla net/http 包运行应用程序 - 没有路由附加组件或类似的东西。我做了一些谷歌搜索并尝试延长超时时间,如下所示:

s := &http.Server{
    Addr: ":8080",
    ReadTimeout:  5 * time.Second,
    WriteTimeout: 10 * time.Second,
    IdleTimeout:  120 * time.Second,
}


if  len(os.Getenv("PORT")) > 0 {
    s := &http.Server{
        Addr: ":" + os.Getenv("PORT"),
        ReadTimeout:  50 * time.Second,
        WriteTimeout: 100 * time.Second,
        IdleTimeout:  1200 * time.Second,
    }
    log.Fatal(s.ListenAndServe())
        } 

log.Fatal(s.ListenAndServe())

ListenAndServe() 通常在 http 对象上调用。在这里,我创建了一个服务器对象并为其提供了大规模延长的超时时间,然后为此调用了ListenAndServe(),但我没有取得任何进展。一直都是同样的H13 错误。

这些是错误日志:

2020-01-06T18:46:20.771328+00:00 heroku[web.1]: Unidling
2020-01-06T18:46:20.776052+00:00 heroku[web.1]: State changed from down to starting
2020-01-06T18:46:21.616792+00:00 heroku[web.1]: Starting process with command `bin/gowebappdatabase`
2020-01-06T18:46:24.357786+00:00 heroku[web.1]: State changed from starting to up
2020-01-06T18:46:24.284251+00:00 app[web.1]: Incipio - I begin.
2020-01-06T18:46:25.826969+00:00 app[web.1]: 2020/01/06 18:46:25 http: panic serving 10.71.246.139:27839: dial tcp: lookup port=0: no such host
2020-01-06T18:46:25.827017+00:00 app[web.1]: goroutine 20 [running]:
2020-01-06T18:46:25.827020+00:00 app[web.1]: net/http.(*conn).serve.func1(0xc0001100a0)
2020-01-06T18:46:25.827022+00:00 app[web.1]: /app/tmp/cache/go1.12.12/go/src/net/http/server.go:1769 +0x139
2020-01-06T18:46:25.827024+00:00 app[web.1]: panic(0x7e4280, 0xc00010e320)
2020-01-06T18:46:25.827026+00:00 app[web.1]: /app/tmp/cache/go1.12.12/go/src/runtime/panic.go:522 +0x1b5
2020-01-06T18:46:25.827028+00:00 app[web.1]: github.com/amunnelly/gowebappdatabase/dbconnect.runQuery(0xc000150160, 0x150, 0x0)
2020-01-06T18:46:25.827031+00:00 app[web.1]: /tmp/build_b7c9c282f9c067c1b5b5cede1994472d/dbconnect/connectdb.go:78 +0xff
2020-01-06T18:46:25.827033+00:00 app[web.1]: github.com/amunnelly/gowebappdatabase/dbconnect.PointsGdTableQuery(0xc000150160, 0x150, 0x0, 0x0, 0x0)
2020-01-06T18:46:25.827035+00:00 app[web.1]: /tmp/build_b7c9c282f9c067c1b5b5cede1994472d/dbconnect/connectdb.go:161 +0x64
2020-01-06T18:46:25.827037+00:00 app[web.1]: github.com/amunnelly/gowebappdatabase/routing.ServeHome(0x8db260, 0xc00013a000, 0xc000124100)
2020-01-06T18:46:25.827039+00:00 app[web.1]: /tmp/build_b7c9c282f9c067c1b5b5cede1994472d/routing/routing.go:35 +0x1b5
2020-01-06T18:46:25.827041+00:00 app[web.1]: net/http.HandlerFunc.ServeHTTP(0x863ca0, 0x8db260, 0xc00013a000, 0xc000124100)
2020-01-06T18:46:25.827043+00:00 app[web.1]: /app/tmp/cache/go1.12.12/go/src/net/http/server.go:1995 +0x44
2020-01-06T18:46:25.827045+00:00 app[web.1]: net/http.(*ServeMux).ServeHTTP(0xba17c0, 0x8db260, 0xc00013a000, 0xc000124100)
2020-01-06T18:46:25.827047+00:00 app[web.1]: /app/tmp/cache/go1.12.12/go/src/net/http/server.go:2375 +0x1d6
2020-01-06T18:46:25.827049+00:00 app[web.1]: net/http.serverHandler.ServeHTTP(0xc000086c30, 0x8db260, 0xc00013a000, 0xc000124100)
2020-01-06T18:46:25.827051+00:00 app[web.1]: /app/tmp/cache/go1.12.12/go/src/net/http/server.go:2774 +0xa8
2020-01-06T18:46:25.827053+00:00 app[web.1]: net/http.(*conn).serve(0xc0001100a0, 0x8dbc20, 0xc000118180)
2020-01-06T18:46:25.827055+00:00 app[web.1]: /app/tmp/cache/go1.12.12/go/src/net/http/server.go:1878 +0x851
2020-01-06T18:46:25.827056+00:00 app[web.1]: created by net/http.(*Server).Serve
2020-01-06T18:46:25.827058+00:00 app[web.1]: /app/tmp/cache/go1.12.12/go/src/net/http/server.go:2884 +0x2f4
2020-01-06T18:46:25.828262+00:00 heroku[router]: at=error code=H13 desc="Connection closed without response" method=GET path="/" host=gowebappdatabase.herokuapp.com request_id=b57f171c-5a63-4f2b-b54c-444d7c46d871 fwd="176.61.86.66" dyno=web.1 connect=1ms service=6ms status=503 bytes=0 protocol=https
2020-01-06T18:46:26.697559+00:00 app[web.1]: 2020/01/06 18:46:26 http: panic serving 10.67.225.150:14843: dial tcp: lookup port=0: no such host
2020-01-06T18:46:26.697582+00:00 app[web.1]: goroutine 7 [running]:
2020-01-06T18:46:26.697585+00:00 app[web.1]: net/http.(*conn).serve.func1(0xc00008d180)
2020-01-06T18:46:26.697588+00:00 app[web.1]: /app/tmp/cache/go1.12.12/go/src/net/http/server.go:1769 +0x139
2020-01-06T18:46:26.697590+00:00 app[web.1]: panic(0x7e4280, 0xc00008a320)
2020-01-06T18:46:26.697592+00:00 app[web.1]: /app/tmp/cache/go1.12.12/go/src/runtime/panic.go:522 +0x1b5
2020-01-06T18:46:26.697595+00:00 app[web.1]: github.com/amunnelly/gowebappdatabase/dbconnect.runQuery(0xc0000946e0, 0x150, 0x0)
2020-01-06T18:46:26.697597+00:00 app[web.1]: /tmp/build_b7c9c282f9c067c1b5b5cede1994472d/dbconnect/connectdb.go:78 +0xff
2020-01-06T18:46:26.697599+00:00 app[web.1]: github.com/amunnelly/gowebappdatabase/dbconnect.PointsGdTableQuery(0xc0000946e0, 0x150, 0x0, 0x0, 0x0)
2020-01-06T18:46:26.697601+00:00 app[web.1]: /tmp/build_b7c9c282f9c067c1b5b5cede1994472d/dbconnect/connectdb.go:161 +0x64
2020-01-06T18:46:26.697604+00:00 app[web.1]: github.com/amunnelly/gowebappdatabase/routing.ServeHome(0x8db260, 0xc0001b2000, 0xc000128100)
2020-01-06T18:46:26.697606+00:00 app[web.1]: /tmp/build_b7c9c282f9c067c1b5b5cede1994472d/routing/routing.go:35 +0x1b5
2020-01-06T18:46:26.697608+00:00 app[web.1]: net/http.HandlerFunc.ServeHTTP(0x863ca0, 0x8db260, 0xc0001b2000, 0xc000128100)
2020-01-06T18:46:26.697611+00:00 app[web.1]: /app/tmp/cache/go1.12.12/go/src/net/http/server.go:1995 +0x44
2020-01-06T18:46:26.697614+00:00 app[web.1]: net/http.(*ServeMux).ServeHTTP(0xba17c0, 0x8db260, 0xc0001b2000, 0xc000128100)
2020-01-06T18:46:26.697616+00:00 app[web.1]: /app/tmp/cache/go1.12.12/go/src/net/http/server.go:2375 +0x1d6
2020-01-06T18:46:26.697618+00:00 app[web.1]: net/http.serverHandler.ServeHTTP(0xc000086c30, 0x8db260, 0xc0001b2000, 0xc000128100)
2020-01-06T18:46:26.697620+00:00 app[web.1]: /app/tmp/cache/go1.12.12/go/src/net/http/server.go:2774 +0xa8
2020-01-06T18:46:26.697622+00:00 app[web.1]: net/http.(*conn).serve(0xc00008d180, 0x8dbc20, 0xc0000206c0)
2020-01-06T18:46:26.697625+00:00 app[web.1]: /app/tmp/cache/go1.12.12/go/src/net/http/server.go:1878 +0x851
2020-01-06T18:46:26.697627+00:00 app[web.1]: created by net/http.(*Server).Serve
2020-01-06T18:46:26.697629+00:00 app[web.1]: /app/tmp/cache/go1.12.12/go/src/net/http/server.go:2884 +0x2f4
2020-01-06T18:46:26.697828+00:00 heroku[router]: at=error code=H13 desc="Connection closed without response" method=GET path="/favicon.ico" host=gowebappdatabase.herokuapp.com request_id=088bcdd0-e16f-40f9-a6a0-8d61f4bb5beb fwd="176.61.86.66" dyno=web.1 connect=5ms service=3ms status=503 bytes=0 protocol=https

我希望能够解决这个问题。一整年都让我头疼。

【问题讨论】:

  • 您的处理程序恐慌(在dbconnect.runQuery() 中),因此它不会向响应中写入任何内容。您的应用似乎无法访问数据库。
  • 对不起,icza,我现在才看到你的评论。是的,你完全正确。这是一个数据库身份验证问题。

标签: postgresql http go heroku


【解决方案1】:

您发布的代码不正确:

s.ListenAndServe() 阻塞当前的 goroutine。

第二个s.ListenAndServe() 永远不会在您的代码中调用

您的 dbaccess 代码出现紧急情况。检查您如何处理那里的所有错误:

2020-01-06T18:46:26.697592+00:00 应用[web.1]: /app/tmp/cache/go1.12.12/go/src/runtime/panic.go:522 +0x1b5 2020-01-06T18:46:26.697595+00:00 应用[web.1]: github.com/amunnelly/gowebappdatabase/dbconnect.runQuery(0xc0000946e0, 0x150, 0x0) 2020-01-06T18:46:26.697597+00:00 应用 [web.1]: /tmp/build_b7c9c282f9c067c1b5b5cede1994472d/dbconnect/connectdb.go:78 +0xff 2020-01-06T18:46:26.697599+00:00 应用[web.1]: github.com/amunnelly/gowebappdatabase/dbconnect.PointsGdTableQuery(0xc0000946e0, 0x150, 0x0, 0x0, 0x0) 2020-01-06T18:46:26.697601+00:00 应用 [web.1]: /tmp/build_b7c9c282f9c067c1b5b5cede1994472d/dbconnect/connectdb.go:161 +0x64 2020-01-06T18:46:26.697604+00:00 应用程序[web.1]: github.com/amunnelly/gowebappdatabase/routing.ServeHome(0x8db260, 0xc0001b2000, 0xc000128100) 2020-01-06T18:46:26.697606+00:00 应用程序[web.1]: /tmp/build_b7c9c282f9c067c1b5b5cede1994472d/routing/routing.go:35 +0x1b5

【讨论】:

  • 谢谢德米特里,但我不这么认为。我取出if else 循环并将调用更改为log.Fatal(http.ListenAndServe(":"+os.Getenv("PORT"), nil)),但我仍然遇到同样的错误。我认为这不是数据库问题,因为当我在本地运行代码时,对数据库的调用工作正常。我完全感到困惑。
  • I run the code locally - 在本地您有不同的网络设置。您在部署应用程序的地方访问数据库时遇到网络问题。这就是调用堆栈的含义。
【解决方案2】:

我有这个工作。这是解决方案,希望它在将来能饶恕其他人。

正如 Dmitry 在他的第二个回答中指出的那样,错误在于与 postgresql 数据库的连接。我试图做的是在 heroku 中复制我的本地数据库——也就是说,创建一个仅具有选择权限的用户,然后使用这些用户详细信息来查询数据库。

然而,事实证明,heroku postgres database comes complete with a default user。您只需登录数据库 url 字符串,该字符串可作为环境变量使用。所以我改变了这个

db, err := sql.Open("postgres", aStringWithUserDetails)
if err != nil {
    panic(err)
    }

到这里

db, err := sql.Open("postgres", os.Getenv("DATABASE_URL"))
if err != nil {
    log.Fatal(err)
    }

Bob 现在是我的叔叔了。

【讨论】:

    猜你喜欢
    • 2022-11-05
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多