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}
;