每个人:)。 我知道人们已经面临很多与我有关的问题。我已经尝试了所有但我的问题尚未解决。我过去3天一直在努力解决这个问题,但我无法做到。
我第一次使用ActionCable,而在开发服务器上它运行正常。但在我使用Puma和Nginx的制作中,我面临着可怕的问题。
最初,当我在nginx配置中没有(位置/电缆)设置时,服务器给我404握手错误
即WebSocket握手期间出错:意外的响应代码:404然后在nginx配置中添加以下位置/电缆配置后,我开始收到502错误的网关错误。
注意:我没有专门为ActionCable打开任何端口。我认为这不是必需的。只有端口80在我的服务器上打开。
我需要一些专家来帮助我。我需要快速帮助才能解决问题。在此先感谢:)
我的环境/ production.rb
中有这两行config.action_cable.url = "ws://my_linode_domain/cable"
config.action_cable.allowed_request_origins = [/http:\/\/*/, /https:\/\/*/]
这是我的nginx配置文件
upstream app {
# Path to Puma SOCK file, as defined previously
server unix:/home/deploy/artcrate/shared/tmp/sockets/puma.sock fail_timeout=0;
}
server {
listen 80;
#server_name localhost;
server_name my_linode_domain
# prevents 502 bad gateway error
large_client_header_buffers 8 32k;
root /home/deploy/artcrate/current/public;
try_files $uri/index.html $uri @app;
location / {
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Connection '';
proxy_pass http://app;
}
location ~ ^/(assets|fonts|system)/|favicon.ico|robots.txt {
gzip_static on;
expires max;
add_header Cache-Control public;
}
location /cable{
proxy_pass http://app;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
error_page 500 502 503 504 /500.html;
client_max_body_size 4G;
keepalive_timeout 10;
}
我在位置/电缆设置中尝试过各种proxy_pass选项,但都没有。
答案 0 :(得分:2)
的所有人。 :)
经过一周的努力,努力工作并不断地使用nginx和puma配置文件并一次又一次地敏锐地阅读博客,我能够找出问题。
我的nginx配置是正确的。我不得不在puma.rb配置中添加两行,这些配置没有默认配置。这两行是:
workers 2
daemonize true
daemonize true:这告诉puma通过生成子进程并从执行的shell中分离它来在后台运行。如果你不使用daemonize,你需要通过nohup运行puma进程并明确地将它放在后台。
我不确定我是否需要工人2 ,但我在解决问题时添加了它们。所以我把它放在那里。但是在添加了两行后,我的ActionCable开始正常工作。
答案 1 :(得分:2)
我用于此项目的RAILS和RUBY版本是
排名5.0.7
红宝石2.3.1p112
好。因此,今天我想将Action Cable再次集成到我的项目中,但是又遇到了同样的问题。我应用了上述解决方案,但是没有用。上一次虽然可以工作,但是我对解决方案感到不满意,因为为什么ActionCable为什么要在本地计算机上的单线程/工作器中工作。
但是这次我集中精力找出了罪魁祸首。
罪魁祸首是NGINX配置
遇到404握手错误时的配置
location /cable {
proxy_pass http://example.com;
proxy_http_version 1.1;
proxy_set_header Upgrade websocket;
proxy_set_header Connection Upgrade;
}
一切正常后配置。
location /cable {
proxy_pass http://puma;
proxy_http_version 1.1;
proxy_set_header Upgrade websocket;
proxy_set_header Connection Upgrade;
}
罪魁祸首是:
proxy_pass http://example.com;
在这里,我们将其指向NGINX,这是错误的,它应该指向我们的puma服务器路径,在我的配置中,路径由“ puma”表示。
这是我在Action Server上实施ActionCable及其工作副本的摘要
因此要将Action Cable与Rails 5集成在一起,您需要执行以下步骤:
根据您的应用程序环境,将这些行添加到environment / staging.rb或environment / production.rb中。
config.action_cable.url = [/ ws:// * /,/ wss:// * /]
config.action_cable.allowed_request_origins = [/ http:// * /,/ https:// * /]
最后如上所述设置您的NGINX文件。这是我在nginx.conf中的完整NGINX配置。我已将网站名称替换为“ example.com”,并将项目名称替换为“ example”。因此,如果您要复制任何内容,请确保将其替换为您的内容,否则将无效,因为路径将被破坏。
我希望这能真正缓解将ActionCable推向实时应用程序并为任何人解决此握手错误的麻烦,因为这是非常棘手和技术性的工作,许多文档只是提到将动作电缆指向您的主站点URL和不是在您的nginx后面运行的puma服务器。
谢谢。