title: NodeJS Express with SSL not working with Nginx reverse proxy
body: <p>While I am setting up a NodeJS app on Ubuntu 16.04, I have faced some strange behaviour. App is only works with http dependency but not with https dependency.</p>
  
  <p>My NodeJS app is running on port 8081 and I'm using Nginx reverse proxy with SSL to redirect calls to the 8081 port. Following is my <code>default.conf</code> file in Nginx <code>site-enabled</code> directory. </p>
  
  <pre><code># HTTP - redirect all requests to HTTPS:
  server {
          listen 80;
          listen [::]:80 default_server ipv6only=on;
          return 301 https://$host$request_uri;
  }
  
  # HTTPS - proxy requests on to local Node.js app:
  server {
          listen 443;
          server_name test.com;
  
          ssl on;
          # Use certificate and key provided by Let's Encrypt:
          ssl_certificate /etc/letsencrypt/live/test.com/fullchain.pem;
          ssl_certificate_key /etc/letsencrypt/live/test.com/privkey.pem;
          ssl_session_timeout 5m;
          ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
          ssl_prefer_server_ciphers on;
          ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
  
          # Pass requests for / to localhost:8081:
          location / {
                  proxy_set_header X-Real-IP $remote_addr;
                  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                  proxy_set_header X-NginX-Proxy true;
                  proxy_pass http://localhost:8081/;
                  proxy_ssl_session_reuse off;
                  proxy_set_header Host $http_host;
                  proxy_cache_bypass $http_upgrade;
                  proxy_redirect off;
          }
  }
  </code></pre>
  
  <p>Following is the test script I'm running on Node server.</p>
  
  <pre><code>var https = require('https');
  https.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Welcome to Test App');
  }).listen(8081, 'localhost');
  console.log('Server running at http://localhost:8081/');
  </code></pre>
  
  <p>I'm getting <code>502 Bad Gateway</code> when I test site using <code>test.com</code>.
  But strangely when I change the <code>https</code> dependency to http everything works like a charm.</p>
  
  <p>What might be the issue for the strange behaviour? Can't we use https with SSL setup with Nginx? 
  Since I'm looking to use trusted peer connection it's necessary to use https with NodeJS as well.</p>