Digitalocean triển khai ứng dụng nút https với nginx

Sep 22 2020

Tôi đang chạy ứng dụng của mình trong giọt Digitalocean bằng cách sử dụng nginx, tôi đã phát hiện ra rằng nếu tôi chạy ứng dụng của mình với http, nó hoạt động hoàn hảo, nhưng khi tôi chạy nó với https nginx cho tôi 502 BAD GATEWAY, tôi đã thử các hướng dẫn digitalocean khác và tìm kiếm xung quanh stackoverflow nhưng không bao giờ tìm thấy giải pháp vì vậy tôi nghĩ về việc tạo ra bài viết này.

TẬP TIN ĐỊNH NGHĨA 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;
        }
}

MÃ ỨNG DỤNG CỦA TÔI:

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

Tôi mới sử dụng nginx ai đó có thể giải thích cách làm điều này không?

Trả lời

3 Bharath Sep 30 2020 at 17:08

Mã ứng dụng của bạn đang chạy bằng HTTPS, trong khi NGINX là proxy_pass đang sử dụng http: // localhost: 3000.

Để khắc phục sự cố, có hai cách:

  1. Cập nhật proxy_pass bằng https: // localhost: 3000 và khởi động lại NGINX
  2. Sử dụng HTTP thay vì HTTPS ở cấp APP và khởi động lại ứng dụng

Bất kỳ tùy chọn nào cũng sẽ khắc phục được sự cố, ít nỗ lực nhất là sử dụng tùy chọn một.

2 architjn Sep 29 2020 at 09:48

Tôi có nhiều máy chủ đang chạy các ứng dụng node.js trên 80 cũng như 443 hoàn toàn tốt.

Tôi sẽ thích bạn sử dụng cấu hình tôi sử dụng-

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
}

Tôi chủ yếu sử dụng Certbot cho chứng chỉ SSL của mình, bạn có thể sử dụng bất kỳ thứ gì khác mà bạn muốn!

1 vitalyster Oct 01 2020 at 09:31

Bạn không cần thay đổi bất kỳ thứ gì trong ứng dụng và tiếp tục sử dụng HTTP, Nginx sẽ phục vụ các yêu cầu https và chuyển hướng HTTP đến ứng dụng của bạn.