HASS + NGINX + LE = Error during WebSocket handshake: Unexpected response code: 301

I’ve installed HASS on a Raspberry Pi using the instructions for NGINX with subdomain on the instruction page.

My NGINX configuration is as follows:

server {
        listen 80;
        server_name sub.domain.tld;
        return 301 https://$server_name$request_uri;
        client_max_body_size 25M;

server {
        listen 443 ssl;
        server_name sub.domain.tld;

        ssl on;
        ssl_certificate /etc/letsencrypt/live/sub.domain.tld/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/sub.domain.tld/privkey.pem;
        ssl_session_cache shared:SSL:10m;
        ssl_protocols TLSv1.1 TLSv1.2;
        ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
        ssl_prefer_server_ciphers on;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;
        # add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

        proxy_buffering off;

        location / {
                proxy_set_header X-Real-IP $;
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

                # WebSocket support (nginx 1.4)
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";

        # location ^~/api/websocket/ {
        #     proxy_pass;
        # }

My HASS config is as follows:

  # Name of the location where Home Assistant is running
  name: Home
  # Location required to calculate the time the sun rises and sets
  latitude: !secret lat
  longitude: !secret long
  # Impacts weather/sunrise data (altitude above sea level in meters)
  elevation: 0
  # metric for Metric, imperial for Imperial
  unit_system: metric
  # Pick yours from here: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
  time_zone: Pacific/Auckland

# Show links to resources in log and frontend
# introduction:

# Enables the frontend

# Enables configuration UI

  # Uncomment this to add a password (recommended!)
  api_password: !secret api_pass
  # Uncomment this if you are using SSL/TLS, running in Docker container, etc.
  # base_url: sub.domain.tld

# Checks for available updates
# Note: This component will send some information about your system to
# the developers to assist with development of Home Assistant.
# For more information, please see:
# https://home-assistant.io/blog/2016/10/25/explaining-the-updater/
  # Optional, allows Home Assistant developers to focus on popular components.
  # include_used_components: true

# Discover some devices automatically

# Allows you to issue voice commands from the frontend in enabled browsers

# Enables support for tracking state changes over time

# View all events in a logbook

# Track the sun

# Weather prediction
  - platform: yr

# Text to speech
  - platform: google

group: !include groups.yaml
automation: !include automations.yaml

Everything installed properly with no problem, however once I set up the certificate after the installation, I get the following error when logging in:

WebSocket connection to 'wss://sub.domain.tld/api/websocket' failed: Error during WebSocket handshake: Unexpected response code: 301

It’s been reported as an issue on reddit as well by others. I’ve tried Firefox, Chrome and Edge, all in incognito mode, both on my network, and on a separate network using a different machine (laptop). It’s definitely not a DNS or router issue as someone tried to suggest on reddit.

Any help would be greatly appreciated with this, or if I should open an issue on github let me know.

HASS Version: 0.50.2
Python version: 3.4.2
NGINX Version: 1.6.2