Я пытался получить ActionCable в Ruby (2.5) в приложении Rails 5.2, работающем над производством в AWS, классическом балансировщике нагрузки, среде Elastic Bean Stalk (пассажирская версия Amazon 64bit Linux 2.7.2, Postgresql).Сначала Redis не работал, поэтому я переключил адаптер на postgresql, который исправил множество ошибок на странице, кроме двух, которые у меня есть в настоящее время.Приложение чата функционирует нормально, за исключением наиболее важной части отправки и получения сообщений без обновлений.ActionCable прекрасно работает в разработке, и я не получаю ни одной ошибки.Я получаю одну ошибку в журналах и одну повторяющуюся ошибку на консоли браузера.
Ниже приведена ошибка в Chrome, которая заполняется каждые несколько секунд.22 Сбой подключения WebSocket к «wss: //www.my-app.com/cable»: Ошибка при рукопожатии WebSocket: Неожиданный код ответа: 404
Также в журналах я получаю эту ошибку:
E, [2018-12-01T00: 09: 22.806141 # 8733] ОШИБКА -: [92c25112-2d7b-4ae5-8567-73f9f1eb73be] Не удалось выполнить обновление до WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: keep-alive, HTTP_UPGRADE:)
Ниже приведены соответствующие файлы для ActionCable.Я перепробовал очень много проблем и разных предложений.Я попытался изменить файл nginx.conf, но всякий раз, когда я помещал какие-либо директивы passenger_ *, которые рекомендовались несколькими источниками, перезапуск NGINX приводил к ошибке, в которой сообщалось [emerg] неизвестная директива .Я попробовал другие решения внутри этого, такие как указание местоположение / кабель , тонна руководств, учебных пособий и сообщений SO, подобных этому, в котором я реализовал и попробовал каждое: ActionCable - не удалось обновить до WebSocket впроизводство
cable.yml
development:
adapter: postgresql
test:
adapter: async
production:
adapter: postgresql
channel_prefix: production
Production.rb
config.action_cable.mount_path = '/cable'
config.action_cable.url = 'wss://mywebsite.com/cable'
config.action_cable.allowed_request_origins = [ 'http://mywebsite.com', 'https://mywebsite.com' ]
cable.js
(function() {
this.App || (this.App = {});
App.cable = ActionCable.createConsumer("/cable");
}).call(this);
rout.rb
mount ActionCable.server => '/cable'
application_cable / connection.rb
module ApplicationCable
class Connection < ActionCable::Connection::Base
identified_by :current_admin
def connect
self.current_admin = find_verified_user
logger.add_tags "ActionCable", "Admin: #{current_admin.email}"
end
protected
def find_verified_user
verified_user = Admin.find_by(id: cookies.signed['admin.id'])
if verified_user
verified_user
else
reject_unauthorized_connection
end
end
end
end
См. Обновление ниже для конфигурации nginx.
После запуска nginx -t это следующее считывание:
nginx: [alert] не удалось открыть файл журнала ошибок: open () «/var/log/nginx/error.log» не удалось (13: разрешение отклонено) 2018/12/10 20:33:52 [warn] 10587 # 0: директива user имеет смысл только в том случае, если мастер-процесс выполняется с привилегиями суперпользователя, игнорируется в /etc/nginx/nginx.conf:5 2018/12/10 20:33:52 [warn] 10587 # 0: конфликтующее имя сервера "localhost" на 0.0.0.0:80, игнорируется nginx: файл конфигурации /etc/nginx/nginx.conf в порядке 2018/ 12/10 20:33:52 [emerg] 10587 # 0: open () «/var/run/nginx.pid» не удалось (13: разрешение запрещено) nginx: файл конфигурации /etc/nginx/nginx.conf тест не пройден
Большое спасибо за чтение и любую помощь.
ОБНОВЛЕНИЕ
С помощью пользователя Reddit (вот ссылка: reddit post ) Мне удалось устранить ошибку «Не удалось обновить веб-сокет» и ответ 404 «Ошибка рукопожатия».Это было сделано путем удаления конфигурации nginx.conf, которую я описал выше, и добавления ее в файл default.conf в папке nginx / conf.d.Ниже моя новая конфигурация.
upstream backend {
server unix:///var/run/puma/my_app.sock;
}
server {
listen 80;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
large_client_header_buffers 8 32k;
location / {
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_set_header X-NginX-Proxy true;
proxy_buffers 8 32k;
proxy_buffer_size 64k;
proxy_pass http://backend;
proxy_redirect off;
location /assets {
root /var/app/current/public;
}
# enables WS support
location /cable {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade websocket;
proxy_set_header Connection Upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
Теперь нет ошибок в моем production.log или в консоли браузера.Тем не менее, у меня все еще есть те тестовые ошибки nginx, и все еще есть ошибка в nginx / error.log.Эта ошибка ниже:
2018/12/10 20:05:02 [ошибка] 7640 # 0: * 533 connect () для unix: /// var / run / puma / my_app.сбой sock (111: соединение отклонено) при подключении к восходящему каналу, клиенту: 172.31.33.196, серверу:, запрос: «GET / HTTP / 1.1», восходящий поток: «http://unix:///var/run/puma/my_app.sock:/", хост:« 172.31.11.174 »
Еще раз спасибо!