Чат, созданный с помощью 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.