#nginx #docker-compose
#nginx #docker-compose
Вопрос:
Я запускаю nodejs на localhost, в то время как nginx работает как контейнер docker с помощью docker-compose
Я не могу установить какие-либо подключения к приложению node js:
nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
server {
listen 80;
server_name licensing.cluster-ops.co;
location / {
proxy_pass http://md_license_server:3005;
proxy_set_header Host $host;
}
}
}
docker-compose.yml
version: "3.3"
services:
md_license_server:
image: root/md-license-server
expose:
- 3005
ports:
- 3005:3005
nginx:
image: nginx:latest
container_name: nginx
ports:
- 80:80
- 443:443
volumes:
- /etc/ssl/certs:/etc/ssl/certs
- /etc/ssl/private:/etc/ssl/private
- /root/docker/nginx.conf:/etc/nginx/nginx.conf
Я перепробовал там все.
extra_hosts: — «host.docker.internal: 127.0.0.1»
^ это не сработает.
Приложение узла отлично работает на localhost.. Я попытался выполнить некоторые вызовы curl, и ответ был в порядке.
Это сообщение об ошибке, которое я получаю от docker:
2021/12/06 14:29:06 [error] 24#24: *3 connect() failed (111: Connection refused)
while connecting to upstream, client: 139.59.147.204, server:
localhost, request: "GET /ping HTTP/1.1", upstream: "http://172.19.0.2:3005
/ping", host:...
Похоже, что «172.19.0.2:3005» — это либо IP-адрес службы md_license.
Выполняется
docker-compose exec md_license_server curl http://localhost:3005/ping
возвращает true
это означает, что сервер узла работает внутри контейнера.
Я чувствую, что это что-то о nginx.
Ответ №1:
Скорее всего, у вас есть перекрытие диапазона IP между сетью docker и хост-сетью. Но давайте не будем предполагать, что сейчас :
- Если вы используете Docker для рабочего стола (Windows, Mac), нет необходимости добавлять дополнительные хосты. Напрямую:
upstream backend { server host.docker.internal:3005; }
- Если вы НЕ используете Docker для рабочего стола (Linux), вам необходимо проверить частный IP-адрес вашего хоста
hostname -i
, а затем указать этот частный IP-адрес в конфигурации nginx# assuming that `hostname -i` prints 192.168.x.y upstream backend { server 192.168.x.y:3005; }
Теперь, если вы хотите поместить это динамически, это уже другая тема, но вы можете проверить шаблоны nginx.
Возвращаясь к 1-му предположению: в любом случае, если существует перекрытие между сетью Docker и вашей хост-сетью, маршрутизатор не будет пересылать пакет хосту, и он продолжает находиться внутри сети docker. Итак, давайте проверим:
- Проверьте IP-адрес вашего хоста :
hostname -i
- Проверьте IP-адрес вашего контейнера Docker :
docker-compose exec nginx hostname -i
ЕСЛИ есть перекрытие, вам нужно будет предоставить пользовательскую сеть docker:
services:
nginx:
image: ....
networks:
custom-net: # attach nginx container to that network
ipv4_address: 172.24.0.22 # assign static IP for your container from the network defined below.
networks:
custom-net: # create new docker network
ipam:
config:
- subnet: 172.24.0.0/24 # with explicit CIDR range
Комментарии:
1. я собираюсь попробовать эти изменения конфигурации сейчас. Спасибо
2.docker exec возвращает:
nginx -> 172.19.03
license_server -> 172.19.02
. Для хост-машины:hostname -i -> 127.0.1.1
3. кроме того, при выполнении запроса извне он, похоже, указывает на правильный IP: , запрос: «GET / ping HTTP / 1.1», восходящий поток: «http://:3005/ping
172.19.0.3
» сбой подключения () (111: отказано в подключении) о, подождите .. кажется, он указывает на себя.4. это может быть проблемой с nginx или, может быть, docker перепутывает IP-адреса при каждом перезапуске?
5. Я не могу заставить его работать с вышеуказанным решением; (
Ответ №2:
Это была проблема, вызванная fastify.
Решение можно найти здесь: https://github.com/fastify/fastify/issues/935