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

Совместное использование конфигурации Apache между тестированием и производством

У меня есть личный веб-сайт с немного нетривиальной конфигурацией Apache. Я тестирую изменения на своей персональной машине, прежде чем загружать их на сервер. Путь к файлам на диске и корневой URL-адрес сайта, конечно, различаются между тестовыми и производственными условиями, и они встречаются во многих местах конфигурации (особенно в блоках <Directory> для особых мест, где есть скрипты или нет списка каталогов или ...).

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

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

Это заменяет значения конфигурации на generic.tmpl.conf (это внутренняя конфигурация сайта), затем делает результат доступным как ${conf} для использования в test.tmpl.conf и production.tmpl.conf, которые имеют блок VirtualHost, содержащий ${conf}, файлы журналов и другую информацию, специфичную для хоста.

#!/usr/bin/python

import string
from optparse import OptionParser

# ---

parser = OptionParser()
parser.add_option("--clean", dest="clean", action="store_true", default=False,
                  help="Clean files instead of creating them.")
(options, args) = parser.parse_args()
if len(args) != 0:
  parser.error("No non-option arguments expected.")

# ---

def readconf(name):
  return string.Template(open(name).read())

def writeconf(out, outer, inner, fields):
  outerfields = fields.copy()
  outerfields["conf"] = inner.substitute(fields).replace("\n", "\n\t")
  out.write(outer.substitute(outerfields))
  out.close()

# ---

if options.clean:
  os.remove("production.conf")
  os.remove("test.conf")
else:
  commonconf = readconf("generic.tmpl.conf")
  liveconf = readconf("production.tmpl.conf")
  testconf = readconf("test.tmpl.conf")

  writeconf(open("production.conf", "w"), liveconf, commonconf, {
    # ... configuration values redacted ...
  })

  writeconf(open("test.conf", "w"), testconf, commonconf, {
    # ... configuration values redacted ...
  })

Можно было бы просто настроить некоторые леса с использованием символьных / жестких ссылок, изменить точки монтирования и т. Д., Чтобы пути тестовой среды соответствовали производственной. В зависимости от вашей конкретной настройки это может быть довольно просто, а может быть и уродливым, и сложным.

Чтобы получить доступ к тестовой среде, используйте его IP, или вы можете добавить дополнительный ServerAlias ​​с именем, указывающим на вашу тестовую среду, или вы можете просто настроить одно и то же имя для обеих машин и использовать локальный / etc / hosts для переключения какой из них вы хотите получить доступ.

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

Может у вас есть возможность запустить виртуализированные ....

Вы также должны взглянуть на эти две темы, посвященные управлению версиями и дублированию. конфигурации сервера и перемещение установленных Linux между платформами

Мой собственный ответ: я придумал использовать SetEnv для хранения путей к текущей машине в переменных среды, а затем включить общий файл конфигурации с $ {} везде, где есть что-то специфичное для машины. Но я никогда раньше не пользовался этими средствами, и я не знаю, есть ли какие-то оговорки.

Попробуйте использовать <Location> вместо того <Directory> где возможно, чтобы изменить DocumentRoot охватит большинство ваших изменений. Вероятно, это самый простой способ позаботиться об этом.

В Include директива также может быть вашим другом - вы можете вставить ее в <Directory> или <Location> block, чтобы включить части конфигурации, которые не будут меняться между машинами.

Это немного больше похоже на взлом, но вы также можете использовать DirectoryMatch чтобы совместить ваши тестовые и производственные каталоги в одном разделе.