Aplicación https de nodo de implementación de Digitalocean con nginx
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
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:
- Actualice el proxy_pass con https: // localhost: 3000 y reinicie NGINX
- 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.
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!
No necesita cambiar nada en la aplicación y continuar usando HTTP, Nginx atenderá las solicitudes https y redireccionará HTTP a su aplicación.