Nginx Proxy Pass на SSL не учитывает URL-адрес прослушивания

В настоящее время я пытаюсь настроить блоки виртуального сервера nginx, из-за чего я полностью рвал себе волосы.

По сути, у меня есть экземпляр NodeJS, работающий на капле в DigitalOcean. Цель этого приложения - разместить как веб-сайт, так и api. Я хочу, чтобы оба они работали в одной и той же капле.

Я настроил свое приложение NodeJS с помощью express для создания маршрутизации и т. д., А затем создал http-сервер с помощью приложения express. Поскольку мое объяснение может вызвать путаницу, я включил основные моменты кода ниже:

const API_PORT = 8080;
const WEB_PORT = 8081;

const api = express();
const web = express();

web.use(express.static(path.join(__dirname, '../build')));

web.get('//', (req, res) => {
    res.sendFile(path.join(__dirname, '../build', 'index.html'));
})

api.use((req, res, next) => {
    const ip = (req. headers['x-forwarded-for'] || '').split(',').pop()
    || req.connection.remoteAddress
    || req.socket.remoteAddress
    || req.connection.socket.remoteAddress

    if (req.headers.auth !== AUTHCODE) {
        httpError(400, 'Validation failed');
        console.warn('Bad Auth Code');
        console.warn(req.headers.auth);
        console.warn(ip);
        return (res.json('Validation failed'));
    }

    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Methods', '*');
    res.setHeader('Access-Control-Allow-Headers', '*');
    next();
});

Graph.route(api);

const apiServer = http.createServer(api);
const webServer = http.createServer(web);

apiServer.listen(WEB_PORT, '127.0.0.1', () => {
    console.info(`API Server is running on port ${API_PORT}`);
});
webServer.listen(API_PORT, '127.0.0.1', () => {
    console.info(`WEB Server is running on port ${WEB_PORT}`);
});

То, что я хочу достичь, показано в приведенном выше коде, но, по сути, я пытаюсь заставить мой сервер api прослушивать порт 8080, а сервер моего веб-сайта прослушивать порт 8081.

Мне сказали, что я могу использовать nginx для создания proxy_pass для этого, хотя мне не удалось заставить его работать должным образом. Ниже вы видите два примера того, что я пытался сделать! Любой, кто сможет мне помочь, навсегда станет моим героем!

server {
       listen lace.guide:443 ssl;
       server_name lace.guide www.lace.guide;
       ssl_certificate /var/my-server/ssl/myapp.crt;
       ssl_certificate_key /var/my-server/ssl/myapp.key;
       ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
       location / {
                proxy_pass http://127.0.0.1:8080/$request_uri;
                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;
        }
}

server {
       listen api.lace.guide:443 ssl default_server;
       server_name api.lace.guide www.api.lace.guide;
       ssl_certificate /var/my-server/ssl/myapp.crt;
       ssl_certificate_key /var/my-server/ssl/myapp.key;
       ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
       location / {
                proxy_pass http://127.0.0.1:8081/$request_uri;
                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;
        }
}

У меня также есть еще одна довольно странная ошибка, которая означает, что если я получаю доступ к своему api.lace.url/something/somethingElse, он фактически попадает в //something/somethingElse на моем сервере (console.info из req.url)

Nginx Proxy Pass на SSL не учитывает URL-адрес прослушивания

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
20
1

Ответы 1

Вот пример того, как сервер и клиент живут на одном сервере и управляются с помощью nginx (настройка ssl для простоты опущена). Все запросы с префиксом /api направляются на сервер, а остальные - клиенту.

upstream client {
    server client:3000;
}

upstream api {
    server api:5000;
}

server {
    listen 80;

    location / {
        proxy_pass http://client;
    }

    location /api {
        proxy_set_header X-Forwarded-For $remote_addr;
        rewrite /api/(.*) /$1 break;
        proxy_pass http://api;
    }    
}

Другие вопросы по теме