Digitalocean distribuisce l'app node https con nginx
Sto eseguendo la mia applicazione in una droplet di Digitalocean usando nginx ho scoperto che se eseguo la mia app con http funziona perfettamente, ma quando la 502 BAD GATEWAYeseguo con https nginx mi dà , ho provato altre guide di digitalocean e cercato in stackoverflow e mai ho trovato la soluzione così ho pensato di fare questo post.
FILE PREDEFINITO 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;
}
}
CODICE DELLA MIA 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);
});
Sono nuovo di nginx qualcuno può spiegare come farlo?
Risposte
Il codice dell'app è in esecuzione utilizzando HTTPS, mentre NGINX è proxy_pass utilizza http: // localhost: 3000.
Per risolvere il problema ci sono due modi:
- Aggiorna proxy_pass con https: // localhost: 3000 e riavvia NGINX
- Usa HTTP invece di HTTPS a livello di APP e riavvia l'applicazione
Qualsiasi opzione risolverà il problema, il minimo sforzo sarebbe utilizzare l'opzione uno.
Ho più server che eseguono applicazioni node.js su 80 e 443 perfettamente.
Preferirò che tu usassi la configurazione che uso io-
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
}
Uso principalmente Certbot per i miei certificati SSL, puoi usare qualsiasi altra cosa tu voglia!
Non è necessario modificare nulla nell'applicazione e continuare a utilizzare HTTP, Nginx servirà le richieste https e reindirizzerà HTTP alla tua applicazione.