Поддержка 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;