Рейтинг:0

Хост недоступен при подключении к восходящему потоку из контейнера Node Docker

флаг in

У меня есть API в backend.mysite.local и я могу получить к нему доступ прямо из браузера. Но когда я пытаюсь вызвать API из контейнера Node, я получаю 502 Bad Gateway со следующей ошибкой:

connect() не удалось (113: хост недоступен) при подключении к вверх по течению, клиент: 172.20.0.1, сервер: www.mysite.local, запрос: "ПОЛУЧИТЬ /api/items HTTP/1.1", вверх по течению: "http://172.20.0.3:3000/api/items", хост: "www.mysite.local"

Это моя конфигурация nginx (я новичок в nginx, поэтому я мог бы сделать это короче, но в основном это блоки для перенаправления с порта 80 на порт 443, поэтому был бы признателен, если бы вы также просмотрели его)

сервер {
    слушать 443 ssl;
    имя_сервера backend.mysite.local;
    ssl_certificate /etc/ssl/mysite.local.crt;
    ssl_certificate_key /etc/ssl/mysite.local.key;
    
    индекс index.php index.html;
    имя_сервера backend.mysite.local;
    журнал_ошибок /var/log/nginx/error.log;
    журнал_доступа /var/log/nginx/access.log;
    корень /var/www/html/public;
    
    место расположения / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    
    расположение ~ \.php$ {        
        try_files $uri = 404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass PHP: 9000;
        fastcgi_index index.php;
        включить fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;

        
        установить $METHODS 'GET, POST, OPTIONS, HEAD';
        установить $HEADERS 'Авторизация, происхождение, X-Requested-With, Content-Type, Accept';
        
        
        если ($request_method = POST){
          add_header 'Access-Control-Allow-Origin' 'https://www.mysite.local';
          add_header 'Access-Control-Allow-Credentials' 'true';
        }

    }
    
}

сервер {
    слушать 80;
    имя_сервера http.backend.mysite.local;
    вернуть 301 https://backend.mysite.local$request_uri;

}

сервер {
    слушать 80;
    имя_сервера nginx;
    вернуть 301 https://backend.mysite.local$request_uri;

}



сервер {
    слушать 80;
    имя_сервера www.mysite.local;
    вернуть 301 https://www.mysite.local$request_uri;
}

сервер {
    слушать 80;
    имя_сервера mysite.local;
    вернуть 301 https://www.mysite.local$request_uri;
}

сервер {
    слушать 443 ssl;
    имя_сервера mysite.local;
    ssl_certificate /etc/ssl/mysite.local.crt;
    ssl_certificate_key /etc/ssl/mysite.local.key;
    вернуть 301 https://www.mysite.local$request_uri;
}


  сервер {   
    слушать 443 ssl;
    имя_сервера www.mysite.local;     
    ssl_certificate /etc/ssl/mysite.local.crt;
    ssl_certificate_key /etc/ssl/mysite.local.key;
    

     место расположения / {      
     прокси_пасс http://узел:3000;
      
    }
  }

Изменить: это докер-compose.yml:

сети:
    мой сайт:
        водитель: мост

Сервисы:
    нгинкс:
        изображение: nginx: стабильный-альпийский
        имя_контейнера: nginx
        порты:
            - "8088:8088"
            - "80:80"  
            - "443:443"          
   
        сети:
            - мой сайт                

    php:        
        строить:
            контекст: ./ларавел
            докерфайл: Докерфайл
        имя_контейнера: php
        порты:
            - "9000:9000"
        сети:
            - мой сайт

    узел:
        строить:
            контекст: ./реагировать
            докерфайл: Докерфайл
        имя_контейнера: реагировать
        
        порты:
            - "3000:3000"       
Michael Hampton avatar
флаг cz
Как вы создавали контейнеры? Покажите соответствующую конфигурацию (например, docker-compose.yml).
Stackerito avatar
флаг in
Спасибо, отредактировал пост, добавил `docker-compose.yml`. Я понял, что, возможно, совершенно неправильно понял всю архитектуру своего приложения. Я смешал имя хоста Windows-машины с внутренними именами контейнеров Docker, и все это перепуталось.
Michael Hampton avatar
флаг cz
Все ли ваши контейнеры действительно готовы? Вы получили ошибку, которую я ожидал бы, если бы контейнер не был запущен.
Stackerito avatar
флаг in
Вы настоящий эксперт, контейнер узла отключился после того, как у меня была ошибка в коде. И правильно ли я сказал в предыдущем комментарии? Что я смешал свое имя хоста с внутренним именем Docker? Может быть, мне следует использовать режим `host` вместо этого в моем случае?
Michael Hampton avatar
флаг cz
Я не использую Docker в Windows, поэтому ничего не могу сказать по этому поводу. Из всех проблем, которые я видел у людей, я, вероятно, не рекомендовал бы его. В любом случае, он не будет развернут в производстве таким образом.
Stackerito avatar
флаг in
Спасибо.так что, если это правильное место, чтобы спросить: в моем случае, когда у меня есть службы Node, Nginx, MySQL и PHP, как бы вы порекомендовали мне разработать мой проект? Непосредственно на Windows (Как я это сделал в первую очередь?). Я хочу, чтобы это было как можно ближе к производству (хорошо ли это?). Я только начал работать с Docker, потому что видел, как на некоторых рабочих местах просят об опыте работы с ним, поэтому мне захотелось научиться.
Michael Hampton avatar
флаг cz
Точнее, напрямую в Linux без посредников типа WSL2, которые время от времени вытворяют странные вещи. Запустите несколько собственных виртуальных машин Linux и поэкспериментируйте.
Stackerito avatar
флаг in
Спасибо. И есть ли правильный способ установить Nginx в Windows? Если нет, я, вероятно, установлю Linux с двойной загрузкой вместе с моей машиной с Windows.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.