Як реалізувати 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 для ідентифікації повідомлень, які ще не отримали передплатник. Тож для стабільної роботи це просто необхідно.