- PVSM.RU - https://www.pvsm.ru -

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

Мы живем в эпоху изобилия и вольны выбирать из десятков предложенных вариантов, тот который нравится нам больше всего.
image

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

  • Мгновенное уведомление клиента о событии
  • Возможность создать сервис, использующий каналы событий благодаря pub/sub архитектуре.
  • Отсутствие постоянного поступление запросов на сервер и снижение нагрузки как следствие.


Наш проект разработан на Ruby on Rails и использует связку Nginx + Passenger.
Из всех библиотек реализующих обмен сообщениями, наиболее безболезненно внедряется Faye [1].

  • Работает как отдельных процесс и не требует использования какого-либо определённого сервера.
  • Не зависит от конфигурации проекта
  • Имеются версии для RoR и Node.js

Процесс настройки и использования подробно описан в документации, статье на хабре Faye как способ не задолбать свой сервер [2] и в скринкасте Faye [3].
Но как это обычно бывает, трудности могут возникнуть в любой момент, стоит сделать шаг в сторону.

Сейчас я хотел бы описать ситуацию настройки Faye при использовании SSL.
Пусть эта небольшая статья сохранит кому-то несколько часов жизни.

Настройка сервера Faye

Faye использует в роли сервера 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: 9292
ssl: true
ssl_key_file: /<Имя проекта>/lib/ssl/cert.key
ssl_cert_file: /<Имя проекта>/lib/ssl/cert.crt
environment: production
rackup: 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 [4] эта технология используется по прямому назначению, для обмена сообщениями между пользователями.
Я не описал немаловажную тему безопасности, но это уже совсем другая история.
Спасибо за внимание.

Автор: maks_ohs

Источник [5]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/ruby-on-rails/67176

Ссылки в тексте:

[1] Faye: http://faye.jcoglan.com

[2] Faye как способ не задолбать свой сервер: http://habrahabr.ru/post/124066/

[3] Faye: http://railscasts.com/episodes/260-messaging-with-faye

[4] Staply: https://staply.co

[5] Источник: http://habrahabr.ru/post/232745/