一千萬個為什麽

搜索

Docker容器的Nginx反向代理設置問題



我有兩個運行的docker容器:

  1. 運行Nginx的Docker容器,用於提供已在docker build上復制到Docker鏡像的Angular應用程序資源文件
  2. 一個Docker容器,它是當前正在容器內部端口5007上偵聽的api,另一個是在主機外部偵聽5007

我正在設置臨時環境和以下外部網址:

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

app.staging.mysite.com點擊端口80並響應Angular應用程序資源沒問題。

現在我希望獲取 account.staging.mysite.com 外部API URL請求,以便在端口5007上偵聽我的API Docker容器。來自 account.staging.mysite.com 的請求將會擊中主機的端口80。

Nginx會收到 account.staging.mysite.com 端口80請求,並將它們代理到Docker容器 127.0.0.1:5007 ,同時仍然服務於我的Angular應用文件默認情況下,我的Nginx配置中沒有明確表示代理的所有外部URL /域。

我不想使用我的Angular應用程序,而是希望使用Nginx將請求轉發到端口5007,以便我的Account 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命中。換句話說,當我添加專門為帳戶偵聽端口80的第二臺服務器時,正在運行並響應我的Angular應用程序資源的 app.staging.mysite.com 不再有效。 staging.mysite.com 。

所以真的這個問題並沒有太多關於Docker容器,這實際上是關於Nginx配置。雖然我不完全確定我的Docker容器可以排除在問題的一部分之外。所以這是 account.staging.mysite.com 的docker-compose.yml:

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

這是app.staging.mysite.com的docker-compose.yml:

version: '3'

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

這是我的Nginx Docker文件,它為我的Angular應用程序提供服務,並且希望它也可以充當反向代理,你可以看到Nginx default_server服務器是我在Docker build上復制到這個Docker鏡像的Angular app資源文件:

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"]

這個問題可能是因為Angular app前端docker容器的80:80綁定?

轉載註明原文: Docker容器的Nginx反向代理設置問題

一共有 1 個回答:

感謝這裏問題和答案,我能夠意識到我遇到了兩個問題:

  1. 容器有不同的默認Docker網絡,因為我使用兩個不同的docker-compose.yml文件,我設想我的Ngnix代理完全獨立於我的任何API容器,包括docker-compose,更多關於下面的問題
  2. 第二個問題就是當我嘗試代理到127.0.0.1:5023時,它是Ngnix容器內的localhost,而不是Nginx代理容器之外的網絡

所以被創建的不同的默認網絡搬運工,構成了我的Nginx的代理泊塢窗容器和我的API泊塢窗容器中,因為我會哄兩個不同的碼頭工人,compose.yml文件。這是因為我有詹金斯建立了很多API微服務,因此具有獨立的碼頭工人,撰寫文件,我需要一個Nginx的代理端口80上的請求轉發到各個微服務。

為了測試這個,為容器,API和Nginx代理創建了一個docker-compose.yml:

version: '3'

services:
  reverseproxy:
    build: 
      context: ./
      dockerfile: docker/nginxproxy/docker/Dockerfile
    image: tsl.devops.reverseproxy.image
    container_name: tsl.devops.reverseproxy.container
    ports:
      - "80:80"
  apistaging:
    build: 
      context: ./
      dockerfile: docker/staging/Dockerfile
    image: tsl.api.example.image
    container_name: tsl.api.example.container
    ports:
      - "5023:5023"
    environment: 
      ASPNETCORE_URLS: http://+:5023

是的還有一個問題,代理傳遞給http //:127.0.0.1:5023,該轉發仍然在Nginx Docker容器中,並且從未發現在Docker主機上運行的API,我只需要使用docker-compose。要獲取它的yml服務名稱:

upstream accountstaging {
    server apistaging:5023;
}

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;
    }
}