Ответ 1
TL;DRУкажите глобальные envvars, которые вы ожидаете определить при загрузке системы (например,
PATH
) в/etc/default/nginx
. Используйте что-то вроде dotenv правильно и напишите конфигурацию, специфичную для вашего приложения, в текстовом файле, который не был отмечен. Переменные окружения довольно злые вообще.
Я чувствовал, что этот заслуживает довольно продолжительного ответа, поскольку переменные окружения вызвали повторяющиеся проблемы для меня в течение последних нескольких месяцев.
Сохранение конфигурации в качестве переменных окружения является одним из правил, которые 12-факторное приложение позволяет писать масштабируемые веб-приложения. Они хороши, потому что они позволяют гибко отделять конфигурацию от вашего кода. Тем не менее, проблема с ними заключается в том, что мы обычно сталкиваемся с ними, когда мы export MYVAR=myvalue
или устанавливаем их в наших ~/.pam_environment
или ~/.bashrc
, , их область - это наш текущий сеанс терминала.
Это вызывает проблемы, когда мы начинаем использовать такие решения, как Phusion Passenger, чтобы запускать наши приложения при загрузке системы - их сценарии запуска не заботятся о средах оболочки пользователя. Они также не заботятся о глобальном /etc/environment
, по-видимому, что и вызвало мои проблемы с PATH
undefined.
Phusion Passenger фактически имеет некоторую документацию по чтобы глобальные переменные среды сохранялись:
Если вы установили Nginx через пакеты Debian или Ubuntu, вы можете определить переменные среды в
/etc/default/nginx
. Это оболочка script, поэтому вы должны использовать синтаксис экспортаFOO=bar
.
Итак, установив PATH
envvar в /etc/default/nginx
, я мог бы решить эту проблему. Но у меня все еще были проблемы с другими переменными среды - мне пришлось установить их в моей конфигурации nginx, чтобы они перешли в мое приложение node. Мне было ясно, что это не правильный способ сделать это.
В этот момент я уже использовал dotenv, но я неправильно понял его цель. Я проверил файл .env
и подумал об этом как о способе предоставления значений по умолчанию для envvars, которые будут переопределены средой по мере необходимости. Это не то, как сами авторы предполагали использовать этот модуль:
Мы настоятельно рекомендуем не передавать ваш .env файл в систему контроля версий. Он должен включать только такие значения среды, как пароли базы данных или ключи API.
Мне стало ясно, что люди часто не определяют envvars для своих приложений в реальной среде. Я нашел статью Питера Лиона, которая предлагает хранить конфигурацию в текстовом файле, а не в envvars, и что когда она щелкнула для меня.
Моим окончательным решением было разогнать мой файл .env
и написать конкретное для каждой среды. Я оставил .env.template
в своем репо в качестве ссылки на то, какую конфигурацию мое приложение ожидало определить во время выполнения.