Как я могу пухнуть геройку Н13? - PullRequest
0 голосов
/ 22 сентября 2019

Я получаю эту ошибку сейчас и выключаю последние пару дней с тех пор, как развернул свое приложение (Ruby on Rails) на heroku.

2019-09-22T15:35:11.196499+00:00 heroku[router]: at=error code=H13 desc="Connection closed without response" method=GET path="/" host=myapp.herokuapp.com request_id=82376036-bcc3-4f63-8019-1b206e534947 fwd="60.114.58.106" dyno=web.1 connect=1ms service=908ms status=503 bytes=0 protocol=https
2019-09-22T15:35:11.252159+00:00 heroku[web.1]: Process exited with status 134

Я пытался выполнять следующие команды, но не мог 't решить ошибку.

$heroku container:rm web
$heroku container:push web
$heroku container:release web

Я хочу знать, как решить ошибку H13.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 23 сентября 2019

H13 - Соединение закрыто без ответа

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

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

Пара выстраивается в линию, у вас возникает ошибка об истечении времени ожидания процесса, скажем, после 15 с:

ERROR -- : worker=1 PID:8 timeout (16s > 15s), killing

Справка Heroku содержит раздел о настройках тайм-аута:

В Unicorn вы можете установить тайм-аут в config / unicorn.rb следующим образом:

timeout 15

Таймер начнет работать после того, как Unicorn начнет обработкузапрос, если пройдет 15 секунд, то главный процесс отправит SIGKILL работнику, но исключение не будет выдано.

Ps Если вы получаете ошибку выше одного запроса, поэтому вы можете попробовать выполнить следующие шаги -

-> push the API call to background job
-> submit the form as ajax
-> In the action which handle submit, trigger the background job and render the job_id , the path to which need to be redirected and other parameter you want to reuse
-> On success of ajax request, trigger another ajax call to a separate method which keep checking the status of the job after a fix interval say 3 seconds.
-> when the second ajax call see that status is complete, it will reload the page
0 голосов
/ 23 сентября 2019

Несколько идей, поскольку я не знаю вашего точного случая:

  • Если для тайм-аута вашего сервера (например, Unicorn) задано значение менее 30 секунд, вы можете попробовать увеличить его до более высокого.значение (но Heroku явно ограничивает это значение 30 с).
  • Если это происходит только тогда, когда вы впервые пытаетесь загрузить приложение после того, как оно простаивает (спит) в течение некоторого времени, тогда это ожидается.Последующие запросы должны быть быстрыми, хотя.
  • Если вы выполняете длинные процессы в контексте HTTP-запроса, и для их завершения часто требуется более 30 секунд, вы можете рассмотреть возможность использования диспетчера фоновых заданий (например, Sidekiq для Ruby) для запуска таких процессов вфон приложения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...