Rails 5 ActionCable 和 puma 的 NGINX 配置
NGINX configuration for Rails 5 ActionCable with puma
我正在将 Jelastic 用于我的开发环境(尚未投入生产)。
我的应用程序是 运行 Unicorn,但我发现了带有 ActionCable 的 websockets 并将其集成到我的应用程序中。
在本地一切正常,但是当部署到我的 Jelastic 环境(使用默认 NGINX/Unicorn 配置)时,我在我的 javascript 控制台中收到此消息,但我在我的控制台中什么也看不到访问日志
WebSocket connection to 'ws://dev.myapp.com:8080/' failed: WebSocket is closed before the connection is established.
我曾经在我的本地环境中使用过,我通过在我的配置文件中添加所需的 ActionCable.server.config.allowed_request_origins 来解决它。所以我为此仔细检查了我的开发配置,没问题。
这就是为什么我想知道是否有特定于 NGINX 配置的内容,而不是 ActionCable git 页面
上解释的内容
bundle exec puma -p 28080 cable/config.ru
对于我的应用程序,我遵循了 enter link description here 中的所有内容,但没有提及有关 NGINX 配置的内容
我知道带有 ActionCable 的 websocket 很新,但我希望有人能够在这方面为我提供指导
非常感谢
好的,我终于设法解决了我的问题。以下是允许完成这项工作的不同步骤:
1.nginx :我真的不知道这是否需要,但由于我的应用程序是 运行 Unicorn,我将其添加到我的 nginx conf
upstream websocket {
server 127.0.0.1:28080;
}
server {
location /cable/ {
proxy_pass http://websocket/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}
然后在我的 config/environments/development.rb
文件中:
config.action_cable.url = "ws://my.app.com/cable/"
2.Allowed 请求来源:然后我注意到即使我在我的 config/environments/development.rb
文件中使用 ActionCable.server.config.allowed_request_origins
,我的连接也被拒绝了。我想知道这是否不是由于文档中所述的开发默认设置 http://localhost:3000 造成的。所以我添加了这个:
ActionCable.server.config.disable_request_forgery_protection = true
我还没有生产环境,所以我还不能测试它会怎么样。
3.Redis 密码:如文档中所述,我使用的是 config/redis/cable.yml
但出现此错误:
Error raised inside the event loop: Replies out of sync: #<RuntimeError: ERR operation not permitted>
/var/www/webroot/ROOT/public/shared/bundle/ruby/2.2.0/gems/em-hiredis-0.3.0/lib/em-hiredis/base_client.rb:130:in `block in connect'
所以我明白我为我的 redis 服务器设置密码的方式不好。
事实上你必须这样做:
development:
<<: *local
:url: redis://user:password@my.redis.com:6379
:host: my.redis.com
:port: 6379
现在一切正常,Actioncable 确实令人印象深刻。
也许我的一些问题是微不足道的,但我正在分享它们以及我是如何解决它们的,以便每个人都可以根据需要选择一些东西
我正在将 Jelastic 用于我的开发环境(尚未投入生产)。 我的应用程序是 运行 Unicorn,但我发现了带有 ActionCable 的 websockets 并将其集成到我的应用程序中。
在本地一切正常,但是当部署到我的 Jelastic 环境(使用默认 NGINX/Unicorn 配置)时,我在我的 javascript 控制台中收到此消息,但我在我的控制台中什么也看不到访问日志
WebSocket connection to 'ws://dev.myapp.com:8080/' failed: WebSocket is closed before the connection is established.
我曾经在我的本地环境中使用过,我通过在我的配置文件中添加所需的 ActionCable.server.config.allowed_request_origins 来解决它。所以我为此仔细检查了我的开发配置,没问题。
这就是为什么我想知道是否有特定于 NGINX 配置的内容,而不是 ActionCable git 页面
上解释的内容bundle exec puma -p 28080 cable/config.ru
对于我的应用程序,我遵循了 enter link description here 中的所有内容,但没有提及有关 NGINX 配置的内容
我知道带有 ActionCable 的 websocket 很新,但我希望有人能够在这方面为我提供指导
非常感谢
好的,我终于设法解决了我的问题。以下是允许完成这项工作的不同步骤:
1.nginx :我真的不知道这是否需要,但由于我的应用程序是 运行 Unicorn,我将其添加到我的 nginx conf
upstream websocket {
server 127.0.0.1:28080;
}
server {
location /cable/ {
proxy_pass http://websocket/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}
然后在我的 config/environments/development.rb
文件中:
config.action_cable.url = "ws://my.app.com/cable/"
2.Allowed 请求来源:然后我注意到即使我在我的 config/environments/development.rb
文件中使用 ActionCable.server.config.allowed_request_origins
,我的连接也被拒绝了。我想知道这是否不是由于文档中所述的开发默认设置 http://localhost:3000 造成的。所以我添加了这个:
ActionCable.server.config.disable_request_forgery_protection = true
我还没有生产环境,所以我还不能测试它会怎么样。
3.Redis 密码:如文档中所述,我使用的是 config/redis/cable.yml
但出现此错误:
Error raised inside the event loop: Replies out of sync: #<RuntimeError: ERR operation not permitted>
/var/www/webroot/ROOT/public/shared/bundle/ruby/2.2.0/gems/em-hiredis-0.3.0/lib/em-hiredis/base_client.rb:130:in `block in connect'
所以我明白我为我的 redis 服务器设置密码的方式不好。
事实上你必须这样做:
development:
<<: *local
:url: redis://user:password@my.redis.com:6379
:host: my.redis.com
:port: 6379
现在一切正常,Actioncable 确实令人印象深刻。
也许我的一些问题是微不足道的,但我正在分享它们以及我是如何解决它们的,以便每个人都可以根据需要选择一些东西