Использование Faye вместе с SSL

Мы живем в эпоху изобилия и вольны выбирать из десятков предложенных вариантов, тот который нравится нам больше всего.imageРазрабатывая реалтаймовый сервис можно обойтись привычным setInterval (), но стоит воспользоваться возможностями технологии WebSocket и ей подобным. Вот какие преимущества вы получите:

Мгновенное уведомление клиента о событии Возможность создать сервис, использующий каналы событий благодаря pub/sub архитектуре. Отсутствие постоянного поступление запросов на сервер и снижение нагрузки как следствие. Наш проект разработан на Ruby on Rails и использует связку Nginx + Passenger.Из всех библиотек реализующих обмен сообщениями, наиболее безболезненно внедряется Faye.Работает как отдельных процесс и не требует использования какого-либо определённого сервера. Не зависит от конфигурации проекта Имеются версии для RoR и Node.js Процесс настройки и использования подробно описан в документации, статье на хабре Faye как способ не задолбать свой сервер и в скринкасте Faye.Но как это обычно бывает, трудности могут возникнуть в любой момент, стоит сделать шаг в сторону.Сейчас я хотел бы описать ситуацию настройки Faye при использовании SSL.Пусть эта небольшая статья сохранит кому-то несколько часов жизни.

Настройка сервера FayeFaye использует в роли сервера Thin. Запускаем его со включенным SSL.Создаем в корне проекта файл faye.ru со следующим содержимым require 'faye' faye_server = Faye: RackAdapter.new (: mount => '/faye', : timeout => 30) Faye: WebSocket.load_adapter ('thin') run faye_server В директории проекта lib/ssl/ размещаем SSL сертификаты.Создаем файл конфигурации config/thin.yml

— port: 9292ssl: truessl_key_file: /<Имя проекта>/lib/ssl/cert.keyssl_cert_file: /<Имя проекта>/lib/ssl/cert.crtenvironment: productionrackup: faye.ru

Для запуска сервера используем команду:

bundle exec thin -c config/thin.yml -e production start (production режим обязателен)Сервер настроен и запущен, пришло время помочь faye клиенту соединиться.Настройка клиента Faye Клиент будет соединяться по адресу https://example.com/faye Используем Nginx для создания прокси к серверу Faye.В блоке сервера описываем следующий location. location /faye { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass https://127.0.0.1:9292; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection «upgrade»; break; } Перезапускаем Nginx и если все правильно настроено, мы может установить соединение клиента с сервером и подписаться на канал. var faye = new Faye.Client («https://example.com/faye»); faye.subscribe (»/events», function (data) { alert (data) }); Отправка сообщений из Rails Для отправки необходимо сделать запрос на Faye сервер с указанием канала и сообщения. При использовании SSL, для этого используется следующий метод: /* channel канал сообщений data данные в json формате */ def broadcast (channel, data) url = URI.parse («https://localhost:9292/faye») form = Net: HTTP: Post.new (url.path.empty? ? '/' : url.path) form.set_form_data (: message => {: channel => channel, : data => data }.to_json) http = Net: HTTP.new (url.host, url.port) http.use_ssl = url.scheme == «https» http.verify_mode = OpenSSL: SSL: VERIFY_NONE http.start {|h| h.request (form)} end В итоге мы имеем полностью настроенную и работающую систему обмена сообщениями с клиентом.В проекте Staply эта технология используется по прямому назначению, для обмена сообщениями между пользователями.Я не описал немаловажную тему безопасности, но это уже совсем другая история.Спасибо за внимание.

© Habrahabr.ru