Назад | Перейти на главную страницу

Когда вы запускаете сервер (например, Debian), как можно сделать переменные среды постоянными и доступными для PHP?

Что я сейчас делаю на уровне ОС:

После инициализации перейдите к пользователю, которому требуется переменная, и экспортируйте переменные, затем также укажите их установку в профиле - или в / etc / environment (Debian) в случае root, чтобы учесть постоянство

Я часто делаю это с помощью "echo >>" или "sed" непосредственно в конфигурационные файлы или в каталог, в котором основная конфигурация просматривает настройки.

Для меня:

export MYVAR=foobar
echo "export MYVAR=foobar" >> /home/bradchesney79/.profile

Верхний делает переменную среды доступной при выполнении, но она исчезнет при выходе из системы. Поместив команду в ваш .profile, вы создадите ее при входе в систему.

sed -i s/export MYVAR=.*/export MYVAR=barfoo/g /home/bradchesney79/.profile 

Для тебя:

sudo -u brianchesney80 export HISVAR=something 
sudo -u brianchesney80 echo "HISVAR=something" >> /home/brianchesney80/.profile

Для каждого:

((Not fully certain how to export globally just yet))
sudo echo "OURVAR=fffoooooobbbaaarrr" >> /etc/environment

Я не люблю перезагружаться. Но я не вижу способа обойти это, чтобы включить переменные среды, установленные здесь для всех.

Итак, хотите увидеть переменные среды для другого пользователя?

sudo -u www-data printenv PATH
sudo -u www-data env

Недостаточно красивого краткого списка, предоставленного env? Пытаться:

set > /tmp/setOutput.tmp

Переменные среды (Ubuntu)

Переменные среды и оболочки

Делаем переменные среды доступными для PHP:

Стоит отметить, что переменные среды естественным образом не доступны демонизируемым службам, поскольку они не запускаются традиционно как дочерний процесс, который наследует переменные среды родительского объекта. Имейте в виду, что это барьер безопасности, установленный по очень веской причине (то, что переменные среды будут совместно использоваться без разбора, не обязательно хорошо). Моя цель - выборочно сделать доступными определенные проверяемые значения переменных среды, чтобы моя система вела себя по-другому или с правильными учетными данными, установленными и доступными для приложения в переменной - все это при создании экземпляра с помощью сценария подготовки, а некоторые из них сохраняются между перезагрузками.

Apache

Пример:

export PATH="/var/www:/var/www/html"

Аккуратный фрагмент, с его помощью вы можете проверить действительность вашего файла envvars.

sh -n /etc/apache2/envvars && echo Syntax OK || echo FAIL

В / etc / apache2 (Debian) были некоторые настройки, которые, я думаю, можно было бы использовать в блоке virtualhost ...

Пример:

SetEnv SPECIAL_PATH /foo/bin

Вышеупомянутое в блоке конфигурации виртуального хоста сервера сделает настраиваемую переменную среды доступной через $ _SERVER или аналогичное соглашение где-то, как упоминалось TMR, высмеивая меня в комментариях.

Apache httpd mod_env

В другом месте файла httpd.conf и аналогичных файлов или .htaccess вы можете установить переменные среды с помощью правил перезаписи.

RewriteRule someurl - [E=dbpass:swordfish]

Злоупотребление Apache Rewrite ... Если нужно, я думаю, ты должен. Мне вообще не нравятся файлы .htaccess, я тоже не фанат переписывания.

NGINX

Похоже, вы можете использовать модуль lua NGINX для вставки переменных окружения в сервер. Этот другой модуль тоже нужен.

При этом основное внимание уделяется PHP - если вы используете nginx с PHP - возможно, посмотрите раздел PHP ниже, который может быть лучшим решением.

env PATH;
http {
    ...
    server {
        location /path {
            set_by_lua $path 'return os.getenv("PATH")';
            ...
        }
    }
}

Цепочка в списке рассылки NGINX, открывающая возможность

Запись в блоге об использовании lua полностью

PHP

