在nginx中部署我的ember应用程序的docker镜像的最佳做法是什么?rootURL可能在环境之间有所不同?我的方案如下:
/assets/etc
和nginx代理通过的/api/v1/etc
上的REST api serializers/application.js
的命名空间设置为api/v1
。以上内容适用于我的本地开发码头引擎,测试和系统测试环境,其中网址为<domain>/index.html
和<domain>/api/v1/myrestendpoint
。
不幸的是,我们的生产和UAT基础设施不同,因为我们有一个子域名frontend.domain.com
,它使用负载均衡器根据域后面的路径代理对后面服务的请求,例如frontend.domain.com/customer1
所以要点击nginx余烬资产服务器,网址为frontend.domain.com/customer1/index.html
。路由适用于该页面,但是预先构建的ember应用程序和返回的资产引用了从/assets
而不是/customer1/assets
加载其他资产,因此我们得到404并且在ember数据REST的情况下拨打503。
我的工作是使用nginx中的sub_filter模块更新路径,例如
location / {
sub_filter_types *;
sub_filter 'assets' 'customer1/assets';
sub_filter '%22rootURL%22%3A%22/%22' '%22rootURL%22%3A%22/customer1/%22';
sub_filter 'rootURL:"/"' 'rootURL:"/customer1/"';
sub_filter_once off;
try_files $uri /index.html =404;
}
修复了css和js资产的路径,更新了ember ENV中的rootURL属性,并对埋在ember app js中的rootURL做了同样的操作。这似乎有效,但它不是最好的方法。
另一个选项可能是在ember config/environment.js
中执行某些操作并为不同的部署环境构建,但这会违反我们的公司策略,即同一个docker镜像通过测试到生产。当我们将customer2路径作为url的一部分时,这肯定无济于事。
有人可以建议解决方案吗?
我遇到的另一个问题是Chrome在使用构建生成的完整性属性更改index.html中的路径后拒绝加载我的JS资产,因此我必须设置integrity=""
,这也不是很好。