我有两个正在运行的docker容器:
- 运行 Nginx 的 Docker 容器,用于提供在 docker build 中复制到 Docker 镜像中的 Angular 应用资源文件
- 一个 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
我终于弄清楚了这里发生了什么,我首先进一步分解了问题,你可以找到我的解决方案这里