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.
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 default.conf file in Nginx site-enabled directory.
# 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;
}
}
Following is the test script I'm running on Node server.
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/');
I'm getting 502 Bad Gateway when I test site using test.com.
But strangely when I change the https dependency to http everything works like a charm.
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.
/var/log/nginx) reveal anything? Also, if you don't use any forwarding, can you access the nginx default homepage without any issue?https://localhost:8081/(despite not configuring security keys on the node server for your test) but forwarding to non-https URL athttp://localhost:8081/proxy_passstillhttp://localhost:8081/;? Do you still get the same error if you set it tohttps://localhost:8081/;? 2.) Can you see what error Node itself throws? You can assign the result ofhttp.createServerto a variable and listen for error: e.g.,var server = http.createServer(function ...thenserver.on('error', function (e) { console.log(e); });https://localhost:8081/and it's working. I have tried this before but didn't work. It's working now. Please add as an answer to accept it.