Se eu usar uma variável de ambiente na configuração do nginx, e o nginx estiver configurado para servir apenas arquivos estáticos (html, js, css - por exemplo, um aplicativo AngularJs), existe alguma maneira de usar a variável de ambiente em um arquivo JS que o nginx serve ? Ou é a única maneira de fazer isso para executar um servidor não estático, por exemplo, io.js, php, etc.
Aliás, você não pode usar variáveis de ambiente nativamente na configuração do nginx.
Quando falo sobre os ambientes de variáveis na configuração do nginx, quero dizer como neste post: Como posso usar variáveis de ambiente no Nginx.conf, onde eles usam env APP_WEB_1_PORT_5000_TCP_ADDR;
e$ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"};
Explique exatamente seu caso de uso
Meu caso de uso específico é que eu tenho um aplicativo AngularJS alimentado por nginx em um contêiner de docker. O aplicativo é um "Aplicativo de página única" que consome uma API em execução em outro sistema completamente. Atualmente, eu executo um contêiner de docker diferente entre produção e armazenamento temporário, porque o aplicativo tem algumas configurações diferentes, por exemplo, o código do Google-Analtyics. Esses dados específicos do ambiente são mantidos em um config.js
arquivo e os valores atualmente são codificados, um valor para a master
ramificação no git e um valor diferente para a staging
ramificação. Quero alterar o design para poder usar o mesmo contêiner para produção e preparação. Quero passar uma ENV var para o contêiner quando executá-la ( docker run -e GACODE=UA-12345-6 ...
) e o nginx usa a ENV var (via env GACODE;
e $ENV{"GACODE"}
assim oconfig.js
O arquivo pode usar os códigos do GoogleAnaltyics que são passados, em vez de codificá-los). Não sei se isso é possível ou não (daí a questão;)). Usar apenas o nginx torna meu contêiner um processo único, enquanto que, se eu precisar usar o io.js., precisarei de vários contêineres vinculados e mais partes móveis serão mais complexas).
Respostas:
sub_filter
Se você deseja uma substituição simples de cadeia, use sub_filter . Por exemplo:
Entretanto , não é possível ler uma variável de ambiente no nginx config - você pode, naturalmente, escrever o arquivo de configuração nginx da maneira que precisar / desejar produzir um arquivo de configuração válido e recarregar o nginx.
fonte
Eu experimentei usar variáveis de ambiente sub_filter e nginx, mas concluí que não é possível .
Por exemplo, isso mostra minhas experiências e mostra que o uso de ENVs passados para o nginx não funciona em um
server
bloco:onde o arquivo estático config.json que estou servindo possui várias cadeias de teste como as seguintes:
Como o @ AD7six mencionado, o caminho a seguir é ter um script que seja executado antes do nginx começar a produzir um arquivo de configuração válido a partir de espaços reservados. Mas isso levanta a questão: se um script for executado antes do nginx iniciar, é melhor definir o conteúdo do meu
config.json
arquivo nesse script e não me incomodarsub_filter
.fonte
sub_filter "example.com" "example.dev";
em uma configuração de desenvolvimento para substituir toda e qualquer referência ao domínio de produção no ambiente local, porque essas referências são provenientes de respostas de API de terceiros / código do aplicativo / js / db dumps / etc. - ou seja, para o nginx, pode estar em qualquer lugar em qualquer resposta html / js / json. +1Eu estive procurando resolver o mesmo problema que o OP e esta postagem surgiu na pesquisa do Google, então pensei em adicionar uma solução em potencial.
Esta publicação descreve como você pode expor uma variável de ambiente na configuração do nginx: https://blog.doismellburning.co.uk/environment-variables-in-nginx-config/
E você pode retornar conteúdo sem ter um arquivo no sistema de arquivos: responda com 200 da configuração do Nginx sem exibir um arquivo
Juntando essas duas coisas, terminamos com o seguinte:
Isso funcionou para mim em um ambiente de teste. É um pouco complicado (não é certo que seja melhor do que gerar automaticamente um arquivo na inicialização do Docker que contenha os vários itens necessários).
Espero que ajude.
fonte