ActionCable Websocket升级和404错误



我一直在尝试在Rails 5.2应用程序上的Ruby(2.5(中获得ActionCable,该应用程序在AWS、经典负载均衡器、Elastic Bean Stalk环境(乘客亚马逊64位Linux 2.7.2、Postgresql(中进行生产。起初,Redis无法工作,所以我将适配器切换到postgresql,它修复了除了我目前存在的两个页面错误之外的许多页面错误。聊天应用程序运行正常,但最重要的部分是在不刷新的情况下发送和接收消息。ActionCable在开发中工作得很好,我也没有收到任何错误。我在日志中收到一个错误,在浏览器控制台上收到一个重复错误。

以下是Chrome上的错误,每隔几秒钟就会填充一次。

application-d192ecfa7b18a37710113f3ff55fa53e59048f4f74047c1ac2895013f588b6e.js: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:保持活动,HTTP_upgrade:(

以下是ActionCable的相关文件。我尝试了很多故障排除和不同的建议。我试图修改nginx.conf文件,但每当我放入任何与passenger_*相关的指令(一些消息来源建议使用(时,重新启动nginx会给我一个错误,说[emerg]未知指令。我尝试了其他解决方案,比如指定位置/电缆,大量的指南、教程和SO帖子,比如这篇文章,我在其中实现并尝试了每一个:ActionCable-未能在生产中升级到WebSocket

电缆.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' ]

电缆.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:[alert]无法打开错误日志文件:open(("/var/log/nginx/error.log"失败(13:权限被拒绝(2018/12/1020:33:52[warn]10587#0:只有当主进程使用超级用户权限运行,在中被忽略/etc/nginx/nginx.conf:5 2018/12/10 20:33:52[warn]10587#0:0.0.0.0:80上存在冲突的服务器名称"localhost",忽略nginx:配置文件/etc/nginx/nginx.conf语法正常2018/12/1020:33:52[emerg]10587#0:open(("/var/run/nginx.pid"失败(13:权限被拒绝(nginx:配置文件/etc/nginx/nginix.conf测试失败的

非常感谢您的阅读和任何帮助。

更新

通过一位Reddit用户的帮助,(这里有链接:Reddit帖子(我解决了升级Websocket失败的错误和404握手错误响应。这是通过删除上面的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[error]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">

再次感谢!

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,错误就会消失。例如:

代理通行证http://132.197.231.16:3000;

相关内容

最新更新