get-cfg-var () позволит вам получать значения, установленные разработчиками проекта PHP, и произвольные значения, которые вы установили. Стоит проявлять осторожность, чтобы таким образом именовать эти переменные в глобальной области видимости, и обязательно прочитайте примечания, внесенные пользователем, чтобы знать о некоторых автоматических магических манипуляциях.

Пример:

php.ini

environment_type=dev
environment_host=AWS

рандо-скрипт-что угодно.php

get_cfg_var('environment_type') // returns 'dev'
get_cfg_var('environment_host') // returns 'AWS'

В файле конфигурации пула php-fpm, приведенное ниже, сделает настраиваемую переменную среды доступной через $ _SERVER или аналогичное соглашение где-то, как упоминалось TMR, высмеивая меня в комментариях.

Пример:

мой-pool.conf

env[FOO] = bar

рандо-скрипт-что угодно.php

echo $_SERVER['FOO']; // returns 'bar'

Резюме

Редактирует:

tl; dr - удалена спорная идея о предоставлении ресурсов, сводящаяся к одной краткой теме вопроса

Я удалил упоминание об обнаружении вещей о хосте и инициализации сервера на основе результатов. Настоятельно высказывалось предположение, что такой способ инициализации сервера может быть плохой стратегией и что инструменты инициализации предназначены для объявления настроек вместо того, чтобы целевой хост узнавал что-то о себе при создании экземпляра и реагировал соответствующим образом. - А главное, второстепенно по отношению к поставленной задаче. Я хочу узнать больше о хранении данных, которые могут измениться в переменных среды, и это здорово.

- Специально упомянутое AnrDaemon нарушает принцип наименьшего удивления.

Чтобы предоставить вашему приложению информацию о среде, как насчет чего-то вроде dotenv?

phpdotenv читает из файла конфигурации для заполнения PHP $_ENV и $_SERVER переменные, чтобы вы могли получать отдельные ключи API или другую информацию о конфигурации для каждого сервера, вне контроля версий, не занимаясь настройкой самого веб-сервера.

Судя по заданному вопросу, единственный возможный ответ - «не делай этого».

Сайт не должен ни в чем «разбираться», он должен работать.

Это работа сценария развертывания для настройки среды и настройки веб-сайта в соответствии с ней.

Как отметил @TML, для этого существует множество инструментов оркестрации. Солонка, марионетка, ... назовите ваш выбор.

Что касается меня, в конце концов, я размещаю один сайт на хосте с использованием платформы AWS.

Скорее всего, когда я развертываю новый код или конфигурации хоста, я собираюсь создать новый образ сервера, отключить свой сайт на минуту или две, указать моей группе автомасштабирования использовать новый образ, уничтожить все старые экземпляры и вернуть мой сайт в рабочее состояние, когда будет запущен первый новый экземпляр. Конечно, я все протестировал заранее и уверен, что все будет работать, как планировалось. Если нет, я убью новые экземпляры и заменю их экземплярами из старого образа ...

Итак, мой план по использованию в моем коде правильных значений конфигурации (для учетных данных доступа к базе данных и IP-адресов поддерживающих служб в качестве примеров) через переменные среды будет не таким, как я предполагал.

Мой сценарий подготовки установит переменные среды для других вещей, которые могут их использовать. Для PHP на этом сервере с одним сайтом я буду добавлять свои собственные произвольные пары переменных ключ = значение, как показано ниже.

get-cfg-var () позволит вам получать значения, установленные разработчиками проекта PHP, и произвольные значения, которые вы установили. Стоит проявлять осторожность, чтобы таким образом именовать эти переменные в глобальной области видимости, и обязательно прочитайте примечания, внесенные пользователем, чтобы знать о некоторых автоматических магических манипуляциях.

Пример:

php.ini

environment_type=dev
environment_host=AWS

рандо-скрипт-что угодно.php

get_cfg_var('environment_type') // returns 'dev'
get_cfg_var('environment_host') // returns 'AWS'

Спасибо всем, кто нашел время, чтобы сделать меня умнее, и я вырезал / вставил то, что узнал, здесь, чтобы сэкономить следующему чмо и немного времени.