Добавление прослушивателей обратного прокси-сервера nginx останавливает весь трафик на порт 80
У меня есть два работающих док-контейнера:
- Контейнер Docker под управлением Nginx, который обслуживает файлы ресурсов приложения Angular, которые были скопированы в образ Docker при сборке Docker
- Контейнер 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, если это возможно для вас. Если нет, я, вероятно, не понимаю ваши намерения:)
Я смог, наконец, выяснить, что здесь происходит, сначала я разбил проблему еще дальше, и вы можете найти мое решение здесь.