Application https de nœud de déploiement Digitalocean avec nginx

Sep 22 2020

J'exécute mon application dans une gouttelette Digitalocean en utilisant nginx, j'ai découvert que si j'exécute mon application avec http, cela fonctionne parfaitement, mais lorsque je l'exécute avec https que nginx me donne 502 BAD GATEWAY, j'ai essayé d'autres guides digitalocean et cherché autour de stackoverflow et jamais trouvé la solution alors j'ai pensé à faire ce post.

FICHIER PAR DÉFAUT NGINX:

server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        server_name mydomain.io www.mydomain.io;

        ssl_certificate /home/myapp/ssl/myapp.crt;
        ssl_certificate_key /home/myapp/ssl/myapp.key;

        location / {
                proxy_pass http://localhost:3000;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host;
                proxy_cache_bypass $http_upgrade;
        }
}

MON CODE D'APPLICATION:

const express = require("express");
//const http = require('http');
const https = require('https');
const helmet = require("helmet");
const cors = require("cors");
const fs = require("fs");
const path = require("path");
const app = express();
const config = require("./config");
const passport = require("passport");
const credentials = { key: fs.readFileSync('ssl/myapp.key', 'utf-8'), cert: fs.readFileSync('ssl/myapp.crt', 'utf-8'), ca: fs.readFileSync('ssl/myapp.ca-bundle', 'utf-8') };

app.use(helmet());
app.use(cors());
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(
  require("express-session")({
    secret: require("./config.json").app.secretKey,
    resave: false,
    saveUninitialized: true,
    cookie: {
      secure: false,
      maxAge: 60 * 60 * 1000 * 24 * 365,
    },
  })
);

app.use(passport.initialize());
app.use(passport.session());
passport.use(require("./service/passport"));

app.set("view engine", "ejs");
app.set("views", path.join(__dirname, "views"));
app.use(express.static(path.join(__dirname, "views")));

app.use('/', require('./api/home'));
app.use("/auth", require("./api/auth"));
app.use("/user", require("./api/user"));

app.get('/tos',(req,res)=>{
  res.render('tos');
});


//var httpServer = http.createServer(app);
var httpsServer = https.createServer(credentials, app);

httpsServer.listen(config.app.port,'localhost',()=>{
        console.log("App started on port:"+config.app.port);
});

Je suis nouveau sur nginx, quelqu'un peut-il m'expliquer comment faire cela?

Réponses

3 Bharath Sep 30 2020 at 17:08

Votre code d'application s'exécute en HTTPS, tandis que NGINX est proxy_pass utilise http: // localhost: 3000.

Pour résoudre le problème, il existe deux façons:

  1. Mettez à jour le proxy_pass avec https: // localhost: 3000 et redémarrez NGINX
  2. Use HTTP instead of HTTPS at the APP level and restart the application

Any option will fix the issue, least effort would be using option one.

2 architjn Sep 29 2020 at 09:48

I have multiple servers running node.js applications on 80 as well as 443 perfectly fine.

I will prefer you to use the configuration I use-

server {
    server_name yourdomain.com;
    proxy_buffering off;
    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade; proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host; proxy_cache_bypass $http_upgrade;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    if ($host = yourdomain.com) { return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 0.0.0.0:80;
    server_name yourdomain.com;
    return 404; # managed by Certbot
}

I mainly use Certbot for my SSL certificates you can use anything else you want!

1 vitalyster Oct 01 2020 at 09:31

You no need to change anything in the application and continue using HTTP, Nginx will serve https requests and redirect HTTP to your application.