бесконечный таймаут для обратного прокси в Apache

Я запускаю торнадо за apache. Я создал прокси-сервер.

ProxyRequests On
ProxyPass /chat/ http://localhost:8888/chat/

Этот код отлично работает и передает все мои запросы торнадо и возвращает ответ клиенту.

Теперь я использую торнадо для длительного опроса. Некоторые из запросов, которые заканчиваются за короткий промежуток времени, говорят, что менее 1 минуты, этот обратный прокси работает нормально. Но некоторые длинные запросы на опрос дают ошибку прокси 502. Причина этой ошибки прокси заключается в том, что Apache может удерживать длинный запрос на опрос всего одну минуту (по умолчанию). Он закрывает запрос и, следовательно, получает ошибку прокси.

Теперь я изменил директиву на

ProxyRequests On
ProxyPass /chat/ http://localhost:8888/chat/ timeout=12000

то есть я изменил тайм-аут по умолчанию на 12000 секунд.

В настоящее время это работает нормально для меня. Но это не лучшее решение вопроса. В идеале длинные запросы на опрос могут превышать любое указанное время ожидания. Итак, мои вопросы

  1. Как сделать таймаут бесконечным? то есть запрос никогда не закрывается Apache.
  2. Пожалуйста, также прокомментируйте: ухудшается ли производительность торнадо при использовании Apache в качестве прокси-сервера?

person Kunal Singh    schedule 06.06.2013    source источник
comment
Привет, мой ответ помог тебе вообще? Можете ли вы прокомментировать ответ, пожалуйста?   -  person vaidik    schedule 05.07.2014


Ответы (1)


У меня возникла аналогичная проблема с Nginx, и я решил ее так же, как и вы. Но я изменил тайм-аут на 1 день, так как в моем случае он был достаточно большим.

Я думаю, что вы не можете избавиться от этого. Обоснование этого заключается в том, что Apache (или любой прокси-сервер в этом отношении) должен поддерживать свою производительность, чего он явно не может, если ему приходится удерживать устаревшие или неактивные соединения. Вы бы предпочли, чтобы ваш прокси-сервер проксировал больше активных соединений, чем неактивных.

Поэтому нет возможности отключить ProxyTimeout в Apache или даже в Nginx (настраивается с помощью proxy_read_timeout). Таким образом, если ваш прокси-сервер не отправляет никакого ответа в течение тайм-аута, то либо ваш сервер приложений слишком долго отвечает, либо с вашим сервером приложений что-то не так, либо клиент не запрашивает никакого ответа. В первом случае вы можете сделать безопасные оценки, чтобы установить соответствующий тайм-аут. Во втором случае вам нужно исправить ваш сервер приложений. А в третьем случае вы должны изящно обработать ситуацию на клиенте и при необходимости переподключиться.

Что касается вашего второго вопроса, не должно быть никакой разницы, кроме задержки между вашим сервером Apache и вашим сервером Tornado. Вы вполне можете представить свой сервер Tornado напрямую всему миру, но это сопряжено с несколькими проблемами: 1. Больше работы операций — убедитесь, что процесс Tornado всегда запущен и работает. 2. Проксирование и балансировка нагрузки станут более сложными. 3. Безопасность хуже, поскольку этот код написали ВЫ, а не тысячи экспертов. Поэтому вам не следует думать о том, чтобы каждый раз запускать этот сервер с правами root. Но вы все равно можете безопасно сделать то же самое с Apache или Nginx.

Конечно вышеперечисленные проблемы решаемы, но зачем решать уже решенную проблему. :)

person vaidik    schedule 29.06.2014