title: ActionCable - Failed to upgrade to WebSocket in production
body: <p>ActionCable doesn't work in production. Works well in development, but not in production.</p>
  
  <p>Running Nginx with Puma on Ubuntu 14.04. I have checked that redis-server is up and running.</p>
  
  <p>Rails -v 5.0.0.1</p>
  
  <p><code>production.log</code>:</p>
  
  <pre><code>INFO -- : Started GET "/cable/"[non-WebSocket] for 178.213.184.193 at 2016-11-25 14:55:39 +0100
  ERROR -- : Failed to upgrade to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: close, HTTP_UPGRADE: )
  INFO -- : Finished "/cable/"[non-WebSocket] for 178.213.184.193 at 2016-11-25 14:55:39 +0100
  </code></pre>
  
  <p>Request from client:</p>
  
  <pre><code>GET ws://mityakoval.com/cable HTTP/1.1
  Host: mityakoval.com
  Connection: Upgrade
  Pragma: no-cache
  Cache-Control: no-cache
  Upgrade: websocket
  Origin: http://mityakoval.com
  Sec-WebSocket-Version: 13
  User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36
  Accept-Encoding: gzip, deflate, sdch
  Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4,uk;q=0.2,nb;q=0.2
  Cookie: _vaktdagboka_session=******
  Sec-WebSocket-Key: *******
  Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
  Sec-WebSocket-Protocol: actioncable-v1-json, actioncable-unsupported
  </code></pre>
  
  <p>Response: </p>
  
  <pre><code>HTTP/1.1 404 Not Found
  Server: nginx/1.4.6 (Ubuntu)
  Date: Fri, 25 Nov 2016 13:52:21 GMT
  Content-Type: text/plain
  Transfer-Encoding: chunked
  Connection: keep-alive
  Cache-Control: no-cache
  X-Request-Id: d6374238-69ef-476e-8fc5-e2f8bbb663de
  X-Runtime: 0.002500
  </code></pre>
  
  <p><code>nginx.conf</code>:</p>
  
  <pre><code>upstream puma {
    server unix:///home/mityakoval/apps/vaktdagboka/shared/tmp/sockets/vaktdagboka-puma.sock;
  }
  
  server {
    listen 80 default_server deferred;
    # server_name example.com;
  
    root /home/mityakoval/apps/vaktdagboka/current/public;
    access_log /home/mityakoval/apps/vaktdagboka/current/log/nginx.access.log;
    error_log /home/mityakoval/apps/vaktdagboka/current/log/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 X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "Upgrade";
    }
  
    error_page 500 502 503 504 /500.html;
    client_max_body_size 10M;
    keepalive_timeout 10;
  }
  </code></pre>
  
  <p><code>cable.yml</code>:</p>
  
  <pre><code>redis: &amp;redis
    adapter: redis
    url: redis://127.0.0.1:6379
  
  production: *redis
  
  development:
    adapter: async
  
  test:
    adapter: async
  </code></pre>
  
  <p>in <code>production.rb</code>:</p>
  
  <pre><code>config.action_cable.allowed_request_origins = ["http://mityakoval.com"]
  </code></pre>
  
  <p>in <code>routes.rb</code>:</p>
  
  <pre><code>mount ActionCable.server, at: '/cable'
  </code></pre>
  
  <p><strong>UPDATE:</strong></p>
  
  <p>Don't forget to restart nginx :) That was the problem for me.</p>