Heroku Go Ошибка WebApp - соединение закрыто без ответа - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь развернуть приложение Golang в Heroku. Я получаю ошибку H13, и я не знаю, как ее исправить.

Приложение запрашивает базу данных и возвращает таблицу результатов. База данных маленькая, запрос маленький. Он работает локально на порту 8080, никаких проблем.

В документации H13 Error говорится, что

Эта ошибка выдается, когда процесс в вашем веб-dyno принимает соединение, но затем закрывает сокет, ничего не записывая к этому.

Один из примеров, когда это может произойти, - когда веб-сервер Unicorn настроен с тайм-аутом короче 30 с, и запрос не был обработан работником до истечения тайм-аута. В этом случае Unicorn закрывает соединение до записи каких-либо данных, что приводит к H13.

Насколько мне известно, я не использую веб-сервер Unicorn (хотя я нахожусь за пределами своей зоны комфорта в необходимости настройки серверов в первую очередь). Я запускаю приложение из пакета 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

Я бы хотел исправить это. Это ломало мне голову весь год.

Ответы [ 2 ]

0 голосов
/ 11 января 2020

У меня это работает. Вот решение, в надежде, что оно избавит кого-то еще в будущем.

Ошибка, как отметил Дмитрий во втором ответе, связана с подключением к базе данных postgresql. Я попытался скопировать мою локальную базу данных в heroku, то есть создать пользователя только с привилегиями выбора, а затем использовать эти данные пользователя для запроса к базе данных.

Оказывается, однако, что heroku postgres База данных поставляется с пользователем по умолчанию . Все, что вам нужно для входа - это строка 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)
    }

, и Боб теперь мой дядя.

0 голосов
/ 06 января 2020

Ваш опубликованный код неверен:

s.ListenAndServe() блокирует текущую программу.

секунда s.ListenAndServe() никогда не вызывается в вашем коде

Ваш код dbaccess паникует. Проверьте, как вы там обрабатываете все ошибки:

2020-01-06T18: 46: 26.697592 + 00: 00 app [web.1]: /app/tmp/cache/go1.12.12/go/ src / runtime / pani c. 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 [web.1]: /tmp/build_b7c9c282f9c067c1b5b5cede1994472d/dbconnect/connectdb.go:78 + 0xff 2020-01-06T18 + 46: 26.6975 Приложение 00:00 [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 приложение [web.1]: github.com/amunnelly/goweberves. 0x8db260, 0xc0001b2000, 0xc000128100) 2020-01-06T18: 46: 26.697606 + 00: 00 app [web.1]: /tmp/build_b7c9c282f9c067c1b5b5cede1994472d/routing/routing.*1 01 * 101 * 101 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 3 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...