Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在nginx和puma上连接ActionCable需要做什么?_Ruby On Rails_Nginx_Redis_Puma_Actioncable - Fatal编程技术网

Ruby on rails 在nginx和puma上连接ActionCable需要做什么?

Ruby on rails 在nginx和puma上连接ActionCable需要做什么?,ruby-on-rails,nginx,redis,puma,actioncable,Ruby On Rails,Nginx,Redis,Puma,Actioncable,我很难将ActionCable连接到我的prod环境中,相关问题还没有有效的解决方案。我使用的是Ubuntu 20.04上的nginx+puma设置和Rails 6.1.3.2。我已经确认,redis server正在端口6379上运行,并且Rails正在作为生产运行 以下是我在日志中得到的信息: I, [2021-05-25T22:47:25.335711 #72559] INFO -- : [5d1a85f7-0102-4d25-bd4e-d81355b846ee] Started GET

我很难将ActionCable连接到我的prod环境中,相关问题还没有有效的解决方案。我使用的是Ubuntu 20.04上的nginx+puma设置和Rails 6.1.3.2。我已经确认,
redis server
正在端口
6379
上运行,并且Rails正在作为生产运行

以下是我在日志中得到的信息:

I, [2021-05-25T22:47:25.335711 #72559]  INFO -- : [5d1a85f7-0102-4d25-bd4e-d81355b846ee] Started GET "/cable" for 74.111.15.223 at 2021-05-25 22:47:25 +0000
I, [2021-05-25T22:47:25.336283 #72559]  INFO -- : [5d1a85f7-0102-4d25-bd4e-d81355b846ee] Started GET "/cable/"[non-WebSocket] for 74.111.15.223 at 2021-05-25 22:47:25 +0000
E, [2021-05-25T22:47:25.336344 #72559] ERROR -- : [5d1a85f7-0102-4d25-bd4e-d81355b846ee] Failed to upgrade to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: close, HTTP_UPGRADE: )
I, [2021-05-25T22:47:25.336377 #72559]  INFO -- : [5d1a85f7-0102-4d25-bd4e-d81355b846ee] Finished "/cable/"[non-WebSocket] for 74.111.15.223 at 2021-05-25 22:47:25 +0000
这种情况每隔几秒钟就会发生一次。您可以在浏览器控制台中看到匹配的输出:

首先,我非常确定我需要在我的nginx站点配置中添加一些部分,比如
/cable
部分,但我还没有找到正确的设置。这是我当前的配置:

server {
    root /home/rails/myapp/current/public;
    server_name myapp.com;
    index index.htm index.html;

        location ~ /.well-known {
                allow all;
        }

        location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # needed to allow serving of assets and other public files
    location ~ ^/(assets|packs|graphs)/ {
        gzip_static on;
        expires 1y;
        add_header Cache-Control public;
        add_header Last-Modified "";
        add_header ETag "";
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/myapp.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/myapp.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    if ($host = myapp.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen   80;
    server_name myapp.com;
    return 404; # managed by Certbot
}
这是我的
配置/cable.yml

开发:
适配器:异步
测试:
适配器:测试
制作:
适配器:redis
网址:
频道前缀:myapp\u制作
config/environments/production.rb
中,我将以下几行注释掉:

#在主进程或域外安装操作电缆。
#config.action\u cable.mount\u path=nil
#config.action\u cable.url='1wss://example.com/cable'
#config.action\u cable.allowed\u request\u origins=['http://example.com“,/http:\/\/example.*/]
我没有在我的路线或任何地方手动安装ActionCable。这是您可以获得的标准设置。我认为答案主要在于正确的nginx配置,但我不知道应该是什么。不过,也许还需要一些Rails配置设置。我不记得在部署乘客时需要做任何改变,但也许彪马是另一回事

更新 我还注意到,其他问题中提出的许多解决方案似乎引用了
tmp/sockets/
中的
.sock
文件。不过,我的
sockets/
目录是空的。除了ActionCable,Web服务器运行良好

更新#2
我还注意到将
config.action\u cable.url
更改为类似
ws://myapp.com
的内容,而不是
wss://myapp.com
即使在重新启动Rails后也没有效果。浏览器控制台错误仍然显示其正在尝试连接到
wss://myapp.com
。可能是因为我被设置为强制将HTTP重定向到HTTPS。我不知道这是否与它有关?

我让它工作起来了。以下是我需要的设置:

nginx配置 我的问题中的配置中的
服务器
部分必须修改,以包括
/
/cable
位置的以下两个部分:

        location / {
                proxy_pass http://localhost:3000;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
        }

        location /cable {
                proxy_pass http://localhost:3000;
                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;
        }
config/environments/production.rb
#将myapp.com更改为应用的位置
config.action\u cable.allowed\u request\u origins=['https://myapp.com' ]

config.hosts我看到它返回404,所以原因可能与config
config.action\u cable.allowed\u request\u origins
config.action\u cable.allown\u same\u origin\u as\u host
@LamPhan有关,我想可能是这样,但将它们分别设置为我的应用程序URL和
true
似乎没有任何效果,即使重新启动Rails和nginx.i认为您错过了
location/cable{…}
,您也可以尝试我的生产配置
location/cable{proxy\u passhttp://backend;proxy_http_version 1.1;proxy_set_标头升级“websocket”;proxy_set_标头连接“升级”;proxy_set_header X-Real-IP$remote_addr;proxy_set_header X-Forwarded-For$proxy_add_X_Forwarded_;}location/{proxy_passhttp://backend;proxy_set_header Host$Host;proxy_set_header X-Forwarded-For$proxy_add_X_Forwarded_;}
,替换
http://backend
by
http://localhost:3000
在您的case@LamPhan我添加了配置,nginx成功重启。没有解决问题。在我的浏览器中访问
/cable
告诉我要在我的产品配置中添加
config.hosts,我设置了
上游后端
并设置了代理
location\cable
,但我在您的配置中没有看到该配置,您可以检查: