angularjs - Angular2应用的配置——nginx和docker

标签 angularjs angular nginx docker

我有一个位于某些服务器上的 REST 后端服务和以 Angular 制作的前端应用程序。 我正在使用 Angular CLI 来构建应用程序。我的后端服务器的位置位于环境文件中。 我的应用程序的要求是我提供两个 docker 图像。一个是我的后端服务器(Java Spring Boot 应用程序),第二个是使用 ng build myApp 命令构建的静态 html。然后我将内容 od dist 目录复制到 docker 图像上的适当目录,如此处所示 Nginx docker image .

问题是,后端和前端可能在不同的服务器上工作。有什么方法可以配置我的前端应用程序,以便我可以根据容器的启动更改后端服务器位置?

最佳答案

我知道这是一个老问题,但我遇到了完全相同的问题,我花了一段时间才解决。希望这对那些来自搜索引擎的人有所帮助。

我找到了 2 个解决方案(我最终选择了第二个)。两者都允许您在 docker 中使用环境变量来配置您的 API URL。

解决方案 1(“客户端”):env.js Assets + sed

我们的想法是让您的 Angular 客户端从您的 HTTP 服务器加载一个 env.js 文件。此 env.js 将包含 API URL,并且可以在容器启动时对其进行修改。这就是您在问题评论中讨论的内容。

在你的 Angular 应用程序 Assets 文件夹中添加一个 env.js(src/assets 对于我使用 angular-cli):

var MY_APP_ENV = {
  apiUrl: 'http://localhost:9400',
}

在您的 index.html 中,您将加载您的环境:

<head>
  <meta charset="utf-8">
  <base href="/">
  <script src="env.js"></script>
</head>

在您的 environment.ts 中,您可以使用变量:

declare var MY_APP_ENV: any;

export const environment = {
  production: false,
  apiUrl: MY_APP_ENV.apiUrl
};

在您的 NGINX Dockerfile 中执行:

FROM nginx:1.11-alpine

COPY tmp/dist /usr/share/nginx/html
COPY run.sh /run.sh

CMD ["sh", "/run.sh"]

run.sh 脚本是 sed 魔术发生的地方:

#!/bin/sh

# API
/bin/sed -i "s|http://localhost:9400|${MY_API_URL}|" /usr/share/nginx/html/env.js

nginx -g 'daemon off;'

在您的 Angular 服务中,使用 environment.apiUrl 连接到 API(您需要导入环境,请参阅 Angular 2 文档)。

方案二(纯服务器端):nginx proxy config + envsubst

我对之前的解决方案不满意,因为 API URL 需要从主机的 Angular 来看,它不能在我的 docker-compose 设置中使用另一个容器主机名。

于是我想:很多人用NGINX做代理服务器,为什么不这样把/api代理到我的另一个容器呢。

docker 文件:

FROM nginx:1.11-alpine

COPY tmp/dist /usr/share/nginx/html
COPY frontend.conf.template /etc/nginx/conf.d/frontend.conf.template
COPY run.sh /run.sh

CMD ["/bin/sh", "/run.sh"]

前端.conf.模板:

server {
    listen       80;
    server_name  myserver;

    # API Server
    location /api/ {
        proxy_pass ${MY_API_URL}/;
    }

    # Main
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri$args $uri$args/ /index.html;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

运行.sh:

#!/bin/sh

# Substitute env vars
envsubst '$MY_API_URL' \
< /etc/nginx/conf.d/frontend.conf.template \
> /etc/nginx/conf.d/default.conf

# Start server
nginx -g 'daemon off;'

envsubt 允许您使用类似 shell 的语法替换字符串中的环境变量。

然后使用 /api/xyz 从 Angular 应用程序连接到 API。

我认为第二种解决方案更简洁。 API URL 可以是 docker-compose 设置中的 API docker 容器名称,这很好。客户不参与,它是透明的。但是,这取决于 NGINX。

关于angularjs - Angular2应用的配置——nginx和docker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40598876/

相关文章:

javascript - AngularJS Promise Chaining 中返回相同的数据

javascript - 使用 AngularJS 加载非常大的图像

javascript - 如何传递后端数据以显示为多选下拉项(附Jsfiddle)

django - nginx - 多个 django 应用程序相同的域不同的网址

django - Nginx 静态文件不加载 Django

angularjs - 从一组编辑器中删除 tinymce 4 编辑器

javascript - 当使用 angular2 在 table1 中单击元素时,如何聚焦 table2 中的元素

javascript - 为什么Windows.dispatchEvent()在Angular 9的app.component.ts上不起作用

javascript - 在 Angular app.component.ts 中使用 jQuery 代码

ruby-on-rails - 使用 SSL 的 Nginx 后面的 Rails 5 中的 InvalidAuthenticityToken