Nginx HTTP Push, realtime на вашем сайте

Автор: Eugeniy Marilev
Теги: PHP Linux AJAX
Дата публикации: 2014-09-03 19:11:31

Вашему вниманию предлагается технология Comet (“Long Polling”), основной идеей которой является передача информации браузеру по инициативе сервера. Comet сервера реализуют HTTP Push Relay протокол. Клиент подключается к каналу web-сервера с уникальным ключем (устанавливает обычное соединение, в параметрах передавая уникальный ключ канала), а сервер удерживает соединение, пока не появится очередная порция данных. Данные в канал отправляет, как правило, сам сервер, когда происходит определенное событие (например пользователь вошел он-лайн или же было отправлено сообщение). После отправки данных HTTP-соединение закрывается или же остается открытым, на усмотрение разработчика. Как мы видим, принцип Comet не внедряет ничего нового в HTTP протокол, т.к. этот подход реализуется обычными средствами.

Для внедрения технологии Comet предлагается установить Nginx-сервер c модулем nginx_http_push_module. Необходимо скачать исходные файлы и скомпилировать Nginx c данным модулем:

  1. скачиваем и распаковываем исходники последней стабильной версии nginx-сервера и nginx_http_push_module
    	sudo wget http://nginx.org/download/nginx-1.6.0.zip
    	unzip nginx-1.6.0.zip
    	wget http://pushmodule.slact.net/downloads/nginx_http_push_module-0.692.tar.gz
    	tar -xvf nginx_http_push_module-0.692.tar.gz
    
  2. также при установке может понадобиться библиотека zlib, поэтому желательно скачать и её
    	tar -xvf nginx_http_push_module-0.692.tar.gz
    	tar -xvf zlib-1.2.5.tar.gz
    
  3. переходим в папку nginx-1.6.0 и компилируем
    	cd /path/to/nginx-1.6.0/
    	./configure –with-zlib=/path/to/zlib-1.2.5 --add-module=/path/to/nginx_http_push_module-0.692 
    	make
    	install
    

Конфигурация

Чтобы работать, нужно настроить сервер, для этого в настройках сервера нужно определить два адреса: адрес публикации и адрес прослушки сообщений.

location /publish {
	# Определяет адрес публикации
	push_publisher;
	# Название переменной, в которую будет записываться уникальный ключ канала
	# в примере "cid", т.е. запрос будет иметь вид: http://example.com/publish?cid=s42378fwe
	set $push_channel_id $arg_cid;
}
location /listen {	
	# Определяет адрес подписки на прослушивание канала
	push_subscriber;
	# Уникальный ключ канала, аналогично как и для  push_publisher
	set $push_channel_id $arg_cid;
	# Тип ответа по умолчанию
	default_type text/plain;
}

Область применения

Технология Comet применяется в различных web-приложениях. Как правило там, где требуется вносить какие-то изменения на странице пользователя в режиме реального времени без перезагрузки страницы. Например он-лайн чат. Изначально неизвестно, в какой момент времени один пользователь отправит другому сообщение. Если чат реализовать при помощи постоянных ajax-запросов в определенный интервал, то будет погрешность во времени, т.к. пользователь узнает о входящем сообщении не в тот момент, когда ему его отправят, а в момент следующего ajax-запроса. Это не удовлетворяет требованиям чата, а вот Comet как раз полностью соответствует таким требованиям. К тому же данная технология в значительной степени экономит ресурсы сервера. В настоящее она становится все более восстребованой, т.к. web-приложения становятся все более динамичными и интерфейс пользователя должен моментально реагировать на события сервера и действия других пользователей.

Вашему вниманию предлагается класс NginxHttpPush для прослушивания и публикации сообщений в каналы nginx_http_push_module. Этот класс используется в популярном фреймворке yii, при желании его можно легко перенести на другую платформу. Он состоит из двух методов.

Первый publish() - для публикации сообщений, принимающий на вход уникальный ключ канала, данные, тип данных (по умолчанию application/json), а также код ответа модуля nginx_http_push_module, который должен вернуть nginx сервер в случае успешного отправления сообщения.

Метод listen() - для подписки на прослушку сообщения. В параметры передается ключ канала, а также флаг, который в случае true будет слушать канал до последнего и таймаут ответа с сервера.

В качестве свойств класса обозначены общие настройки сервера nginx, такие как хост, адрес публикации и прослушки сообщений, порт, название переменной с уникальным ключом и таймаут запроса.

Вы можете скачать исходный код компонента для yii 1.x здесь

Комментарии к статье
Комментарии:
Нет результатов.
Только зарегистрированые пользователи могут оставлять комментарии