2015-11-10 3 views
2

Контекст: Я использую приложение elixir + phoenix https://github.com/endeepak/stub_on_web на Heroku. Я выполнил шаги, упомянутые в http://www.phoenixframework.org/docs/heroku, для развертывания приложения.Elixir + Phoenix on Heroku: ошибка таймаута через 15 секунд

Проблема: Когда запрос POST занимает больше времени, чем 15 секунд, веб-сервер возвращает 500 Внутренняя ошибка сервера с бревнами показывая ошибку как no case clause matching: {:error, :timeout}. стек ошибок наклеена ниже

2015-11-10T16:56:06.680425+00:00 app[web.1]: 16:56:06.680 request_id=19c1ba3f-cfaf-476f-a145-12d234b61c55 [info] POST /stub_urls 
2015-11-10T16:56:21.684018+00:00 heroku[router]: at=info method=POST path="/stub_urls" host=stubonweb.herokuapp.com request_id=19c1ba3f-cfaf-476f-a145-12d234b61c55 fwd="43.247.159.40" dyno=web.1 connect=1ms service=15004ms status=500 bytes=243 
2015-11-10T16:56:21.683882+00:00 app[web.1]: 16:56:21.683 [error] #PID<0.429.0> running StubOnWeb.Endpoint terminated 
2015-11-10T16:56:21.683887+00:00 app[web.1]: Server: stubonweb.herokuapp.com:80 (http) 
2015-11-10T16:56:21.683888+00:00 app[web.1]: Request: POST /stub_urls 
2015-11-10T16:56:21.683889+00:00 app[web.1]: ** (exit) an exception was raised: 
2015-11-10T16:56:21.683890+00:00 app[web.1]:  ** (CaseClauseError) no case clause matching: {:error, :timeout} 
2015-11-10T16:56:21.683891+00:00 app[web.1]:   (plug) lib/plug/parsers/urlencoded.ex:10: Plug.Parsers.URLENCODED.parse/5 
2015-11-10T16:56:21.683892+00:00 app[web.1]:   (plug) lib/plug/parsers.ex:186: Plug.Parsers.reduce/6 
2015-11-10T16:56:21.683893+00:00 app[web.1]:   (stub_on_web) lib/stub_on_web/endpoint.ex:1: StubOnWeb.Endpoint.phoenix_pipeline/1 
2015-11-10T16:56:21.683894+00:00 app[web.1]:   (stub_on_web) lib/phoenix/endpoint/render_errors.ex:34: StubOnWeb.Endpoint.call/2 
2015-11-10T16:56:21.683894+00:00 app[web.1]:   (plug) lib/plug/adapters/cowboy/handler.ex:15: Plug.Adapters.Cowboy.Handler.upgrade/4 
2015-11-10T16:56:21.683895+00:00 app[web.1]:   (cowboy) src/cowboy_protocol.erl:442: :cowboy_protocol.execute/4 

Мои наблюдения

  • Это не «ошибка H12» в Heroku маршрутизатора, который происходит, если запрос занимает больше времени, что 30-е годы. Ссылка: https://devcenter.heroku.com/articles/request-timeout. Я не мог получить большую помощь от поддержки герою, поскольку это похоже на проблему с веб-сервером, и они не знают erlang/elixir.

  • Я пробовал работать на локальном компьютере с конфигурацией производства, смоделировал задержку в 60 секунд. Запрос возвращает ответ 200 OK после 60 секунд без какой-либо ошибки таймаута, как указано выше.

Есть ли какая-либо конфигурация, которую я здесь отсутствует? Любые другие мысли?

+0

Этот вопрос GitHub может быть связано: https://github.com/ninenines/cowboy/issues/ 833 –

+0

Спасибо @PatrickOscity. Этот вопрос привел меня к другой теме в вопросах феникса и временному исправлению проблемы. Если кто-либо сталкивается с подобной проблемой, обратитесь к https://github.com/phoenixframework/phoenix/issues/459#issuecomment-155657741 для объяснения и обходного решения –

ответ

2

Проблема произошла с тех пор, как я добавил плагин для чтения тела запроса и сохранил его как частные назначения в conn для будущего доступа. Код, используемый ранее был

defp copy_req_body(conn, _) do 
    {:ok, body, _} = Plug.Conn.read_body(conn, length: 1_000_000_000) 
    Plug.Conn.put_private(conn, :raw_request_body, body) 
end 

plug :copy_req_body 

plug Plug.Parsers, 
    parsers: [:urlencoded, :multipart, :json], 
    pass: ["*/*"], 
    json_decoder: Poison 

Там, кажется, вопрос с заглушкой, которая вызывает: тайм-аут, когда Plug.Parsers пытаться снова прочитать тело.

темп работы вокруг в настоящее время является использование кода, как это было предложено в https://github.com/phoenixframework/phoenix/issues/459#issuecomment-155671415

Ссылка фиксации: https://github.com/endeepak/stub_on_web/commit/47192558f501652edd8cd237a5a2430f38177ca4