Nginx反向代理设置Docker容器的问题解决方案

45次阅读
没有评论

问题描述

有两个正在运行的Docker容器:
1. 一个运行Nginx的Docker容器,用于提供在docker build过程中复制到Docker镜像中的Angular应用程序资源文件。
2. 一个运行API的Docker容器,该容器在容器内部监听端口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应用程序文件。

用户修改了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;
    }
}

用户还提供了两个docker-compose.yml文件,一个用于account.staging.mysite.com,一个用于app.staging.mysite.com。

用户怀疑问题可能是因为Angular应用程序前端Docker容器绑定了80:80端口。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据用户提供的信息,我们可以得出以下解决方案:

  1. 首先,我们需要创建一个docker-compose.yml文件,用于同时启动Nginx代理容器和API容器。以下是示例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
  1. 在Nginx配置中,我们需要将代理目标更改为Docker容器的服务名称。以下是修改后的Nginx配置:
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;
    }
}

请注意,我们将proxy_pass的值更改为http://accountstaging,其中accountstaging是Docker容器的服务名称。

方案2

根据用户提供的信息,我们可以得出以下解决方案:

  1. 首先,我们需要创建一个docker-compose.yml文件,用于同时启动Nginx代理容器和API容器。以下是示例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
  1. 在Nginx配置中,我们需要将代理目标更改为Docker容器的IP地址和端口号。以下是修改后的Nginx配置:
upstream accountstaging {
    server 127.0.0.1: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;
    }
}

请注意,我们将proxy_pass的值更改为http://127.0.0.1:5023,其中127.0.0.1是Nginx容器内部的IP地址。

方案3

根据用户提供的信息,我们可以得出以下解决方案:

  1. 首先,我们需要创建一个docker-compose.yml文件,用于同时启动Nginx代理容器和API容器。以下是示例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
  1. 在Nginx配置中,我们需要将代理目标更改为Docker容器的服务名称,并将proxy_pass的值更改为http://accountstaging。以下是修改后的Nginx配置:
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;
    }
}

请注意,我们将proxy_pass的值更改为http://accountstaging,其中accountstaging是Docker容器的服务名称。

以上是解决方案的几个示例,根据用户的具体情况选择适合的方案。请确保在应用解决方案之前备份相关文件和配置。

正文完