Rails with Action Cable 运行 是否在 Puma 前面使用 NGiNX 代理?

Does Rails with Action Cable run with NGiNX proxying in front of Puma?

我知道关于这个主题还有 1-2 个其他问题 - 但其中 none 似乎涵盖了我的角度或提供了解决方案;

我的浏览器控制台显示:

WebSocket connection to 'wss://sucker.alco.dk/cable' failed: WebSocket is closed before the connection is established.

如果 'cable' 能正常工作的话,我会很容易接受 :( 在开发中工作让我急于去银行,但可惜在生产中事情并不那么闪亮我恐怕:(

我的 Ruby 相当旧 - 2.1.2p95 - 我的 Rails 比较新:

# Gemfile
gem 'rails', '~> 5.1.6', '>= 5.1.6.2'
gem 'mysql2', '>= 0.4.4', '< 0.6.0'
gem 'puma', '~> 3.7'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.2'
gem 'turbolinks', '~> 5'
gem 'jbuilder', '~> 2.5'
gem 'redis', '~> 4.0'

我在 github.com/puma/puma 上添加了一个问题,但正如该社区的其他成员指出的那样,他们是 运行 几乎完全相同的设置 - 成功 - 所以他们友好地将手指指向 Rails;我主要是在想 我错过了一些愚蠢的细节:$

如果您要进行一些调试,github.com/wdiechmann/sucker 上有一个演示项目 - 但客气话,湿 手帕放在额头上,或者完全保持沉默 - 我不挑剔;)

2019 年 5 月 24 日编辑

我的 production.log 看起来一点也不“胆小” - 我的

I, [2019-05-24T07:19:01.182723 #21335]  INFO -- : [9855de1f-65b0-41d5-bdd1-726dad5a875e] Started GET "/cable" for 92.246.28.33 at 2019-05-24 07:19:01 +0200
I, [2019-05-24T07:19:01.183340 #21335]  INFO -- : [9855de1f-65b0-41d5-bdd1-726dad5a875e] Started GET "/cable/" [WebSocket] for 92.246.28.33 at 2019-05-24 07:19:01 +0200
I, [2019-05-24T07:19:01.183425 #21335]  INFO -- : [9855de1f-65b0-41d5-bdd1-726dad5a875e] Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: upgrade, HTTP_UPGRADE: websocket)
I, [2019-05-24T07:19:11.398314 #21335]  INFO -- : Finished "/cable/" [WebSocket] for 92.246.28.33 at 2019-05-24 07:19:11 +0200
I, [2019-05-24T07:19:12.545945 #21335]  INFO -- : [6d9a5967-57c7-45bf-b99e-2f3d74ba72f6] Started GET "/cable" for 92.246.28.33 at 2019-05-24 07:19:12 +0200
I, [2019-05-24T07:19:12.546559 #21335]  INFO -- : [6d9a5967-57c7-45bf-b99e-2f3d74ba72f6] Started GET "/cable/" [WebSocket] for 92.246.28.33 at 2019-05-24 07:19:12 +0200
I, [2019-05-24T07:19:12.546677 #21335]  INFO -- : [6d9a5967-57c7-45bf-b99e-2f3d74ba72f6] Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: upgrade, HTTP_UPGRADE: websocket)
I, [2019-05-24T07:19:22.914389 #21335]  INFO -- : Finished "/cable/" [WebSocket] for 92.246.28.33 at 2019-05-24 07:19:22 +0200

但我想相信我至少错过了几行 'log'(就像它在我的 development.log 中显示的那样)

Started GET "/cable" for ::1 at 2019-05-24 07:39:47 +0200
Started GET "/cable/" [WebSocket] for ::1 at 2019-05-24 07:39:47 +0200
Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
MessageChannel is transmitting the subscription confirmation
MessageChannel is streaming from message_channel

- 并且我真的希望我的 DevTools 控制台“闭嘴”- 以及实际工作的通道,显然 :$

如果您使用的是 https,请在您的 nginx 站点配置中添加以下内容:

location /cable {
  proxy_pass http://app;
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "Upgrade";
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $http_host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-Proto https;
  proxy_redirect off;
}

这已经过测试并且运行良好:-)

我几乎每隔 40 小时就叫一次 'tree in town' :)

这个问题的(简短)答案是:是!

(有点)更长的答案:要非常小心地完全控制你的硬件 and/or 虚拟机(在我的例子中,我在一个旧的 Debian 发行版上一瘸一拐地,修补了一百万次各种各样的东西,运行 将近 10 个其他应用程序每个都有他的一组 'specials'!

我的建议:第一次使用新的盒子 - 当您了解技术和复杂性并愿意冒险时,请寻找 98 年的旧 Slackware 发行版并致力于您的内心 :)

(很长的)答案:克隆 https://github.com/wdiechmann/sucker.git for some initial tyre kicking

干杯, 瓦尔特