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