【发布时间】:2018-06-30 03:32:24
【问题描述】:
我有以下设置:
docker-compose.yml 中有四个服务:my_nginx、my_client、my_api 和 my_db。
- 我使用
my_nginx作为代理通行证到达my_client:8000和my_api:8001(两者都是 Node.js)。 -
my_client是具有服务器端的 Angular 应用程序 渲染。 -
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 在互联网上,对吧?我的意思是,我希望事情能以同样的方式工作,无论是谁/什么/从哪里尝试访问,例如:
- 某人/某物访问 url
http://api.my-app.local(可以是我/浏览器,可以是容器,随便) - 最后,它被主机(在我的情况下是 Windows)捕获,主机文件将其重定向到
127.0.0.1 - 然后到达
my_nginx容器 - 识别服务器名称
api.my-app.local - 并将其代理到
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_name 和proxy_pass 指令之外,客户端也是一样的。我不知道proxy_http_version、proxy_set_header 和proxy_cache_bypass 是干什么用的,我只是从网上的示例中复制了配置。
【问题讨论】:
标签: angular docker universal nginx-reverse-proxy server-side-rendering