Aplicación https de nodo de implementación de Digitalocean con nginx

Sep 22 2020

Estoy ejecutando mi aplicación en una gota de Digitalocean usando nginx.Descubrí que si ejecuto mi aplicación con http funciona perfectamente, pero cuando la ejecuto con https me da nginx 502 BAD GATEWAY, he probado otras guías de digitalocean y he buscado en stackoverflow y nunca Encontré la solución, así que pensé en hacer esta publicación.

ARCHIVO PREDETERMINADO DE 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;
        }
}

MI CÓDIGO DE APLICACIÓN:

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);
});

Soy nuevo en nginx, ¿alguien puede explicar cómo se hace esto?

Respuestas

3 Bharath Sep 30 2020 at 17:08

Su código de aplicación se ejecuta mediante HTTPS, mientras que NGINX es proxy_pass y utiliza http: // localhost: 3000.

Para solucionar el problema, hay dos formas:

  1. Actualice el proxy_pass con https: // localhost: 3000 y reinicie NGINX
  2. Use HTTP en lugar de HTTPS en el nivel de la APLICACIÓN y reinicie la aplicación

Cualquier opción solucionará el problema, el menor esfuerzo sería usar la opción uno.

2 architjn Sep 29 2020 at 09:48

Tengo varios servidores que ejecutan aplicaciones node.js en 80 y 443 perfectamente bien.

Preferiré que uses la configuración que yo uso-

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
}

Utilizo principalmente Certbot para mis certificados SSL, ¡puedes usar cualquier otra cosa que quieras!

1 vitalyster Oct 01 2020 at 09:31

No necesita cambiar nada en la aplicación y continuar usando HTTP, Nginx atenderá las solicitudes https y redireccionará HTTP a su aplicación.