Aplicativo https do nó de implantação da Digitalocean com nginx

Sep 22 2020

Estou executando meu aplicativo em um droplet Digitalocean usando nginx, descobri que, se executar meu aplicativo com http, ele funciona perfeitamente, mas quando o executo com https nginx me dá 502 BAD GATEWAY, tentei outros guias digitalocean e pesquisei stackoverflow e nunca encontrei a solução então pensei em fazer este post.

ARQUIVO PADRÃO 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;
        }
}

MEU CÓDIGO DO APP:

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

Eu sou novo no nginx, alguém pode me explicar como fazer isso?

Respostas

3 Bharath Sep 30 2020 at 17:08

Seu código de aplicativo está sendo executado usando HTTPS, enquanto NGINX é proxy_pass está usando http: // localhost: 3000.

Para corrigir o problema, existem duas maneiras:

  1. Atualize o proxy_pass com https: // localhost: 3000 e reinicie o NGINX
  2. Use HTTP em vez de HTTPS no nível do APP e reinicie o aplicativo

Qualquer opção resolverá o problema, o mínimo esforço seria usar a opção um.

2 architjn Sep 29 2020 at 09:48

Eu tenho vários servidores executando aplicativos node.js em 80 e 443 perfeitamente bem.

Vou preferir que você use a configuração que 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
}

Eu uso principalmente o Certbot para meus certificados SSL, você pode usar o que quiser!

1 vitalyster Oct 01 2020 at 09:31

Você não precisa alterar nada no aplicativo e continuar usando HTTP, o Nginx atenderá as solicitações https e redirecionará o HTTP para o seu aplicativo.