Si j'utilise une variable d'environnement dans la configuration nginx et que nginx est configuré pour ne servir que des fichiers statiques (html, js, css - par exemple une application AngularJs), est-il possible d'utiliser la variable d'environnement dans un fichier JS que nginx sert ? Ou est le seul moyen de le faire pour exécuter un serveur non statique, par exemple io.js, php, etc.
De plus, vous ne pouvez pas utiliser les variables d'environnement de manière native dans la configuration de nginx.
Quand je parle de vars d'environnement dans la configuration nginx, je veux dire comme dans cet article: Comment puis-je utiliser les variables d'environnement dans Nginx.conf où elles utilisent env APP_WEB_1_PORT_5000_TCP_ADDR;
et$ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"};
Expliquez exactement votre cas d'utilisation
Mon cas d'utilisation spécifique est que j'ai une application AngularJS propulsée par nginx dans un conteneur Docker. L'application est une "application à page unique" qui utilise une API fonctionnant sur un autre système. Actuellement, je lance un conteneur Docker différent entre la production et la mise en scène, car l'application a une configuration différente, par exemple le code Google-Analtyics. Ces données spécifiques à l'environnement sont conservées dans un config.js
fichier et les valeurs sont actuellement codées en dur, une valeur pour la master
branche dans git et une valeur différente pour la staging
branche. Je souhaite modifier la conception afin de pouvoir utiliser le même conteneur pour la production et la mise en scène. Je veux passer une var ENV dans le conteneur quand je l'exécute ( docker run -e GACODE=UA-12345-6 ...
) et demander à nginx d'utiliser la var ENV (via env GACODE;
et $ENV{"GACODE"}
donc laconfig.js
fichier peut utiliser les codes GoogleAnaltyics qui sont transmis, plutôt que de les coder en dur). Je ne sais pas si c'est possible ou pas (d'où la question;)). L'utilisation de nginx seulement fait de mon conteneur un processus unique, alors que si je dois utiliser io.js, alors j'aurai besoin de plusieurs conteneurs liés et plus de pièces mobiles sont plus complexes).
Réponses:
sous_filtre
Si vous voulez un simple remplacement de chaîne, vous pouvez utiliser sub_filter . Par exemple:
Cependant, il n'est pas possible de lire une variable d'environnement dans nginx config - vous pouvez bien sûr écrire un script pour écrire le fichier de configuration nginx comme vous le souhaitez / pour produire un fichier de configuration valide, puis recharger nginx.
la source
J'ai expérimenté l'utilisation de variables d'environnement sub_filter et nginx mais j'ai conclu que ce n'était pas possible .
Par exemple, cela montre mes expériences et montre que l'utilisation des ENV passés à nginx ne fonctionne pas dans un
server
bloc:où le fichier config.json statique que je sers a diverses chaînes de test comme les suivantes:
Comme @ AD7six l'a mentionné, la façon de procéder est d'avoir un script qui s'exécute avant que nginx ne commence à produire un fichier de configuration valide à partir des espaces réservés. Mais cela soulève la question, si un script va s'exécuter avant le démarrage de nginx, je peux aussi bien définir le contenu de mon
config.json
fichier dans ce script et ne pas m'embêtersub_filter
du tout.la source
sub_filter "example.com" "example.dev";
dans une configuration de développement pour remplacer toutes les références au domaine de production à l'environnement local parce que ces références proviennent de réponses api tierces / code d'application / js / db dumps / etc. - c'est-à-dire que pour nginx, il pourrait être n'importe où dans n'importe quelle réponse html / js / json. +1J'ai cherché à résoudre le même problème que l'OP et ce message est apparu dans la recherche Google, alors j'ai pensé ajouter une solution potentielle.
Cet article décrit comment vous pouvez exposer une variable d'environnement dans la configuration nginx: https://blog.doismellburning.co.uk/environment-variables-in-nginx-config/
Et vous pouvez retourner du contenu sans avoir de fichier dans le système de fichiers: Répondre avec 200 depuis la configuration Nginx sans servir de fichier
En combinant ces deux choses, nous nous retrouvons avec ce qui suit:
Cela a fonctionné pour moi dans un environnement de test. C'est un peu lourd (pas sûr que ce soit mieux que de générer automatiquement un fichier au lancement de Docker qui contient les variables dont vous avez besoin).
J'espère que cela pourra aider.
la source