Отказ в соединении при подключении к апстриму - Docker - PullRequest
1 голос
/ 08 марта 2019

Ошибка, которую я получаю:

nginx_prod_vet | 2019/03/07 20:57:11 [ошибка] 6 # 6: * 1 ошибка подключения () (111: соединение отклонено) при подключении к восходящему каналу, клиенту: 172.23.0.1, сервер:, запрос: "GET / backend HTTP / 1.1", восходящий поток: "http://172.23.0.2:81/backend", хост:" localhost: 90 "

Моя цель - использовать nginx в качестве обратного прокси-сервера для доставки файлов внешнего интерфейса и прокси других служб к внешнему интерфейсу, поэтому будет доступен localhost: 90 / backend Был вызван вызов localhost: 90 /.

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

Вот наиболее важные файлы:

# docker-compose.yml

version: '3'

services:

  nginx:
    container_name: nginx_prod_vet
    build:
      context: .
      dockerfile: nginx/prod/Dockerfile
    ports:
      - "90:80"
    volumes:
      - ./nginx/prod/prod.conf:/etc/nginx/nginx.conf:ro
    networks:
      - main
    depends_on:
      - backend

  backend:
    container_name: backend_prod_vet
    build:
        context: .
        dockerfile: apache/Dockerfile
    ports:
      - "81:81"
    networks:
      - main

networks:
  main:
    driver: bridge

# apache/Dockerfile
FROM httpd:2.4.32-alpine

RUN apk update; \
    apk upgrade;

# Copy apache vhost file to proxy php requests to php-fpm container
COPY apache/apache.conf /usr/local/apache2/conf/apache.conf
RUN echo "Include /usr/local/apache2/conf/apache.conf" \
>> /usr/local/apache2/conf/httpd.conf

# apache/apache.conf
ServerName localhost

LoadModule deflate_module /usr/local/apache2/modules/mod_deflate.so
LoadModule proxy_module /usr/local/apache2/modules/mod_proxy.so
LoadModule proxy_fcgi_module /usr/local/apache2/modules/mod_proxy_fcgi.so

<VirtualHost *:81>
    # Proxy .php requests to port 9000 of the php-fpm container
    # ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/$1
    DocumentRoot /var/www/html/
    <Directory /var/www/html/>
        # DirectoryIndex index.php
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    # Send apache logs to stdout and stderr
    CustomLog /proc/self/fd/1 common
    ErrorLog /proc/self/fd/2
</VirtualHost>

# nginx/prod/prod.conf
user  nginx;
worker_processes  1;

events {
  worker_connections  1024;
}

http {
  include /etc/nginx/mime.types;
  client_max_body_size 100m;

  upstream backend {
    server backend:81;
  }


  server {
    listen 80;
    charset utf-8;

    root /dist/;
    index index.html;

    location /backend {
      proxy_redirect off;
      proxy_pass http://backend;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
    }


  }
}

# nginx/prod/Dockerfile
# build stage
FROM node:10.14.2-jessie as build-stage
WORKDIR /app/
COPY frontend/package.json /app/
RUN npm cache verify
RUN npm install
COPY frontend /app/
RUN npm run build

# production stage
FROM nginx:1.13.12-alpine as production-stage
COPY nginx/prod/prod.conf /etc/nginx/nginx.conf
COPY --from=build-stage /app/dist /dist/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Edit:

docker-compose exec backend netstat -lnpt

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.11:38317        0.0.0.0:*               LISTEN      -
tcp        0      0 :::80                   :::*                    LISTEN      1/httpd

docker-compose exec nginx sh -c "nc backend 81 && echo open || echo closed"

closed.

1 Ответ

2 голосов
/ 08 марта 2019

docker-compose exec backend netstat -lnpt показывает нам, что веб-сервер httpd для службы backend прослушивает порт 80, а не 81.

Так что, вероятно, ваш Dockerfile apache/Dockerfile неверен относительно того, как онпытается предоставить свою пользовательскую конфигурацию httpd apache/apache.conf.

Для дальнейшего изучения:

  • Убедитесь, что основное содержимое apache conf соответствует вашим ожиданиям: docker-compose exec backend cat /usr/local/apache2/conf/httpd.conf
  • Проверьте журнал службы бэкэнда: docker-compose logs backend

Таким образом, вы поймете, что в главном конфигурационном файле apache отсутствует директива Listen 81.Вы можете исправить это в вашем apache/Dockerfile файле:

# apache/Dockerfile
FROM httpd:2.4.32-alpine

RUN apk update; \
    apk upgrade;

# Copy apache vhost file to proxy php requests to php-fpm container
COPY apache/apache.conf /usr/local/apache2/conf/apache.conf

RUN echo "Listen 81" >> /usr/local/apache2/conf/httpd.conf
RUN echo "Include /usr/local/apache2/conf/apache.conf" >> /usr/local/apache2/conf/httpd.conf

Почему ваш внутренний контейнер прослушивает порт 81?

Он не добавляет никакого значения для создания ваших разных контейнеровоткрыть разные порты.Каждый контейнер имеет свой собственный IP-адрес, поэтому нет необходимости избегать конфликтов портов между службами, определенными в проекте docker-compose.

...