web-dev-qa-db-fra.com

nginx: utiliser des variables d'environnement

J'ai le scénario suivant: J'ai une variable env $SOME_IP défini et souhaitez l'utiliser dans un bloc nginx. Se référant à la documentation nginx J'utilise la directive env dans le nginx.conf fichier comme suit:

user www-data;
worker_processes 4;
pid /run/nginx.pid;

env SOME_IP;

Maintenant, je veux utiliser la variable pour un proxy_pass. Je l'ai essayé comme suit:

location / {
    proxy_pass http://$SOME_IP:8000;
}

Mais je me retrouve avec ce message d'erreur: nginx: [emerg] unknown "some_ip" variable

19
schickling

L'utilisation correcte serait $SOME_IP_from_env, mais les variables d'environnement définies à partir de nginx.conf ne peuvent pas être utilisées dans les blocs serveur, emplacement ou http.

Vous pouvez utiliser des variables d'environnement si vous utilisez bundle openresty , qui inclut Lua.

9
Ben Whaley

Vous pouvez accéder aux variables via des modules - j'ai trouvé des options pour le faire avec Lua et Perl.

A écrit à ce sujet sur le blog de mon entreprise:

https://web.archive.org/web/20170712003702/https://docs.apitools.com/blog/2014/07/02/using-environment-variables-in-nginx-conf.html

Le TL; DR:

env API_KEY;

Puis:

http {
...
  server {
    location / {
      # set var using Lua
      set_by_lua $api_key 'return os.getenv("API_KEY")';

      # set var using Perl
      Perl_set $api_key 'sub { return $ENV{"API_KEY"}; }';
      ...
    }
  }
}

EDIT: le blog d'origine est mort, lien modifié vers le cache de la machine de retour

27
kikito

Créez un modèle de votre configuration et appliquez envsubst dessus au démarrage du conteneur.

envsubst est inclus dans l'image de docker NGINX officielle. Voir sing-environment-variables-in-nginx-configuration

Utilisation de variables d'environnement dans la configuration nginx

Prêt à l'emploi, nginx ne prend pas en charge les variables d'environnement dans la plupart des blocs de configuration. Mais envsubst peut être utilisé comme solution de contournement si vous devez générer votre configuration nginx dynamiquement avant le démarrage de nginx.

Voici un exemple utilisant docker-compose.yml:

web:
  image: nginx
  volumes:
    - ./mysite.template:/etc/nginx/conf.d/mysite.template
  ports:
    - "8080:80"
  environment:
    - NGINX_Host=foobar.com
    - NGINX_PORT=80
  command: /bin/bash -c "envsubst < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"

Le mysite.template le fichier peut alors contenir des références de variables comme ceci:

listen ${NGINX_PORT};

0
Michal Foksa