Nginx: использовать переменные среды

У меня есть следующий сценарий: у меня есть переменная env $SOME_IP и я хочу использовать ее в блоке nginx. Обращаясь к документации nginx, я использую директиву env в файле nginx.conf следующим образом:

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

env SOME_IP;

Теперь я хочу использовать переменную для proxy_pass. Я попробовал следующее:

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

Но я получаю сообщение об ошибке: nginx: [emerg] unknown "some_ip" variable

Ответ 1

Правильное использование будет $SOME_IP_from_env, но переменные окружения, установленные из nginx.conf, не могут использоваться в блоках сервера, местоположения или http.

Вы можете использовать переменные окружения, если используете пакет openresty, в который входит Lua.

Ответ 2

Вы можете получить доступ к переменным через модули - я нашел варианты сделать это с Lua и Perl.

Написал об этом в блоге моей компании:

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

TL; DR:

env API_KEY;

А потом:

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"}; }';
      ...
    }
  }
}

ОБНОВЛЕНИЕ: оригинальный блог мертв, изменена ссылка на кеш машинного возврата

Ответ 3

Создайте шаблон вашей конфигурации и примените envsubst к нему при запуске контейнера.

envsubst включен в официальный образ докера NGINX. Поиск Использование переменных среды в конфигурации nginx в Документах Nginx Docker

Использование переменных среды в конфигурации nginx

Изначально nginx не поддерживает переменные окружения внутри большинство блоков конфигурации. Но envsubst может быть использован в качестве обходного пути, если вам нужно динамически сгенерировать вашу конфигурацию nginx перед nginx начинается.

Вот пример использования 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;'"

Файл mysite.template может содержать ссылки на переменные, такие как это:

listen ${NGINX_PORT};