Выражение не оценивается в httpd.conf - PullRequest
0 голосов
/ 09 мая 2018

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

Define PROJECT_ROOT osenv('APACHE_PROJECT_ROOT') LogMessage ${PROJECT_ROOT}

Правая часть выражения Define обрабатывается как стрела и не оценивается. Результат - "osenv ('APACHE_PROJECT_ROOT')" вместо самой переменной среды. Есть предложения?

edit: некоторые дальнейшие разъяснения, поскольку в этом посте нет ожидаемых мнений или ответов. Я хочу иметь среду development, staging и production.

На моем development компьютере я ожидаю запуска нескольких проектов apache, каждый с файлом настроек virtualhost. Правильный путь к каталогу и параметры virtualhost могут быть получены из переменных среды (ОС) APACHE_PROJECT_ROOT и APACHE_ACTIVE_PROJECT.

Среда staging и production будет работать аналогично (возможно, упрощенно, поскольку на каплю приходится только один проект. Мне кажется здравым смыслом иметь один файл http.conf, где переменные среды ОС определяют, что сайты загружены. Хотя я не нашел никаких ресурсов по этому вопросу.

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Define не задокументировано, что оно принимает выражение в качестве аргумента, поэтому неудивительно, что значение заканчивается указанным литеральным значением.

Вы можете использовать собственные переменные среды непосредственно как значения с синтаксисом $ {VAR} в большинстве контекстов, потому что это обрабатывается, почему конфигурация читается. Это разрешает любые альтернативные пути к DocumentRoot или каталогам журналов, но не дает вам условий.

Наиболее разумный способ сделать условия во время разбора файла конфигурации - передать -D, чтобы указать, в какой среде вы находитесь, а затем изменить используемые директивы.

0 голосов
/ 21 мая 2018

Вы можете использовать ключевое слово If, см. http://httpd.apache.org/docs/2.4/mod/core.html#if

Что-то вроде:

<If "osenv('APACHE_ACTIVE_PROJECT') == 'staging'">
   LogMessage "this is staging"
</If>

(у вас также есть Elseif и Else операторы)

И то же самое для других сред. Конечно, вы бы помещали другие директивы в каждое выражение If. Вы даже можете использовать SetEnv для позиционирования переменной окружения Apache, которую вы можете использовать в других директивах (директивы перезаписи, директивы журналирования и т. Д.)

Полные примеры If функций на http://httpd.apache.org/docs/2.4/expr.html

Я также рекомендовал бы помещать каждый блок конфигурации для каждой среды в определенные файлы, а затем использовать директивы Include.

0 голосов
/ 15 мая 2018

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

<VirtualHost *:80>
    DocumentRoot "/var/www/html/project1/develop"
    ServerName project1-develop
    ErrorLog "logs/project1-develop-error.log"
    CustomLog "logs/project1-develop-access.log" common
    # other configuration settings...
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/var/www/html/project1/staging"
    ServerName project1-staging
    ErrorLog "logs/project1-staging-error.log"
    CustomLog "logs/project1-staging-access.log" common
    # other configuration settings...
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/var/www/html/project1/production"
    ServerName project1-production
    ErrorLog "logs/project1-production-error.log"
    CustomLog "logs/project1-production-access.log" common
    # other configuration settings...
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/var/www/html/project2/develop"
    ServerName project2-develop
    ErrorLog "logs/project2-develop-error.log"
    CustomLog "logs/project2-develop-access.log" common
    # other configuration settings...
</VirtualHost>

# repeat for as many hosts as necessary...

Затем в /etc/hosts я определяю записи DNS для тех имен хостов, которые указывают на localhost (где я использую apache, вы просто используете любой сервер, который используете):

127.0.0.1    project1-develop
127.0.0.1    project1-staging
127.0.0.1    project1-production
127.0.0.1    project2-develop
# repeat as necessary

И теперь я могу получить доступ к каждой из моих сред, например, http://project1-develop, http://project1-staging и т. Д.

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

...