添加反向代理侦听器 nginx 会停止到端口 80 的所有流量

添加反向代理侦听器 nginx 会停止到端口 80 的所有流量

我有两个正在运行的docker容器:

  1. 运行 Nginx 的 Docker 容器,用于提供在 docker build 中复制到 Docker 镜像中的 Angular 应用资源文件
  2. 一个 Docker 容器,它是一个 API,当前在容器内部监听端口 5007,在主机外部监听端口 5007

我正在设置一个暂存环境和以下外部 URL:

  • 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,同时仍然默认为所有我在 Nginx 配置中未明确表示代理的外部 URL/域提供我的 Angular 应用程序文件。

我不想为我的 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 命中。换句话说,当我添加第二个专门在端口 80 上监听 account.staging.mysite.com 的服务器时,原本可以正常工作并响应我的 Angular 应用资源的 app.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 的 Dockerfile,它为我的 Angular 应用程序提供服务,并且希望它也能充当反向代理,你可以看到 Nginx default_server 为我的 Angular 应用程序资源文件提供服务,我在 docker build 上将这些资源文件复制到这个 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"]

该问题是否可能是由于 Angular 应用程序前端 docker 容器的 80:80 绑定造成的?

答案1

您是否在同一台服务器上运行 Docker 和 Nginx?如果是这样,我认为您的端口配置存在冲突。至少 app.staging.mysite.com 的 docker 实例正在使用外部端口 127.0.0.1:80,Nginx 也是如此。然后可能看起来您正在正确连接到 app.staging.mysite.com:80,但您不是通过 Nginx 反向代理连接的,而是直接连接到 docker 实例。尝试将 app.staging.mysite.com 映射到不同的端口,然后是 80,并为其创建上游服务器配置和另一个相关的 Nginx 设置,如果这对您来说是可能的。如果不行,我可能不明白你的意图 :)

答案2

我终于弄清楚了这里发生了什么,我首先进一步分解了问题,你可以找到我的解决方案这里

相关内容