title: Websocket error using Django Channels with EC2
body: <p>I'm trying to build an app in Django that uses Django Channels. I'm deploying on Elastic Beanstalk. My understanding is that the application load balancer supports websockets and I can route websocket traffic to the appropriate port. The websockets work on my localhost:8000. I'm using the free tier Redis Labs for my channel layer.</p>
  
  <p>I followed this tutorial.
  <a href="https://blog.mangoforbreakfast.com/2017/02/13/django-channels-on-aws-elastic-beanstalk-using-an-alb/#comment-43" rel="nofollow noreferrer">https://blog.mangoforbreakfast.com/2017/02/13/django-channels-on-aws-elastic-beanstalk-using-an-alb/#comment-43</a> </p>
  
  <p>Following this tutorial it appears I can get Daphne and the workers running on the correct ports. I SSHed into the EC2 instance to get the following output.</p>
  
  <pre><code>$ sudo /usr/local/bin/supervisorctl -c /opt/python/etc/supervisord.conf status
  Daphne                           RUNNING   pid 4240, uptime 0:05:51
  Worker:Worker_00                 RUNNING   pid 4242, uptime 0:05:51
  Worker:Worker_01                 RUNNING   pid 4243, uptime 0:05:51
  Worker:Worker_02                 RUNNING   pid 4244, uptime 0:05:51
  Worker:Worker_03                 RUNNING   pid 4245, uptime 0:05:51
  httpd                            RUNNING   pid 4248, uptime 0:05:51
  </code></pre>
  
  <p>My daphne.out.log and workers.out.log look fine.</p>
  
  <pre><code>$ cat daphne.out.log 
  2017-07-20 21:41:43,693 INFO     Starting server at tcp:port=5000:interface=0.0.0.0, channel layer mysite.asgi:channel_layer.
  2017-07-20 21:41:43,693 INFO     HTTP/2 support not enabled (install the http2 and tls Twisted extras)
  2017-07-20 21:41:43,694 INFO     Using busy-loop synchronous mode on channel layer
  2017-07-20 21:41:43,694 INFO     Listening on endpoint tcp:port=5000:interface=0.0.0.0
  
  $ cat workers.out.log 
  2017-07-20 21:41:44,114 - INFO - runworker - Using single-threaded worker.
  2017-07-20 21:41:44,120 - INFO - runworker - Using single-threaded worker.
  2017-07-20 21:41:44,121 - INFO - runworker - Running worker against channel layer default (asgi_redis.core.RedisChannelLayer)
  2017-07-20 21:41:44,121 - INFO - worker - Listening on channels http.request, websocket.connect, websocket.disconnect, websocket.receive
  2017-07-20 21:41:44,126 - INFO - runworker - Using single-threaded worker.
  2017-07-20 21:41:44,126 - INFO - runworker - Running worker against channel layer default (asgi_redis.core.RedisChannelLayer)
  2017-07-20 21:41:44,126 - INFO - runworker - Running worker against channel layer default (asgi_redis.core.RedisChannelLayer)
  2017-07-20 21:41:44,127 - INFO - worker - Listening on channels http.request, websocket.connect, websocket.disconnect, websocket.receive
  2017-07-20 21:41:44,127 - INFO - worker - Listening on channels http.request, websocket.connect, websocket.disconnect, websocket.receive
  2017-07-20 21:41:44,133 - INFO - runworker - Using single-threaded worker.
  2017-07-20 21:41:44,136 - INFO - runworker - Running worker against channel layer default (asgi_redis.core.RedisChannelLayer)
  2017-07-20 21:41:44,136 - INFO - worker - Listening on channels http.request, websocket.connect, websocket.disconnect, websocket.receive
  </code></pre>
  
  <p>From here I updated the security group settings and configured the load balancer and tested my webpage. Instead of /ws/ as the path for rerouting, I used /table/* because those are the pages that need websockets.</p>
  
  <p>If I use /ws/ I get this error.</p>
  
  <p><strong><em>WebSocket connection to 'ws://example.com/table/1/' failed: Error during WebSocket handshake: Unexpected response code: 404</em></strong></p>
  
  <p>If I use /table/* I get this error.</p>
  
  <p><strong><em>WebSocket connection to 'ws://example.com/table/1/' failed: Error during WebSocket handshake: Unexpected response code: 504</em></strong></p>
  
  <p>When I changed the security group settings of my load balancer to also allow TCP at port 5000, the worker log changes. With the /ws/ path rule in my load balancer, I now get this in the worker log:</p>
  
  <pre><code>...
  2017-07-20 21:41:44,136 - INFO - worker - Listening on channels http.request, websocket.connect, websocket.disconnect, websocket.receive
  Not Found: /ws/
  Not Found: /ws/
  Not Found: /ws/
  Not Found: /ws/
  Not Found: /ws/
  Not Found: /ws/
  </code></pre>
  
  <p>If I use the /table/* path, I get a very long error in my log.</p>
  
  <pre><code>2017-07-21 01:22:05,270 - ERROR - worker - Error processing message with consumer deal.consumers.ws_connect:
  Traceback (most recent call last):
    File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py", line 193, in _get_session
      return self._session_cache
  AttributeError: 'SessionStore' object has no attribute '_session_cache'
  
  During handling of the above exception, another exception occurred:
  
  Traceback (most recent call last):
    File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/db/backends/base/base.py", line 199, in ensure_connection
      self.connect()
    File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/db/backends/base/base.py", line 171, in connect
      self.connection = self.get_new_connection(conn_params)
    File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/db/backends/postgresql/base.py", line 175, in get_new_connection
      connection = Database.connect(**conn_params)
    File "/opt/python/run/venv/local/lib64/python3.4/site-packages/psycopg2/__init__.py", line 130, in connect
      conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
  psycopg2.OperationalError: could not connect to server: Connection refused
      Is the server running on host "localhost" (127.0.0.1) and accepting
      TCP/IP connections on port 5432?
  
  
  The above exception was the direct cause of the following exception:
  
  Traceback (most recent call last):
    File "/opt/python/run/venv/local/lib/python3.4/site-packages/channels/worker.py", line 119, in run
      consumer(message, **kwargs)
    File "/opt/python/run/venv/local/lib/python3.4/site-packages/channels/sessions.py", line 220, in inner
      result = func(message, *args, **kwargs)
    File "/opt/python/run/venv/local/lib/python3.4/site-packages/channels/auth.py", line 71, in inner
      message.user = auth.get_user(fake_request)
    File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/contrib/auth/__init__.py", line 167, in get_user
      user_id = _get_user_session_key(request)
    File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/contrib/auth/__init__.py", line 59, in _get_user_session_key
      return get_user_model()._meta.pk.to_python(request.session[SESSION_KEY])
    File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py", line 48, in __getitem__
      return self._session[key]
    File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py", line 198, in _get_session
      self._session_cache = self.load()
    File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/contrib/sessions/backends/db.py", line 33, in load
      expire_date__gt=timezone.now()
    File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/db/models/manager.py", line 122, in manager_method
      return getattr(self.get_queryset(), name)(*args, **kwargs)
    File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/db/models/query.py", line 381, in get
      num = len(clone)
    File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/db/models/query.py", line 240, in __len__
      self._fetch_all()
    File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/db/models/query.py", line 1074, in _fetch_all
      self._result_cache = list(self.iterator())
    File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/db/models/query.py", line 52, in __iter__
      results = compiler.execute_sql()
    File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 846, in execute_sql
      cursor = self.connection.cursor()
    File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/db/backends/base/base.py", line 231, in cursor
      cursor = self.make_debug_cursor(self._cursor())
    File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/db/backends/base/base.py", line 204, in _cursor
      self.ensure_connection()
    File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/db/backends/base/base.py", line 199, in ensure_connection
      self.connect()
    File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/db/utils.py", line 95, in __exit__
      six.reraise(dj_exc_type, dj_exc_value, traceback)
    File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/utils/six.py", line 685, in reraise
      raise value.with_traceback(tb)
    File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/db/backends/base/base.py", line 199, in ensure_connection
      self.connect()
    File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/db/backends/base/base.py", line 171, in connect
      self.connection = self.get_new_connection(conn_params)
    File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/db/backends/postgresql/base.py", line 175, in get_new_connection
      connection = Database.connect(**conn_params)
    File "/opt/python/run/venv/local/lib64/python3.4/site-packages/psycopg2/__init__.py", line 130, in connect
      conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
  django.db.utils.OperationalError: could not connect to server: Connection refused
      Is the server running on host "localhost" (127.0.0.1) and accepting
      TCP/IP connections on port 5432?
  </code></pre>
  
  <p>Unsurprisingly when I try to use the websockets I get this error:</p>
  
  <p><strong><em>WebSocket is already in CLOSING or CLOSED state.</em></strong></p>
  
  <p>Any idea what I'm doing wrong?</p>