Digitalocean menerapkan aplikasi https node dengan nginx

Sep 22 2020

Saya menjalankan aplikasi saya dalam tetesan Digitalocean menggunakan nginx, saya telah menemukan bahwa jika saya menjalankan aplikasi saya dengan http, itu berfungsi dengan sempurna, tetapi ketika saya menjalankannya dengan https nginx memberi saya 502 BAD GATEWAY, saya telah mencoba panduan digitalocean lainnya dan mencari di sekitar stackoverflow dan tidak pernah menemukan solusinya jadi saya berpikir untuk membuat posting ini.

FILE DEFAULT 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;
        }
}

KODE APLIKASI SAYA:

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

Saya baru mengenal nginx, bisakah seseorang menjelaskan cara melakukan ini?

Jawaban

3 Bharath Sep 30 2020 at 17:08

Kode Aplikasi Anda berjalan menggunakan HTTPS, sedangkan NGINX adalah proxy_pass menggunakan http: // localhost: 3000.

Untuk memperbaiki masalah ini ada dua cara:

  1. Perbarui proxy_pass dengan https: // localhost: 3000 dan mulai ulang NGINX
  2. Gunakan HTTP sebagai ganti HTTPS di level APP dan mulai ulang aplikasi

Opsi apa pun akan memperbaiki masalah, paling tidak upaya akan menggunakan opsi satu.

2 architjn Sep 29 2020 at 09:48

Saya memiliki beberapa server yang menjalankan aplikasi node.js pada 80 serta 443 dengan baik.

Saya lebih suka Anda menggunakan konfigurasi yang saya gunakan-

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
}

Saya terutama menggunakan Certbot untuk sertifikat SSL saya, Anda dapat menggunakan apa pun yang Anda inginkan!

1 vitalyster Oct 01 2020 at 09:31

Anda tidak perlu mengubah apa pun di aplikasi dan terus menggunakan HTTP, Nginx akan melayani permintaan https dan mengarahkan HTTP ke aplikasi Anda.