Поддержка WebSockets в Phusion Passenger с помощью em-websocket

Я пытаюсь поддерживать интерфейс WebSocket для моего приложения Rails. Я на Rails 4 и не планирую сразу переходить на Rails 5. Я использую Phusion Passenger 5.0.30 за nginx.

Я хочу использовать em-websocket (+eventmachine) для создания этой поддержки. Какие параметры конфигурации Пассажира я должен использовать?

server {
  listen 80 default_server;
  server_name ergo;
  root /home/user/www/testapp/public;
  passenger_enabled on;
  passenger_app_env development;

  passenger_max_preloader_idle_time 0;

  location /notify {
    proxy_pass http://ergo:3004/notify;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    passenger_force_max_concurrent_requests_per_process 0;
  }
}

Используя вышеуказанную конфигурацию и следующий код для запуска цикла EM в config/initializers/event_machine_init.rbЯ не могу заставить работать сервер веб-сокетов. Нужны ли дополнительные изменения конфигурации?

require 'eventmachine'
require 'em-websocket'

module EventMachineInit
  def self.start
    if defined?(PhusionPassenger)
      PhusionPassenger.on_event(:starting_worker_process) do |forked|
      # for passenger, we need to avoid orphaned threads
        if forked && EM.reactor_running?
          EM.stop
        end

        Thread.new do
          puts "Starting EventMachine thread"
          EM.run do
            EM::WebSocket.run(host: "0.0.0.0", port: 3004) do |ws|
              ws.onopen do |handshake|
                puts "WebSocket connection open"
                ws.send "Hello Client, you connected to #{handshake.path}"
              end

              ws.onclose { puts "WebSocket connection closed" }

              ws.onmessage do |msg|
                puts "Received message: #{msg}"
                ws.send "Pong: #{msg}"
              end
            end
          end
        end
        die_gracefully_on_signal
      end
    end
  end

  def self.die_gracefully_on_signal
    Signal.trap("INT")  { EM.stop }
    Signal.trap("TERM") { EM.stop }
  end
end

РЕДАКТИРОВАТЬ: я смог заставить вышеупомянутое работать с изменениями, предложенными @Priyank Gupta в комментариях под вопросом. Изменения были:

proxy_pass http://ergo:3004/notify;

стали:

proxy_pass http://localhost:3004/notify;

Я также добавил:

proxy_redirect off;

0 ответов

Другие вопросы по тегам