Nginx в качестве обратного прокси при длинном опросе - PullRequest
6 голосов
/ 22 января 2011

У меня есть apache в качестве внутреннего сервера, который запускает php-скрипты, а nginx в качестве обратного прокси-сервера, который работает со статическим контентом. PHP-скрипт, который дает мне идентификатор некоторого процесса и затем выполняет этот процесс (довольно долго). Мне нужно передать браузеру только идентификатор этого процесса.

  // ...
  ob_start();

  echo json_encode($arResult); // only this data should be passed to browser

  $contentLength = ob_get_length();
  header('Connection: close');
  header('Content-Length: ' . $contentLength);

  ob_end_flush();
  ob_flush();
  flush();
  // then performed a long process

(проверяю состояние процесса другим ajax-скриптом)

Это нормально работает только под apache. Но у меня проблемы, когда Apache отстает от Nginx. В этом случае я получаю ответ только после полного завершения процесса.

Настройки nginx:

server {
  #...
  proxy_set_header Connection close;

  proxy_pass_header Content-Length;
  #...
}

Но я все еще поддерживаю соединение в FireBug.

Как мне заставить nginx немедленно дать ответ от apache?

Надеюсь, вопрос ясен.

Спасибо.

Ответы [ 3 ]

6 голосов
/ 23 января 2011

Вы пробовали отключить proxy_buffering в nginx?Не уверен, что он закроет соединение, но по крайней мере ответ будет передан клиенту.: -)

0 голосов
/ 17 февраля 2011

Если ваш контент большой, вы должны настроить прокси-буферы

клиент преждевременно закрыл соединение при отправке клиенту, в nginx

0 голосов
/ 23 января 2011

Nginx не поддерживает ни один из методов flush () в PHP при использовании в схеме fastcgi или reverse_proxy.

Я протестировал все многочисленные конфигурации proxy_buffering_ *, buffer_size_ * без успеха в nginx / 0.8.49. Он всегда будет ждать выхода из процесса PHP.

...