Добавление прослушивателей обратного прокси-сервера nginx останавливает весь трафик на порт 80

У меня есть два работающих док-контейнера:

  1. Контейнер Docker под управлением Nginx, который обслуживает файлы ресурсов приложения Angular, которые были скопированы в образ Docker при сборке Docker
  2. Контейнер Docker, представляющий собой API, который в текущий момент прослушивает порт 5007 внутри контейнера и 5007 снаружи на хост-компьютере.

Я настраиваю промежуточную среду и следующие внешние URL:

  • app.staging.mysite.com
  • account.staging.mysite.com

app.staging.mysite.com подключается к порту 80 и отвечает с ресурсами приложения Angular без проблем.

Теперь я хочу получить внешний URL-адрес account.staging.mysite.com для запроса на мой контейнер API Docker, прослушивающий порт 5007. Запросы с account.staging.mysite.com попадут на порт 80 хост-компьютера.

Nginx будет получать запросы к account.staging.mysite.com через порт 80 и перенаправлять их в Docker-контейнер 127.0.0.1:5007, в то же время по-прежнему обслуживая файл приложения Angular по умолчанию для всех внешних URL-адресов / доменов, которые я явно не выражаю для прокси в моем конфиге Nginx.

Вместо того, чтобы обслуживать мое приложение Angular, я хотел бы использовать Nginx для пересылки запроса на порт 5007, чтобы мой API учетной записи мог ответить. Поэтому я изменил мою конфигурацию Nginx следующим образом:

upstream accountstaging{
    server 0.0.0.0:5007
}


server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;

    # Main
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri$args $uri$args/ /index.html;
    }


    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

server {

    listen 80;
    server_name account.staging.mysite.com;

    location / {
        proxy_pass         http://accountstaging;
        proxy_redirect     off;
        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_set_header   X-Forwarded-Host $server_name;
    }
}

Что меня действительно удивляет, так это то, что теперь нет обращений по умолчанию к серверу. Другими словами, app.staging.mysite.com, который работал и отвечал с помощью ресурсов моего приложения Angular, больше не работает, когда я добавил второй сервер, прослушивающий порт 80 специально для account.staging.mysite.com.

Так что на самом деле этот вопрос не столько о контейнерах Docker, сколько о конфигурации Nginx. Хотя я не совсем уверен, что мои контейнеры Docker могут быть исключены из проблемы. Итак, вот мой docker-compose.yml для account.staging.mysite.com:

version: '3'

services:
  apistaging:
    build: 
      context: ./
      dockerfile: docker/staging/Dockerfile
    image: tsl.api.account.image
    container_name: tsl.api.account.container
    ports:
      - "5007:5007"
    environment: 
      ASPNETCORE_URLS: http://+:5007

А вот мой docker-compose.yml для app.staging.mysite.com:

version: '3'

services:
  frontend:
    build: 
      context: ./
      dockerfile: docker/Dockerfile
    image: tsl.web.frontend.image
    container_name: tsl.web.frontend.container
    ports:
      - "80:80"

Вот мой Dockerfile для Nginx, который обслуживает мое приложение Angular и, будем надеяться, будет действовать и как обратный прокси-сервер. Вы можете видеть, что Nginx default_server обслуживает файлы ресурсов моего приложения Angular, которые я скопировал в образ Docker при сборке Docker:

FROM centos:7
MAINTAINER Brian Ogden

# Not currently being used but may come in handy
ARG ENVIRONMENT
ENV NODE_VERSION 6.11.1

RUN yum -y update && \
    yum clean all && \
    yum -y install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm \
    yum -y makecache && \
    yum -y install nginx-1.12.0 wget

# Cleanup some default NGINX configuration files we don’t need
RUN rm /etc/nginx/conf.d/default.conf

#############################################
# NodeJs Install
#############################################

#Download NodeJs package
RUN wget -q -O - https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz \
    | tar --strip-components=1 -xzf - -C /usr/local

# https://stackoverflow.com/a/35774741/1258525
# use changes to package.json to force Docker not to use the cache
# when we change our application's nodejs dependencies:
COPY ./package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir /app && cp -a /tmp/node_modules /app/

WORKDIR /app
COPY . /app

RUN npm run build-$ENVIRONMENT

RUN cd /app && cp -a dist/* /usr/share/nginx/html
COPY ./docker/conf/frontend.conf /etc/nginx/conf.d/frontend.conf
COPY ./docker/conf/nginx.conf /etc/nginx/nginx.conf


EXPOSE 80

CMD ["nginx"]

Возможно, эта проблема связана с привязкой 80:80 к контейнеру внешнего интерфейса приложения Angular?

2 ответа

Вы используете Docker и Nginx на одном сервере? Если это так, я думаю, что у вас есть конфликт в конфигурации порта. По крайней мере, экземпляр докера для app.staging.mysite.com использует внешний порт 127.0.0.1:80 и то же самое с Nginx. Тогда может показаться, что вы подключаетесь к app.staging.mysite.com:80 правильно, но вы подключаетесь не через обратный прокси-сервер Nginx, а напрямую к экземпляру Docker. Попробуйте сопоставить app.staging.mysite.com с другим портом, отличным от 80, и создать конфигурацию вышестоящего сервера и другие связанные с ней настройки Nginx, если это возможно для вас. Если нет, я, вероятно, не понимаю ваши намерения:)

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

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