Як реалізувати long polling за допомогою Nginx та Javascript у мережі досить багато матеріалу. Але повного керівництва ще не зустрічав. То виникають проблеми з компіляцією модуля під Nginx, то браузері крутиться іконка завантаження при long poll запитах. Під катом, повний матеріал як це зробити правильно.
Компіляція Nginx модуля під linux
Для підтримки long polling підключень на сервері Nginx, реалізований чудовий модуль nginx-push-stream-module. Так як він не входить в офіційне постачання, його потрібно завантажити, налаштувати та скомпілювати разом з Nginx.
Перед цим у вас мають бути встановлені всі необхідні пакети
Далі потрібно завантажити сам модуль nginx-push-stream-module, nginx та скомпілювати їх разом.
Клонуємо проект із GIT
Завантажуємо та розпаковуємо останній nginx
Налаштовуємо та компілюємо nginx разом з nginx-push-stream-module
Якщо немає помилок компіляції, все готове. Перевіримо, що ми встановили саме той nginx і те, що тепер у ньому справді є модуль nginx-push-stream-module
Після виконання цих команд, ви повинні побачити таке:
Налаштування Nginx для Long Polling підключень
Опускаючи інші параметри сервера, конфігураційний файл /usr/local/nginx/nginx.conf повинен виглядати так:
Про дуже важливі параметри push_stream_last_received_message_tag і push_stream_last_received_message_time мова піде нижче, коли торкнемося JavaScript.
Приклад для розуміння роботи: Можна створити кілька передплатників, викликавши: stream.example.com/sub/1, stream.example.com/sub/2, stream.example.com/sub/3. Кожен із них «висітиме» на Nginx сервері протягом 25 секунд (push_stream_longpolling_connection_ttl). Якщо ми викличемоPOST запит stream.example.com/pub? >
Створення передплатників у Javascript
Швидше за все, long polling потрібно використовувати для оновлення будь-яких даних у браузері, і для цього вам знадобиться написати Javascript клієнта.
Я спробував різні способи, але за зразок вибрав XMLHttpRequest. Порівняно з іншими методами має такі переваги:
- Відмінно працює у всіх браузерах Chrome, FireFox, Opera, IE 8, 9, 10
- У браузерах не висить іконка завантаження сторінки
- Працює на різних доменах (кросом, якщо на сервер є підтримка CORS)
Нехай у змінній subID – зберігається унікальне значення для передплатника
Важливо сказати про два параметри etag та time.
Без них long polling працював далеко не завжди та повідомлення приходили через раз. Ці два параметри потрібні модулю nginx-push-stream-module для ідентифікації повідомлень, які ще не отримали передплатник. Тож для стабільної роботи це просто необхідно.