Задать вопрос
@Sviaznoi

Как сконфигурировать Nginx для https сервера?

Здравствуйте. Я фронтендер но решил попробовать написать свой простенький сервер на Node.js. В принципе мне это удалось но при настройке боевого сервера ( вот по этой инструкции: "https://codelab.pro/podrobnyj-gajd-po-deployu-node..." ) дело дошло до файла конфигурации Nginx. Сам пример описанный в данном выше гайде настроен для http сервера, а я написал сразу для https. Пытался разобраться самостоятельно, но мои настройки не работают. Вот они:
spoiler
server{
    listen 80;
    server_name bubble.rur;
    return 301 https://$host$request_uri;
}
server {
    lsten 443 ssl;
    server_name bubble.rur;
    ssl_certificate root/www/bubble-full-stack/server.cert;
    ssl_certificate_key root/www/bubble-full-stack/server.key;
    
    location / {
        proxy_pass https://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_csche_bupass $http_upgrade;
    }
}

Ниже будет код моего сервера. Писал впервые на Node.js. Просьба по критиковать как следует но по делу. Про заголовки знаю:

spoiler
const https = require('https');
const express = require('express');
const bodyParser = require('body-parser');
const path = require('path');
const fs = require('fs').promises;
const fsSync = require('fs');
const cheerio = require('cheerio');
const app = express();
const port = 3000;

let base = 'main_d.css',
    main_arr = [`<li class="out main_content">Главная страница</li>`],
    main_cont = [] ;


async function readContentDirectory() {
    try {
        const dirPath = path.join(__dirname, 'content');
        await fs.access(dirPath); 
        const files = await fs.readdir(dirPath);
        for (const elem of files) {
            const filePath = path.join(dirPath, elem);
            const stats = await fs.stat(filePath);
            if (stats.isDirectory()) {
                continue;
            }
            const fileContent = await fs.readFile(filePath, 'utf-8');
            const $ = cheerio.load(fileContent);
            const zag = $("h1").text();
            const img = $("img.main").attr("src");
            main_arr.push(`<li class="out" data-name="${elem}">${zag}</li>`);
            main_cont.push(
                `<div class="tile" data-name="${elem}" style="background: url('${img}') center center no-repeat black; background-size: cover;"><span class="zag">${zag}</span></div>`
            );
        }
        main_arr.push(`<li class="out relax ">Релакс</li>`);
    } catch (error) {
        console.error(`Ошибка: ${error.message}`);
    }
}

readContentDirectory();

app.use((req, res, next) => {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
    res.header("Access-Control-Allow-Headers", "Content-Type");
    res.header("Access-Control-Allow-Credentials", "true");
    next();
});

app.options('*', (req, res) => {
    res.sendStatus(200);
});

app.use(express.static(__dirname));
app.use('/scripts', express.static(path.join(__dirname, 'scripts'), {
    setHeaders: (res, path) => {
        if (path.endsWith('.js')) {
            res.setHeader('Content-Type', 'application/javascript; charset=UTF-8');
        }
    }
}));
app.use(express.urlencoded({ extended: false }));
app.use(express.json());
app.use('/css', express.static(path.join(__dirname, 'css')));

app.get("/relax", (req, res) => {
    res.setHeader('Content-Type', 'text/html');
    res.sendFile(path.join(__dirname, 'scout.html'));
})

app.get("/content/:filename", (req, res) => {    
    if(req.params.filename){
        res.setHeader('Content-Type', 'text/html');
        res.sendFile(path.join(__dirname, 'scout.html'));
    }
})

app.get("/", (req, res) => {    
    if (req.query.menu) {
        res.setHeader('Content-Type', 'application/json');
        res.json(main_arr);
    } else if(req.query.main) {
        res.setHeader('Content-Type', 'application/json');
        res.json(main_cont);
    } else {
        res.setHeader('Content-Type', 'text/html');
        res.sendFile(path.join(__dirname, 'scout.html'));
    }
});

app.get("/favicon.ico", (req, res) => {
    const iconPath = path.join(__dirname, 'icons8-bubbles-100.ico');
    fs.readFile(iconPath, (err, data) => {
        if(err) {
            res.status(404).end();
            return;
        }
        res.setHeader('Content-Type', 'image/x-icon');
        res.send(data);
    })
});

let choiceHtml = (req) =>{
    switch (req.body.os) {
        case "pc":
            base = 'desctop/index.html';
            break;
        case "mobile":
            base = 'mobile/index.html';
            break;
    }
}

app.post('/relax', (req, res) => {
    choiceHtml(req);
    res.sendFile(path.join(__dirname, 'css', base));
});

app.post('/content/:filname', (req, res) => {
    choiceHtml(req);
    res.sendFile(path.join(__dirname, 'css', base));
});

app.post('/' , (req, res) => {
    choiceHtml(req);
    res.sendFile(path.join(__dirname, 'css', base));
});

app.post('/content', (req, res) =>{
    res.setHeader('Content-Type', 'text/html');
    res.sendFile(path.join(__dirname, 'content', req.body.name));
});

const options = {
    key: fsSync.readFileSync('server.key'), 
    cert: fsSync.readFileSync('server.cert'),
};

https.createServer(options, app).listen(port, function () {
    console.log(`Сервер запущен на порту ${port}`);
});


Именно для этого кода я не могу написать конфигурацию Nginx. Если можно помогите мне его настроить и подкинте почитать что нибудь по теме толковое. Заранее благодарен.
  • Вопрос задан
  • 277 просмотров
Подписаться 2 Простой 2 комментария
Решения вопроса 1
@99insania99
В чем смысл делать использовать https в скрипте, а потом перед ним ставить прокси https nginx'ом? Получается шифруем, дешифруем, шифруем, дешифруем... nginx https -> http node.js
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
VoidVolker
@VoidVolker
Dark side eye. А у нас печеньки! А у вас?
proxy_pass https://localhost:3000;

Обратите внимание на протокол. Какой у вас протокол в вашем веб-сервере на ноде? А какой протокол в инструкции указан? Рекомендую детально и тщательно изучить что такое веб-сервер, как он работает, какие протоколы бывают, зачем они нужны и прочее из той же области.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы