nginx로 Node https 앱을 배포하는 Digitalocean

Sep 22 2020

nginx를 사용하여 Digitalocean 드롭 릿에서 응용 프로그램을 실행하고 있습니다. http로 앱을 실행하면 완벽하게 작동하지만 https nginx로 실행하면 502 BAD GATEWAY다른 디지털 오션 가이드를 시도하고 stackoverflow를 검색 한 적이 없음을 알게되었습니다. 해결책을 찾았 으므로이 게시물을 만드는 것에 대해 생각했습니다.

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

내 앱 코드 :

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

나는 nginx를 처음 사용하는 사람이 이것을 수행하는 방법을 설명 할 수 있습니까?

답변

3 Bharath Sep 30 2020 at 17:08

앱 코드는 HTTPS를 사용하여 실행되고 NGINX는 proxy_pass는 http : // localhost : 3000을 사용합니다.

문제를 해결하려면 두 가지 방법이 있습니다.

  1. https : // localhost : 3000으로 proxy_pass를 업데이트하고 NGINX를 다시 시작합니다.
  2. APP 레벨에서 HTTPS 대신 HTTP를 사용하고 애플리케이션을 다시 시작하십시오.

모든 옵션이 문제를 해결하고 최소한의 노력은 옵션 1을 사용하는 것입니다.

2 architjn Sep 29 2020 at 09:48

80 및 443에서 node.js 응용 프로그램을 실행하는 여러 서버가 완벽하게 작동합니다.

내가 사용하는 구성을 사용하는 것이 좋습니다.

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
}

나는 주로 SSL 인증서에 Certbot을 사용하여 원하는 다른 것을 사용할 수 있습니다!

1 vitalyster Oct 01 2020 at 09:31

애플리케이션에서 아무것도 변경하지 않고 HTTP를 계속 사용할 필요가 없습니다. Nginx는 https 요청을 처리하고 HTTP를 애플리케이션으로 리디렉션합니다.