(未知网址)的Http失败响应 - Docker上的Angular Universal

问题描述 投票:0回答:1

我有以下设置:

docker-compose.yml中的四项服务:my_nginxmy_clientmy_apimy_db

  1. 我使用my_nginx作为代理传递来达到my_client:8000my_api:8001(都是Node.js)。
  2. my_client是具有服务器端呈现的Angular应用程序。
  3. my_api是一个节点应用程序,它从my_db获取数据。

然后,在我的windows hosts文件中,我有与my_nginx配置服务器块中定义的相同的主机名:

`127.0.0.1 my-app.local api.my-app.local`

所以可以通过主机名访问它们。

接下来,在我的角度应用程序中,我在每个环境文件中定义了api url,因此对于本地开发环境,它是http://api.my-app.local

当api请求来自浏览器时,它工作得很好。但是当服务器端启动请求时,从my_client容器中,我得到一个很长(很多行)的错误,但它的要点(以及我可以通过搜索Google找到它的常用文本)是:message: 'Http failure response for (unknown url): 0 Unknown Error'。但是,我能找到的其他问题并没有回答我的问题。它们要么不是服务器呈现的,要么提及CORS或没有Internet访问的容器。

我允许任何客户来自我的api:res.setHeader('Access-Control-Allow-Origin', '*');,CORS不是问题。此外,如果我用http://api.my-app.local替换http://some-real-website.com,那么请求有效,它通过,我只是没有收到适当的数据,因为它不是我的api,但重点是我的容器能够访问互联网。跳进my_client容器和ping api.my-app.local工程(显示127.0.0.1,不知道这是否意味着什么)。我不知道为什么这样有效,虽然ping用http://...不行,但我不能用我的Angular应用程序中的http://api.my-app.local替换api.my-app.local,因为那样它会向自己提出请求,例如:http://my-app.local/api.my-app.local

最后,如果我ping http://api.my-app.local然后我得到unknown host。不知道为什么,就容器而言,http://api.my-app.local在互联网上,对吗?我的意思是,无论是谁/什么/在哪里尝试访问,我都希望事情能够发挥作用,例如:

  1. 某人/某物访问网址http://api.my-app.local(可以是我/浏览器,可以是容器,无论如何)
  2. 最后,这是由主机捕获的(在我的情况下是Windows),hosts文件将其重定向到127.0.0.1
  3. 然后到达my_nginx容器
  4. 它识别服务器名称api.my-app.local
  5. 并代理它到my_api容器。

应该很简单。

编辑:

Docker版本:17.12.0-ce-win47(15139)稳定

docker-compose.yml

version: '3.4'

services:
  my_nginx:
    container_name: my_nginx
    build:
      context: ./nginx
    image: my_nginx
    ports:
      - '80:80'
      - '443:443' # SSL (not used on 'my-app.local')
    links:
      - my_api
      - my_client

  my_api:
    container_name: my_api
    build:
      context: ./node_api
    image: my_api
    ports:
      - '8001:8001'
    volumes:
      - ./node_api/app:/var/www/api.my-app.com
      - /var/www/api.my-app.com/node_modules
    links:
      - my_db
    depends_on:
      - my_db
    networks:
      default:
        aliases:
          - api.my-app.local
    tty: true
    # command: ["pm2-docker", "pm2.config.json"] < moved to Dockerfile

  my_client:
    container_name: my_client
    build:
      context: ./node_client
    image: my_client
    ports:
      - '8000:8000'
    volumes:
      - ./node_client/app:/var/www/my-app.com
      - /var/www/my-app.com/node_modules # Inside the container, use the node_modules installed there.
    links:
      - my_api
    tty: true
    command: ["pm2-docker", "pm2.config.json"]

  my_db:
    container_name: my_db
    build:
      context: ./mysql
    image: my_db
    restart: always
    ports:
      - '3306:3306'
    volumes:
      - './_space/mysql:/var/lib/mysql'

Nginx config api服务器块:

server {
    listen 80;
    server_name api.my-app.local;

    charset     utf-8;
    client_max_body_size 4096M;

    location / {
        proxy_pass http://my_api:8001;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

    location ~ /\.ht {
        deny all;
    }
}

当然,除了server_nameproxy_pass指令外,客户端的指令是相同的。我不知道proxy_http_versionproxy_set_headerproxy_cache_bypass是什么,我只是从一个在线示例中复制了配置。

angular docker universal nginx-reverse-proxy ssr
1个回答
2
投票

在docker-compose.yml中,您需要声明my_nginx的别名并链接my_client:

my_nginx:
    networks:
        default:
            aliases:
                - api.my-app.local

my_client:
    links:
        - my_nginx
© www.soinside.com 2019 - 2024. All rights reserved.