我一直在尝试在基于AWS的Rails 5.2应用程序中的Ruby(2.5)中使用ActionCable,该应用程序在AWS,经典负载均衡器,Elastic Bean Stalk环境(乘客Amazon 64位Linux 2.7.2,Postgresql)中进行生产。刚开始,Redis无法正常工作,所以我将适配器切换到了postgresql,除了我目前遇到的两个错误之外,它还修复了很多页面错误。聊天应用程序正常运行,只是发送和接收消息的最重要部分没有刷新。 ActionCable在Development中工作正常,并且我都没有收到任何错误。我在日志中收到一个错误,在浏览器控制台上收到一个重复性错误。
以下是Chrome上的错误,每隔几秒钟就会出现一次。
application-d192ecfa7b18a37710113f3ff55fa53e559048f4f74047c1ac2895013f588b6e.js:22与'wss://www.my-app.com/cable'的WebSocket连接失败: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]未知指令。我在其中尝试了其他解决方案,例如指定 location / cable ,这是大量的指南,教程和SO帖子,我在其中实现并尝试了每个解决方案:ActionCable - Failed to upgrade to WebSocket in production
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);
routes.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:[警报]无法打开错误日志文件:open() “ /var/log/nginx/error.log”失败(13:权限被拒绝)2018/12/10 20:33:52 [warn] 10587#0:只有在以下情况下,“用户”指令才有意义 主进程以超级用户权限运行,在 /etc/nginx/nginx.conf:5 2018/12/10 20:33:52 [警告] 10587#0: 在0.0.0.0:80上有冲突的服务器名称“ localhost”,忽略了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),我能够解决无法升级Websocket错误和404 Handshake Error响应的问题。这是通过删除我上面具有的nginx.conf配置并将其添加到nginx / conf.d文件夹中的default.conf文件中来完成的。以下是我的新配置。
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”
再次感谢!
答案 0 :(得分:0)
2018/12/10 20:05:02 [error] 7640#0: *533 connect() to unix:///var/run/puma/my_app.sock failed
(111: Connection refused) while connecting to upstream,
client: 172.31.33.196, server: , request: "GET / HTTP/1.1", upstream: "http://unix:///var/run/puma/my_app.sock:/", host: "172.31.11.174"
此错误是由于上游未找到my_app.sock
文件。您只需在proxy_pass中将backend
替换为ip:port
,错误就会消失。例如:
proxy_pass http://132.197.231.16:3000;