Подписчики в nginx

Всем привет. Есть хороший модуль: nginx http push module. Он позволяет реализовать long-poll.

Суть работы проста: есть адрес для отправки событий на какой-то канал, есть адрес для чтения события из указанного канала.

Чтобы опубликовать канал я делаю POST-запрос вида:

> POST /pub?channel=1 HTTP/1.1
> User-Agent: test
> Host: localhost
> Accept: */*
> Content-Length: 4
> Content-Type: application/x-www-form-urlencoded
>
TEST * upload completely sent off: 4 out of 4 bytes


Ответ:

< HTTP/1.1 202 Accepted
< Server: nginx
< Date: Fri, 20 Apr 2012 10:29:44 GMT
< Content-Type: text/plain
< Content-Length: 81
< Connection: keep-alive
Тут текст о том, что сообщение добавлено


Все нормально, а теперь я хочу, чтобы клиент читал этот канал. Проблема в том, что сервер обрывает GET запрос. То есть я делаю:

> GET /sub?channel=1 HTTP/1.1
> User-Agent: test
> Host: localhost
> Accept: */*


Получаю ответ:

< HTTP/1.1 200 OK
< Server: nginx
< Date: Fri, 20 Apr 2012 10:29:34 GMT
< Content-Type: application/x-www-form-urlencoded
< Content-Length: 4
< Last-Modified: Fri, 20 Apr 2012 10:29:34 GMT
< Connection: keep-alive
< Etag: 0
< Vary: If-None-Match, If-Modified-Since
<
* Connection #0 to host localhost left intact
TEST* Closing connection #0


Так вот, мне не нравится «Closing connection». Неужели это правильно, что клиент/подписчик посылает GET-запрос, получает последнее сообщение и отключается? Я до этого использовал модуль nginx push stream, там подключение висело и клиент раз посылал GET-запрос а потом только читал из сокета поступающие соединения из канала. Может я чего-то не так делаю?

В документации написано, типа можно этим управлять через заголовки Etag, If-None-Match, If-Modifief-Since, но смысл в них, если для их использования каждый раз нужно составлять GET-запрос. Запросы шлются очень часто, поэтому я не могу постоянно пересоздавать подключение между клиентом и сервером.
  • Вопрос задан
  • 3849 просмотров
Решения вопроса 1
ertaquo
@ertaquo
Вроде бы все правильно. Вы в своем POST-запросе передаете заголовок:
> Content-Length: 4

Соответственно nginx берет только первые четыре буквы — «TEST».
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
taliban
@taliban
php программист
javascript.ru/ajax/comet/long-poll Все правильно, при длинных запросах связь обрывается при прочтении ответа, и запрос шлется еще раз. Разница между обычными запросами лишь в длительности ожидания ответа.
В отличии от потока, где открывается сокет и данные гоняют туда сюда не отключаясьи (websocket).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы