502 Bad Gateway для NodeJS сервера, управляемого PM2, внутри контейнера lx c - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть цифровая океаническая капля, работающая под управлением Ubuntu 18.04, а внутри находится контейнер lx c. У меня есть два приложения в этом контейнере.

Первое приложение (клиент) находится на /var/www/html, а второе - NodeJS приложение на /var/www/my-site/. Приложение Node внутри контейнера управляется pm2, и до сих пор все работает нормально, потому что, когда я набираю curl http://localhost:3000 на терминале контейнера, я получаю желаемый результат.

Внутри основной капли ( не контейнер) под /etc/nginx/sites-available, у меня есть следующие два серверных блока - default и my-site.

Первое приложение работает нормально, когда я пытаюсь получить к нему доступ через браузер через мой домен, но NodeJS приложение возвращает 502 Bad Gateway, когда я пытаюсь получить к нему доступ через sub.mydomain.com. pm2 start внутри контейнера говорит мне, что статус приложения узла - online.

Вот мой default файл блока сервера. Это работает. Когда я захожу на mydomain.com, мой сайт отображается нормально.

# HTTP — redirect all traffic to HTTPS
server {
    listen 80;
    listen [::]:80 default_server ipv6only=on;
    return 301 https://$host$request_uri;
}

server {
    # Enable HTTP/2
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name mydomain.com;
    # Use the Let’s Encrypt certificates
    ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;
    # Include the SSL configuration from cipherli.st
    include snippets/ssl-params.conf;

    root /var/www/html;

    index index.html index.htm index.nginx-debian.html;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://container_ip_address /;
    }
}

Теперь вот другой блок сервера - my-site.

# Upstream config
upstream site_upstream {
    server 127.0.0.1:3000;
    keepalive 64;
}

server {
    # Enable HTTP/2
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name sub.mydomain.com www.sub.mydomain.com;
    root /var/www/my-site;

    # Use the Let’s Encrypt certificates
    ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;
    # Include the SSL configuration from cipherli.st
    include snippets/ssl-params.conf;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass http://site_upstream;
        proxy_ssl_session_reuse off;
        proxy_set_header Host $http_host;
        proxy_cache_bypass $http_upgrade;
        proxy_redirect off;
    }
}

Я установил запись A для мой поддомен в настройках DNS моего домена, на IP-адрес моей дроплеты, и я также создал символическую c ссылку на /etc/nginx/sites-enabled для my-site блока сервера.

Я искал inte rnet для решения этой проблемы, но, похоже, ничего не работает. Чего мне не хватает?

Ваша помощь будет принята с благодарностью. Спасибо.

1 Ответ

0 голосов
/ 08 февраля 2020

Проблема заключалась в том, что запросы к поддомену не направлялись в контейнер lx c. Я решил эту проблему, добавив следующее в серверный блок my-site.

location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://container_ip/;
    }

После этого я добавил звездочку к следующему блоку местоположения.

location /* {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass http://site_upstream;
        proxy_ssl_session_reuse off;
        proxy_set_header Host $http_host;
        proxy_cache_bypass $http_upgrade;
        proxy_redirect off;
    }

Другой способ обойти Эта проблема была связана с включением субдомена в директиву server_name для блока сервера по умолчанию. Это работало, но единственная проблема состояла в том, что nginx жаловался бы на то, что ему пришлось игнорировать сервер, который я настроил в my-site блоке сервера, когда вы запускали nginx -t, в противном случае он работал просто отлично.

...