(111: Соединение отклонено) при подключении к восходящему каналу — многоконтейнерное приложение NGINX/Docker

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

Что я пытаюсь сделать: У меня запущено многоконтейнерное приложение, использующее Docker: Docker-контейнер

Это мой nginx.conf:

events{}

http {
    include /etc/nginx/mime.types;

    server {
        listen 0.0.0.0:443 ssl;

        ssl_certificate /usr/share/nginx/custom-cert/bag-sai-server-cert.pem;
        ssl_certificate_key /usr/share/nginx/custom-cert/bag-sai-key.key;

        server_name <ip_addr>;

        index /prompt_ui_with_seperated_file_upload.html;

        location /ai {
                proxy_pass http://localhost:8000;
                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;
        }

        location / {
                try_files $uri $uri/ =404;
                root /usr/share/nginx/html;
        }
    }
}

Это мой docker-compose.yml:

services:
  ki-backend:
    platform: linux/amd64
    image: ki-backend:latest
    pull_policy: if_not_present
    container_name: ki-backend
    ports:
      - "8080:8000"
    expose:
      - 8080
    networks:
      - comms

  ki-ui:
    platform: linux/amd64
    image: ki-ui:latest
    pull_policy: if_not_present
    container_name: ki-ui
    ports:
      - "443:443"
    networks:
      - comms

networks:
    comms:
      driver: bridge

При попытке подключиться к URL: 443 я без проблем получаю доступ к интерфейсу, но как только я хочу получить доступ к URL-адресу с /ai/.. (путь к серверу, также указанный в местоположении /ai), я получаю 502 Bad Gateway от nginx.

Плохой шлюз

В журналах докера я вижу следующую ошибку:

2024/08/22 13:11:27 [error] 7#7: *1 connect() failed (111: Connection refused) while connecting to upstream, 
client: <client_ip>, server: <server_ip>, 
request: "GET /ai/com>"

докер PS

Не знаю, что делать. Насколько я могу судить, все конфигурации верны, но я просто не могу заставить их работать. Я размещаю это на виртуальной машине Azure и установил сертификаты для SSL. :443 вручную, если это имеет значение.

Любая помощь будет принята с благодарностью!

502 обычно означает, что сервер назначения недоступен. Где работает ваш сервер nginx? на виртуальной машине или внутри контейнера приложения.

abdurrehman 23.08.2024 12:38
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
1
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

2024/08/22 13:11:27 [ошибка] 7#7: *1 Connect() не удалось (111: Соединение отклонено) при подключении к восходящему каналу, клиент: <client_ip>, сервер: <server_ip>, запрос: «GET /ai/com>»

  • Основная проблема здесь заключается в том, что NGINX внутри контейнера Docker пытается подключиться к localhost:8000 (или ::1:8000 для IPv6), что относится к самому контейнеру NGINX, а не к серверной службе (ki-backend).

Именно по этой причине вы получаете ошибку 502 Bad Gateway с connection refused — NGINX не может подключиться к внутренней службе localhost:8000, поскольку этот порт не доступен контейнеру NGINX.

  • Обновите конфигурацию NGINX, чтобы ссылаться на службу ki-backend по псевдониму сети Docker вместо localhost.

nginx.conf:

events {}

http {
    include /etc/nginx/mime.types;

    server {
        listen 0.0.0.0:443 ssl;

        ssl_certificate /usr/share/nginx/custom-cert/bag-sai-server-cert.pem;
        ssl_certificate_key /usr/share/nginx/custom-cert/bag-sai-key.key;

        server_name <ip_addr>;

        index /prompt_ui_with_seperated_file_upload.html;

        location /ai {
            # Use service name instead of localhost
            proxy_pass http://ki-backend:8000;
            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;
        }

        location / {
            try_files $uri $uri/ =404;
            root /usr/share/nginx/html;
        }
    }
}
  • Измените директиву proxy_pass в файле nginx.conf, чтобы использовать имя службы ki-backend и ее внутренний сетевой порт Docker (8000). Внутренний DNS Docker преобразует имя службы в правильный IP-адрес в сети Docker.

После изменения файла nginx.conf необходимо пересобрать контейнер NGINX, чтобы изменения вступили в силу.

журналы nginx:

2024/08/23 15:32:10 [info] 7#7: *1 client <client_ip> connected to 443 port
2024/08/23 15:32:10 [info] 7#7: *1 SSL handshake successful
2024/08/23 15:32:10 [info] 7#7: *1 SSL certificate verify ok
2024/08/23 15:32:10 [info] 7#7: *1 [lua] access_by_lua:12: client: <client_ip>, server: <server_ip>, request: "GET /ai/com>"
2024/08/23 15:32:10 [info] 7#7: *1 proxy_pass to http://ki-backend:8000/ai/chatGPT succeeded
2024/08/23 15:32:10 [info] 7#7: *1 received response from upstream, client: <client_ip>, server: <server_ip>, request: "GET /ai/com>"
2024/08/23 15:32:10 [info] 7#7: *1 HTTP/1.1 200 OK
2024/08/23 15:32:10 [info] 7#7: *1 <response_headers_and_details>

Журналы внутренней службы (ki-backend):

Серверная служба получила запрос от NGINX и успешно обработала его, вернув ответ 200 OK.

Да, исправил мою проблему! Большое спасибо!!

Jan Etschel 24.08.2024 16:42

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