【问题标题】:Http failure response for (unknown url) - Angular Universal on Docker(未知 url)的 Http 失败响应 - Docker 上的 Angular Universal
【发布时间】:2018-06-30 03:32:24
【问题描述】:

我有以下设置:

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`

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

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

当 api 请求来自浏览器时,它工作得非常好。但是当请求从my_client容器发起服务器端时,我得到一个很长(很多行)的错误,但它的要点(以及我可以通过搜索谷歌找到的常用文本)是:@ 987654336@。但是,我能找到的其他问题并没有回答我的问题。它们要么不是服务器渲染的,要么是提到 CORS 或无法访问互联网的容器。

我确实允许来自我的 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,不知道这是否意味着什么)。我不知道为什么会这样,虽然用http://... ping 不会,但我不能在我的Angular 应用程序中用api.my-app.local 替换http://api.my-app.local,因为那样它会向自己发出请求,比如:@ 987654345@.

最后,如果我 ping http://api.my-app.local,那么我会得到 unknown host。不知道为什么,就容器而言,http://api.my-app.local 在互联网上,对吧?我的意思是,我希望事情能以同样的方式工作,无论是谁/什么/从哪里尝试访问,例如:

  1. 某人/某物访问 url http://api.my-app.local(可以是我/浏览器,可以是容器,随便)
  2. 最后,它被主机(在我的情况下是 Windows)捕获,主机文件将其重定向到 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 配置 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 server-side-rendering


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!我已经尝试了第一个选项,但没有帮助。没有尝试过第二个,但我想它不会有不同的结果。我不知道我还缺少什么,我一定还缺少一些东西。我已编辑问题以添加 docker-compose.yml 文件,并添加了示例中的第一个选项。
    • 我刚刚测试了使用您的 docker-compose.yml 设置 docker 环境。它似乎正在工作。您可以尝试运行docker-compose up --build 吗?之后,查看从客户端 ping api 是否有效:docker exec -t my_client ping api.my-app.local
    • ping 可以了,现在它不再说127.0.0.1,它找到了一个实际的IP。但是,当应用程序运行时,当节点服务器发出对 api 的请求时,我得到了同样的错误。 http://api.my-app.localapi.my-app.local 有什么不同吗?因为ping http://api.my-app.local 确实说unknown host。我的 docker for windows 版本可能有问题吗?或者我的 Windows PC 出现了一些奇怪的问题......我什至尝试将 docker 重置为出厂默认设置,但没有帮助。
    • 您已经抽出时间来提供帮助,但我在这里创建了一个 repo github.com/MrCroft/docker-app。我只是好奇它是否对你有用,只要你有时间。我已将 pm2 命令从 docker-compose 移动到 Dockerfile,注释了 my_client 服务中的 volumes 部分,我在容器中执行了 npm install,所以只需要运行 docker-compose up(构建将花点时间),当然也可以将127.0.0.1 my-app.local api.my-app.local添加到主机操作系统的hosts文件中。
    • 哦……我现在明白了。问题是别名应该在您的 nginx 容器中,而不是在 my_api 容器中。那是因为node容器不监听http/https端口,而nginx监听了,然后将请求重定向到对应的node容器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多