谷歌应用引擎 + Ruby on Rails + Redis + ActionCable

3

我们应该如何在Rails中配置Action Cable以在Google App Engine上运行?

我有一个Rails应用程序,它使用Action Cable作为其信使。在我的本地主机上,Action Cable在开发和生产环境下都可以正常工作,但在Google App Engine上无法正常工作

  • 我创建了一个计算机引擎实例并在其中安装了Redis。

  • 防火墙允许所有流量到达Redis VM。

  • Redis绑定了0.0.0.0。

当我在Google App Engine上部署应用程序时,我会收到以下错误:

Firefox无法建立与wss://mydomain.com/cable的连接。

这是我的当前配置:

config/environments/production.rb

config.action_cable.url = 'wss://[MYDOMAIN].com/cable'
config.action_cable.disable_request_forgery_protection = true
config.force_ssl = true
... 

config/cable.yml

production:
  adapter: redis
  url: redis://[IP_OF_REDIS_SERVER]:6379/

app.yaml

entrypoint: bundle exec rackup --port $PORT
env: flex
runtime: ruby
env_variables:
  REDIS_PROVIDER: REDIS_URL
  REDIS_URL: redis://[IP_OF_REDIS_SERVER]:6379/
  SECRET_KEY_BASE: [My_Secret_Key]

我在谷歌文件的App Engine文档中没有找到有关actioncable设置的任何信息。我希望这个问题可以帮助我和所有遇到同样问题的人。


你解决了吗?我这里也遇到了同样的问题。每当我在生产模式下本地运行时,我可以连接到redis实例。但是当我检查生产日志时,我会看到错误“(Redis :: TimeoutError) (Redis :: CannotConnectError)”。我认为这可能与防火墙相关的错误,我在redis实例上有一个允许使用端口6379的规则,但是我在应用程序实例上没有这个规则。 - Karl
1
我最终选择了Compute Engine,我在那里创建了Redis服务器和生产服务器。如果您在计算引擎上完成这些工作,事情会变得简单得多。在应用引擎中,您无法访问任何内容,也没有文档可供参考。在计算引擎上,仅花了1个小时创建Redis服务器,另外1个小时创建生产服务器。 - Navid Farjad
1个回答

2
你需要在Redis实例和App Engine实例之间创建VPC。具体文档请参考:https://cloud.google.com/appengine/docs/standard/python/connecting-vpc
完成后,你将拥有: app.yaml
...
vpc_access_connector:
  name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR_NAME
...

其次,Google托管的Redis服务器不允许您设置客户端ID。我尝试将其强制设置为nil,但ActionCable订阅适配器会尝试为您设置一个客户端ID:https://github.com/rails/rails/blob/6-0-stable/actioncable/lib/action_cable/subscription_adapter/redis.rb#L18。为了使其正常工作,我不得不覆盖此行为。我在我的Rails应用程序中添加了以下文件:config/initializers/decorators/redis.rb
require 'action_cable/subscription_adapter/redis'

ActionCable::SubscriptionAdapter::Redis.class_eval do
  cattr_accessor :redis_connector, default: ->(config) do
    ::Redis.new(config.except(:id, :adapter, :channel_prefix))
  end
end

现在一切都运行良好。我唯一的担忧是客户端ID似乎是必需的,我可能会因此遇到一些恶心的错误。如果您尝试它,希望这对您有用!"最初的回答"

1
谢谢。我希望你的答案能够帮助那些遇到同样问题但使用App Engine并且遇到许多问题使部署变得更加困难的人们。我无法想象在生产环境中使用App Engine。 - Navid Farjad
2
当您在任何平台上部署时,都可能会遇到问题。Redis问题实际上是与Google Cloud Managed Redis有关,而不是App Engine。我不确定为什么他们做出了这个选择,但这就是解决问题的方法。我认为VPC问题并不是App Engine工作方式的问题。他们有意将服务分段,并且作为部署者,您必须选择将该服务公开给App Engine。 - j05h

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接