代码之家  ›  专栏  ›  技术社区  ›  Kieran E

在Cloudfront后面运行ActionCable

  •  0
  • Kieran E  · 技术社区  · 6 年前

    Upgrade 运行ActionCable所需的标头。

    我们希望有一个不同的子域指向相同的服务器,但绕过Cloudfront( socket.site.com

    enter image description here

    任何与Cloudfront或ActionCable不同域相关的建议都将不胜感激。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Kieran E    6 年前

    在我写这篇文章的时候(2018年10月),似乎你根本不能在Cloudfront后面使用ActionCable。CF将丢弃升级头,这将阻止进行安全套接字连接。

    我们的设置是CF->应用程序负载平衡器(ALB)->EC2。在AWS方面,我们首先创建了一个子域( socket.example.com )它直接指向同一个ALB并完全绕过CF。请注意,经典的负载平衡器绝对不能工作。只能使用ALB。

    单凭这一点并不能解决问题。在Rails配置中,必须将以下行添加到 production.rb

    config.action_cable.url = 'wss://socket.example.com:28080/cable'
    config.action_cable.allowed_request_origins = ['https://example.com'] # Not the subdomain
    

    您可能还需要更新CSP以包括 wss://socket.example.com/cable 对于 connect_src

    如果此时您收到一条关于升级失败的消息,您需要确保NGINX配置是正确的。 This answer may help .


    你还需要在你的生活中反映出这种变化 cable.js

    (function() {
      this.App || (this.App = {})
    
      var wsUrl
      if(location.host.indexOf('localhost') != -1) {
        wsUrl = '/cable'
      } else {
        var host = location.host
        var protocol = location.protocol
        wsUrl = protocol + '//socket.' + host + '/cable'
      }
    
      App.cable = ActionCable.createConsumer(wsUrl)
    
    }).call(this)
    

    这可能是您所需要的全部,具体取决于您的身份验证方案。但是,我使用的是主应用程序和ActionCable之间共享的cookies,这导致了一个困难的bug。连接看起来是正确的,但实际上会失败,ActionCable会每隔10秒重试一次。最后一步是确保正在设置的auth cookies能够跨套接字子域工作。我更新了我的cookie:

    cookies.signed[:cookie_name] = {
      value: payload,
      domain: ['.socket.example.com', '.example.com']
      # Some people have to specify tld_length, but I was fine without it
    }