title: Daphne on Elastic beanstalk - WebSocket handshake: Unexpected response code: 500
body: <p>Following this guide <a href="https://medium.com/@elspanishgeek/how-to-deploy-django-channels-2-x-on-aws-elastic-beanstalk-8621771d4ff0" rel="nofollow noreferrer">https://medium.com/@elspanishgeek/how-to-deploy-django-channels-2-x-on-aws-elastic-beanstalk-8621771d4ff0</a> to set up a django app that uses websockets.</p>
  <p>01_env.config</p>
  <pre><code>option_settings:  
    aws:elasticbeanstalk:application:environment:
      DJANGO_SETTINGS_MODULE: dashboard.settings
      PYTHONPATH: /opt/python/current/app/dashboard:$PYTHONPATH
    aws:elasticbeanstalk:container:python:
      WSGIPath: dashboard/wsgi.py
  
    aws:elbv2:listener:80:
      DefaultProcess: http
      ListenerEnabled: 'true'
      Protocol: HTTP
      Rules: ws
    aws:elbv2:listenerrule:ws:
      PathPatterns: /websockets/*
      Process: websocket
      Priority: 1
    aws:elasticbeanstalk:environment:process:http:
      Port: '80'
      Protocol: HTTP
    aws:elasticbeanstalk:environment:process:websocket:
      Port: '5000'
      Protocol: HTTP
  </code></pre>
  <p>02_setup.config</p>
  <pre><code>container_commands:
    00_pip_upgrade:
      command: &quot;source /opt/python/run/venv/bin/activate &amp;&amp; pip install --upgrade pip&quot;
      ignoreErrors: false
    01_migrate:
      command: &quot;django-admin.py migrate&quot;
      leader_only: true
    02_collectstatic:
      command: &quot;django-admin.py collectstatic --noinput&quot;
    03_wsgipass:
      command: 'echo &quot;WSGIPassAuthorization On&quot; &gt;&gt; ../wsgi.conf'
    04_celery_tasks:
      command: &quot;cat .ebextensions/celery_configuration.txt &gt; /opt/elasticbeanstalk/hooks/appdeploy/post/run_supervised_celeryd.sh &amp;&amp; chmod 744 /opt/elasticbeanstalk/hooks/appdeploy/post/run_supervised_celeryd.sh&quot;
      leader_only: true
    05_celery_tasks_run:
      command: &quot;/opt/elasticbeanstalk/hooks/appdeploy/post/run_supervised_celeryd.sh&quot;
      leader_only: true
  </code></pre>
  <p>03_proxy.config</p>
  <pre><code>files:
    &quot;/etc/httpd/conf.d/proxy.conf&quot;:
      mode: &quot;000644&quot;
      owner: root
      group: root
      content: |
        ProxyPass /websockets/ ws://127.0.0.1:5000/websockets/
        ProxyPassReverse /websockets/ ws://127.0.0.1:5000/websockets/
  </code></pre>
  <p>When opening the websocket I get the message on chrome's console:</p>
  <pre><code>WebSocket connection to 'ws://xx.xx.xx.elasticbeanstalk.com/websockets/' failed: Error during WebSocket handshake: Unexpected response code: 500
  </code></pre>
  <p>Logs indicate:</p>
  <pre><code>AH01144: No protocol handler was valid for the URL /websockets/ (scheme 'ws'). If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.
  </code></pre>
  <p>Loaded apache modules listed on the EC2 instance by running <code>sudo apachectl -M</code>:</p>
  <pre><code>Loaded Modules:
   core_module (static)
   so_module (static)
   http_module (static)
   access_compat_module (shared)
   actions_module (shared)
   alias_module (shared)
   allowmethods_module (shared)
   auth_basic_module (shared)
   auth_digest_module (shared)
   authn_anon_module (shared)
   authn_core_module (shared)
   authn_dbd_module (shared)
   authn_dbm_module (shared)
   authn_file_module (shared)
   authn_socache_module (shared)
   authz_core_module (shared)
   authz_dbd_module (shared)
   authz_dbm_module (shared)
   authz_groupfile_module (shared)
   authz_host_module (shared)
   authz_owner_module (shared)
   authz_user_module (shared)
   autoindex_module (shared)
   cache_module (shared)
   cache_disk_module (shared)
   cache_socache_module (shared)
   data_module (shared)
   dbd_module (shared)
   deflate_module (shared)
   dir_module (shared)
   dumpio_module (shared)
   echo_module (shared)
   env_module (shared)
   expires_module (shared)
   ext_filter_module (shared)
   filter_module (shared)
   headers_module (shared)
   http2_module (shared)
   include_module (shared)
   info_module (shared)
   log_config_module (shared)
   logio_module (shared)
   macro_module (shared)
   mime_magic_module (shared)
   mime_module (shared)
   negotiation_module (shared)
   remoteip_module (shared)
   reqtimeout_module (shared)
   request_module (shared)
   rewrite_module (shared)
   setenvif_module (shared)
   slotmem_plain_module (shared)
   slotmem_shm_module (shared)
   socache_dbm_module (shared)
   socache_memcache_module (shared)
   socache_shmcb_module (shared)
   status_module (shared)
   substitute_module (shared)
   suexec_module (shared)
   unixd_module (shared)
   userdir_module (shared)
   version_module (shared)
   vhost_alias_module (shared)
   watchdog_module (shared)
   dav_module (shared)
   dav_fs_module (shared)
   dav_lock_module (shared)
   lua_module (shared)
   mpm_prefork_module (shared)
   proxy_module (shared)
   lbmethod_bybusyness_module (shared)
   lbmethod_byrequests_module (shared)
   lbmethod_bytraffic_module (shared)
   lbmethod_heartbeat_module (shared)
   proxy_ajp_module (shared)
   proxy_balancer_module (shared)
   proxy_connect_module (shared)
   proxy_express_module (shared)
   proxy_fcgi_module (shared)
   proxy_fdpass_module (shared)
   proxy_ftp_module (shared)
   proxy_http_module (shared)
   proxy_hcheck_module (shared)
   proxy_scgi_module (shared)
   proxy_uwsgi_module (shared)
   proxy_wstunnel_module (shared)
   cgi_module (shared)
   wsgi_module (shared)
  </code></pre>
  <p>Turning on Apache's debug mode, I also get in the logs:</p>
  <pre><code>AH02900: declining URL ws://127.0.0.1:5000/websockets/  (not WebSocket, Upgrade: header is missing)
  </code></pre>
  <p>Google chrome's console shows me the following request for the websocket:</p>
  <p><a href="https://i.stack.imgur.com/SnFrT.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/SnFrT.png" alt="enter image description here" /></a></p>
  <p>Daphne is listening to 0.0.0.0:5000 and the console indicates no call whatsoever to the websocket -&gt; the problem is somewhere in the configuration of the Apache server.</p>