Чат, созданный с помощью Event Machine Websocket на рельсах, работает в процессе разработки, но не на производстве

Я создал чат в приложении rails и использую EventMachine для запуска Websocket, чтобы иметь чат. Живой чат работает на localhost на нескольких машинах.

Он также работал на экземпляре Amazon EC2, находящемся в разработке на Ubuntu, но когда я попытался перевести его в рабочий режим, живой чат больше не работал. Данные не отправляются туда и обратно.

Вот мой контроллер:

@clients = []
  EM.run do
    EM::WebSocket.start(host: "0.0.0.0", port: 3060) do |ws|
      crypt = ActiveSupport::MessageEncryptor.new(ENV['SECRET_KEY_BASE'])
      ws.onopen do |handshake|
        conversation_data = crypt.decrypt_and_verify(handshake.query_string)
        @clients << {socket: ws, conv_info: conversation_data}
      end

      ws.onclose do
        ws.send "Closed."
        @clients.delete ws
      end

      ws.onmessage do |data|
        data = data.split('L56HTY9999')
        body = data[0]
        key = data[-1]
        conversation = crypt.decrypt_and_verify(key)
        new_message = Message.new(body: body, user_id: conversation[:user_id], conversation_id: conversation[:conversation_id])
        if new_message.save
          @clients.each do |socket|
            if socket[:conv_info][:conversation_id] == conversation[:conversation_id]
              socket[:socket].send new_message.chat_show
            end
          end
        else
          if socket[:conv_info][:user_id] == conversation[:user_id]
            socket[:socket].send new_message.errors.to_json
          end
        end
      end
    end
  end

Это мой JavaScript на странице:

function addMessage(msg) {
    var content = JSON.parse(msg);
    var context = {
      userImage: content.image,
      author: content.username,
      convoText: content.body,
      time: content.created_at
    };

    var source = $('#add-newest-comment').html();
    var template = Handlebars.compile(source);


    var newComment = template(context);

    $('#container').append(newComment);
  }

  var key = '<%= @conv_id %>';
  var socket, host;
  host = "ws://0.0.0.0:3060?"+ key;

  function onErrors(msg){
    $("#chat-log .error").text( msg);
    setTimeout(function() {
      $( "#chat-log .error" ).text("");
    }, 3000);

  }
  function socketHealth(msg){
    console.log(msg);
  }

  function connect() {
    try {
      socket = new WebSocket(host);

      socketHealth("Socket State: " + socket.readyState);

      socket.onopen = function() {
        socketHealth("Socket Status: " + socket.readyState + " (open)");
      }

      socket.onclose = function() {
        socketHealth("Socket Status: " + socket.readyState + " (closed)");
      }

      socket.onmessage = function(msg) {
        addMessage(msg.data);
      }
    } catch(exception) {
      onErrors("Error: " + exception);
    }
  }

  $(function() {
    connect();
  });


  function send() {
    var text = $("#message").val();
    if (text == '') {

      onErrors("Please Enter a Message");
      return;
    }

    try {
      socket.send(text + 'L56HTY9999' + key);
    } catch(exception) {
      onErrors("Failed To Send")
    }

    $("#message").val('');
  }

  $('#message').keypress(function(event) {
    if (event.keyCode == '13') { send(); }
  });

  $("#disconnect").click(function() {
    socket.close()
  });

Я запускаю свой сервер с этой командой:

bundle exec thin start -p 80 -d -l thin.log -P thin.pid

Мой сайт доступен по адресу http://puppyplaydate.co/

Консоль регистрирует это

Socket State: 0

messages:153 WebSocket connection to 'ws://0.0.0.0:3060/?aVI0OFVHS2VET3d4OTQ4M2s4Rk5VMld1eVlXOUFoVUFxT1JMSm5LWDJOUEhScU50MzFub2JMQ3Y4NG1uekl3TS0tYnlBU1ZRclErK3QxWERHN0taSTVzUT09--01ec4a49ce0aeef59bee5d5b8e13d7916abc20e1' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED

messages:148 Socket Status: 3 (closed)

Я использовал netstat, чтобы проверить, что сервер прослушивает этот порт, и получил это обратно:

tcp        0      0 *:3060                  *:*               LISTEN    

Я исследовал онлайн, и кто-то сказал, что они использовали гем "daemon" для запуска websocket на производстве? Я не уверен, что это то, что мне нужно.

Я действительно застрял, заранее спасибо за вашу помощь!

1 ответ

Проблема заключалась в том, что я использовал Thin-сервер, а не Rails, вместо того, чтобы запускать сервер Rails, который также был настроен для загрузки Thin.

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