Ruby on rails 在nginx和puma上连接ActionCable需要做什么?
我很难将ActionCable连接到我的prod环境中,相关问题还没有有效的解决方案。我使用的是Ubuntu 20.04上的nginx+puma设置和Rails 6.1.3.2。我已经确认,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
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,所以原因可能与configconfig.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://backendbyhttp://localhost:3000
在您的case@LamPhan我添加了配置,nginx成功重启。没有解决问题。在我的浏览器中访问/cable
告诉我要在我的产品配置中添加config.hosts,我设置了上游后端
并设置了代理location\cable
,但我在您的配置中没有看到该配置,您可以检查: