Назад | Перейти на главную страницу

добавление обратных прослушивателей прокси nginx останавливает весь трафик на порт 80

У меня есть два запущенных контейнера докеров:

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

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

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

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

Nginx получит запросы на порт 80 account.staging.mysite.com и проксирует их в контейнер 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;
    }
}

Что меня действительно удивляет, так это то, что теперь нет обращений к default_server. Другими словами, 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 при сборке докера:

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?

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

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