我可以在nginx提供的静态文件中使用nginx环境variables吗?

如果我在nginxconfiguration中使用了一个环境variables,并且nginx被configuration为仅提供静态文件(html,js,css – 例如AngularJs应用程序),那么我有什么办法可以在nginx提供的JS文件中使用环境variables? 或者是执行此操作来运行非静态服务器的唯一方法,例如io.js,php等


顺便说一句,你不能在nginx的configuration中使用环境variables。

当我在nginxconfiguration中讨论环境variables时,我的意思就像在这篇文章中: 我如何在Nginx.conf中使用env APP_WEB_1_PORT_5000_TCP_ADDR; 环境variables env APP_WEB_1_PORT_5000_TCP_ADDR;$ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"};


解释你的用例

我的具体用例是在Docker容器中有一个由nginx驱动的AngularJS应用程序。 该应用程序是一个“单页应用程序”,它使用完全在另一个系统上运行的API。 目前我在生产和分期之间运行不同的docker容器,因为应用程序有一些不同的configuration,例如Google-Analtyics代码。 这个特定于环境的数据保存在一个config.js文件中,并且这些值当前是硬编码的,git中的master分支的一个值,以及staging分支的值不同。 我想改变devise,所以我可以使用相同的容器来生产和舞台。 我想运行一个ENV var到容器中( docker run -e GACODE=UA-12345-6 ... )并让nginx使用ENV var(通过env GACODE;$ENV{"GACODE"}所以config.js文件可以使用传入的GoogleAnaltyics代码,而不是对它们进行硬编码)。 我不知道这是否可能(因此这个问题;))。 只使用nginx使我的容器是一个单一的进程,而如果我必须使用io.js,那么我将需要多个链接的容器和更多的移动部分是更复杂的)。

sub_filter

如果你想要一个简单的stringreplace,你可以使用sub_filter 。 例如:

 server { sub_filter "REPLACE_THIS" "with this"; sub_filter_once off; # Don't stop at the first match, replace all of them sub_filter_types "text/javascript" "application/json"; # Apply to these mime types in addition to text/html # Everything else } 

然而 ,在nginxconfiguration文件中读取环境variables不可能的 – 你当然可以编写nginxconfiguration文件,只要你需要/想要生成一个有效的configuration文件,然后重新加载nginx。

我尝试了使用sub_filter和nginx环境variables,但得出结论, 这是不可能的

例如,这显示了我的实验,并显示使用传递给nginx的ENV在server块中不起作用:

 env TOMTEST1; # OK - makes $ENV{"TOMTEST1"} available but NOT in server block. http { server { # set $TOMTEST1 $ENV{"TOMTEST1"}; # KO - DOES NOT WORK - NGINX WONT START set $TOMTEST2 'tomtest2 Var'; # OK - THIS DOES WORK OK sub_filter 'TOM_TEST2' $TOMTEST2; # OK - but not useful to me. sub_filter 'TOM_TEST3' 'tomtest3 Var'; # OK - but not useful to me. sub_filter_once off; # Don't stop at the first match, replace all of them sub_filter_types "text/javascript" "application/json"; # Apply to these mime types in addition to text/html # Serve static files location / { try_files $uri /index.html =404; } ... 

我正在服务的静态config.json文件有如下所示的各种testingstring:

 { "environment": "local", "test1": "$ENV{"TOMTEST1"}", "test3": "TOM_TEST2", "test4": "TOM_TEST3", } 

正如@ AD7six所提到的,要继续的方法是在nginx开始从占位符生成一个有效的configuration文件之前运行一个脚本。 但是这引出了一个问题,如果一个脚本要在nginx启动之前运行,那么我也可以在那个脚本中设置我的config.json文件的内容,而不用麻烦sub_filter