Разрешено ли перезаписывать переменные директивы Define в Apache?

Вопрос или проблема

Предназначены ли переменные директивы Define Apache httpd для перезаписи?

Например,

Define SITE example1.com

<VirtualHost *:80>
    ServerName ${SITE}
</VirtualHost>

Define SITE example2.com

<VirtualHost *:80>
    ServerName ${SITE}
</VirtualHost>

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

Ищу канонический ответ, если возможно. Вот еще одна ссылка на более редкую документацию по mod_define.

Конечно, они могут быть перезаписаны, как содержимое любой глобальной переменной. Из-за своего глобального охвата вам просто нужно следить за порядком определения и использования. Например, -DSITE=bla это как иметь соответствующее утверждение Define в начале вашей конфигурации httpd – в этом нет ничего плохого.

Это может работать, но похоже, что вы устанавливаете переменную $SITE, чтобы повторно использовать конфигурацию, верно? Я считаю, что лучший способ сделать это в Apache – просто использовать макросы.

<Macro makesite $SITE>
  <VirtualHost *:80>
    ServerName $SITE
  </VirtualHost>
</Macro>

Use makeproxy example1.com
Use makeproxy example2.com
Use makeproxy example3.com

(Примечание: если у вас еще не включен mod_macro, просто выполните a2enmod macro от имени root на вашем сервере.)


Более реальный пример

Выше приведено все, что вам нужно для конкретного вопроса выше, но может быть полезно увидеть более реальный пример. Наш веб-серверу нужно было указать несколько сайтов WordPress, которые все отправлялись на обратный прокси, используя одинаковый код, за исключением $SITE. Система управления конфигурацией, такая как Ansible, была бы избыточной для этого проекта. Я мог бы использовать виртуальные хосты для http на порту 80, но для https на порту 443 Apache должен был знать все серверные сертификаты при запуске. Этот макрос решил проблему:

<Macro makeproxy $SITE>
  <VirtualHost *:443>

    ServerName $SITE
    ServerAlias $SITE.local
    ServerAdmin [email protected]
    ProxyPass / http://webappliance.local/
    ProxyPassReverse / http://webappliance.local/
    ProxyPreserveHost On

    Include /etc/letsencrypt/options-ssl-apache.conf
    SSLCertificateFile /etc/letsencrypt/live/$SITE/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/$SITE/privkey.pem

  </VirtualHost>
</Macro>

Use makeproxy example1.com
Use makeproxy example2.com
Use makeproxy example3.com

Ответ или решение

Да, в Apache HTTP Server директивы Define могут быть перезаписаны. Это позволяет вам задать переменные, которые можно изменять в процессе конфигурации вашего сервера. В вашем примере переменная SITE устанавливается дважды с разными значениями: сначала example1.com, затем example2.com. Это приводит к тому, что последнее значение, example2.com, сохраняется и используется в последующих директивах.

Технические аспекты:

  1. Перезапись переменных: В Apache переменные Define ведут себя как глобальные переменные. Важно учитывать порядок их объявления, так как последняя присвоенная переменная будет использоваться в конфигурациях ниже по коду. Это не является ошибкой или плохой практикой, если вы уверены в порядке их применения.

  2. Значение порядка: Поскольку Apache парсит конфигурации сверху вниз, последнее объявление переменной Define перекрывает предыдущие. Поэтому важно следить за расположением вашего кода.

  3. Использование макросов: Как заметили другие эксперты, вместо использования перезаписываемых переменных Define, эффективно использовать mod_macro. Это позволяет создать шаблон, который вы можете использовать несколько раз с разными параметрами, что улучшает ясность и повторное использование кода:

<Macro makesite $SITE>
  <VirtualHost *:80>
    ServerName $SITE
  </VirtualHost>
</Macro>

Use makesite example1.com
Use makesite example2.com

Для включения mod_macro, выполните команду a2enmod macro на сервере.

Поиск оптимального решения

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

Заключение

Использование директивы Define в Apache для перезаписи значений возможно и может быть применено в различных сценариях. Тем не менее, для сложных конфигураций рекомендуется использовать mod_macro. Это обеспечивает лучшую структуру и гибкость конфигураций сервера.

Оцените материал
Добавить комментарий

Капча загружается...