title: Rails 6 Production ActionCable Error during WebSocket handshake
body: <pre><code>WebSocket connection to 'ws://my-ec2/cable' failed: 
  Error during WebSocket handshake: Unexpected response code: 404
  </code></pre>
  <p>Guys, I saw this (old) issue a lot here, so it may seem like it is duplicated. But in my case, I try very hard to fix this error but I can't.
  I also follow this correction: <a href="https://stackoverflow.com/a/55715218/8478892">https://stackoverflow.com/a/55715218/8478892</a> but no success.</p>
  <p>My nginx.conf:</p>
  <pre><code>upstream puma {
      server unix:///home/ubuntu/apps/my_app/shared/tmp/sockets/my_app-puma.sock;
  }
  
  server {
      listen 80 default_server deferred;
  
      # If you're planning on using SSL (which you should), you can also go ahead and fill out the following server_name variable:
      # server_name example.com;
  
      # Don't forget to update these, too
      root /home/ubuntu/apps/my_app/current/public;
      access_log /var/log/nginx/nginx.access.log;
      error_log /var/log/nginx/nginx.error.log info;
  
      location ^~ /assets/ {
          gzip_static on;
          expires max;
          add_header Cache-Control public;
      }
  
      try_files $uri/index.html $uri @puma;
      location @puma {
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $http_host;
          proxy_redirect off;
  
          proxy_pass http://puma;
      }
  
      location /cable {
          proxy_pass http://puma;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection &quot;upgrade&quot;;
          proxy_set_header Host $host;
          proxy_set_header X-Forwarded-Proto $scheme;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_pass_request_headers on;
  
          proxy_buffering off;
          proxy_redirect off;
          break;
      }
  
      error_page 500 502 503 504 /500.html;
      client_max_body_size 10M;
      keepalive_timeout 10;
  }
  </code></pre>
  <p>And in my cable.yml:</p>
  <pre><code>production:
    url: redis://http://my-ec2.com:6379
  
  local: &amp;local
    url: redis://localhost:6379
  
  development: *local
  test: *local
  </code></pre>
  <p>And my environments/production.rb:</p>
  <pre><code>Rails.application.configure do
  
    config.cache_classes = true
  
    config.eager_load = true
  
    config.consider_all_requests_local       = false
  
  
    config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
  
  
  
    config.active_storage.service = :local
  
    config.action_cable.mount_path = '/cable'
    config.action_cable.url = 'ws://my-ec2/cable'
    config.action_cable.allow_same_origin_as_host = true
    config.action_cable.allowed_request_origins = [&quot;*&quot;]
  
  
    config.log_level = :debug
  
    config.log_tags = [ :request_id ]
  
  
  
    config.action_mailer.perform_caching = false
  
  
    config.i18n.fallbacks = true
  
    config.active_support.deprecation = :notify
  
    config.log_formatter = ::Logger::Formatter.new
  
  
    if ENV[&quot;RAILS_LOG_TO_STDOUT&quot;].present?
      logger           = ActiveSupport::Logger.new(STDOUT)
      logger.formatter = config.log_formatter
      config.logger    = ActiveSupport::TaggedLogging.new(logger)
    end
  
    config.active_record.dump_schema_after_migration = false
  
  end
  
  </code></pre>
  <p>Thought of the day for those who are having this problem:</p>
  <blockquote>
  <p>Setting up ActionCable en localhost had already been a good fight, but setting up in production is an entire war.</p>
  </blockquote>